diff --git a/.eslintignore b/.eslintignore
new file mode 100755
index 0000000..a637125
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,3 @@
+js/*
+acanio-viewer/*
+node_modules/*
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100755
index 0000000..9635118
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,18 @@
+module.exports = {
+ globals: {
+ "t": true,
+ "n": true,
+ "OC": true,
+ "OCA": true,
+ "Files": true,
+ "FileList": true,
+ "XMLHttpRequest": true,
+ "window": true,
+ "navigator": true,
+ "document": true,
+ "history": true
+ },
+ extends: [
+ '@nextcloud',
+ ]
+}
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index e2031f9..3fd63fc 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -18,9 +18,9 @@ jobs:
# do not stop on another job's failure
fail-fast: false
matrix:
- php-versions: ['7.4']
+ php-versions: ['8.2']
databases: ['oci']
- server-versions: ['stable21']
+ server-versions: ['stable28']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
@@ -31,39 +31,34 @@ jobs:
- "1521:1521"
steps:
- - name: Use Node 12
- uses: actions/setup-node@v1
+ - name: Use Node 20
+ uses: actions/setup-node@v4
with:
- node-version: 12
+ node-version: 20
- name: Checkout server
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
with:
repository: nextcloud/server
+ submodules: 'recursive'
ref: ${{ matrix.server-versions }}
- - name: Checkout submodules
- shell: bash
- run: |
- auth_header="$(git config --local --get http.https://github.com/.extraheader)"
- git submodule sync --recursive
- git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
-
- name: Checkout app
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
with:
+ submodules: 'recursive'
path: apps/${{ env.APP_NAME }}
- - name: Set up PHPUnit and Build
+ - name: Build
working-directory: apps/${{ env.APP_NAME }}
- run: composer i && make
+ run: make
- name: Set up php ${{ matrix.php-versions }}
uses: "shivammathur/setup-php@v2"
with:
php-version: "${{ matrix.php-versions }}"
extensions: mbstring, iconv, fileinfo, intl, oci8
- tools: phpunit:8.5.2
+ tools: phpunit
coverage: none
- name: Set up Nextcloud
@@ -72,7 +67,3 @@ jobs:
./occ maintenance:install --verbose --database=oci --database-name=XE --database-host=127.0.0.1 --database-port=1521 --database-user=autotest --database-pass=owncloud --admin-user admin --admin-pass admin
php -f index.php
./occ app:enable --force ${{ env.APP_NAME }}
-
- - name: PHPUnit
- working-directory: apps/${{ env.APP_NAME }}/tests
- run: phpunit -c phpunit.xml
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 3f374cd..3f1c133 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -15,22 +15,24 @@ jobs:
APP_ID: dicomviewer
runs-on: ubuntu-latest
steps:
- - name: Use Node 12
- uses: actions/setup-node@v1
+ - name: Use Node 20
+ uses: actions/setup-node@v4
with:
- node-version: 12
+ node-version: 20
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
- php-version: '7.4'
+ php-version: '8.2'
extensions: mbstring, intl, sqlite3
ini-values: post_max_size=256M, max_execution_time=180
coverage: xdebug
tools: php-cs-fixer, phpunit
- name: Checkout code
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
+ with:
+ submodules: 'recursive'
- name: Build project
id: build_release
@@ -46,7 +48,7 @@ jobs:
sudo apt install make openssl -y
echo "###### installing nextcloud"
mkdir ~/html
- git clone https://github.com/nextcloud/server.git --recursive --depth 1 -b stable21 ~/html/nextcloud
+ git clone https://github.com/nextcloud/server.git --recursive --depth 1 -b stable28 ~/html/nextcloud
sed -i $'s|if (substr($fullPath, 0, strlen($root) + 1) === $root . \'/\')|if (is_string($root) and substr($fullPath, 0, strlen($root) + 1) === $root . \'/\')|g' ~/html/nextcloud/lib/autoloader.php
cp -r $GITHUB_WORKSPACE ~/html/nextcloud/apps/${APP_ID}
php ~/html/nextcloud/occ maintenance:install --database "sqlite" --admin-user "admin" --admin-pass "password"
diff --git a/.gitignore b/.gitignore
index 9416320..bfa2b43 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,6 @@
node_modules
.npm
npm-debug.log
-package-lock.json
vendor
build
js/
diff --git a/.gitmodules b/.gitmodules
new file mode 100755
index 0000000..d957373
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "acanio-viewer"]
+ path = acanio-viewer
+url=https://github.com/acanio/acanio-viewer.git
diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php
new file mode 100755
index 0000000..c520cd0
--- /dev/null
+++ b/.php-cs-fixer.dist.php
@@ -0,0 +1,18 @@
+getFinder()
+ ->notPath('build')
+ ->notPath('l10n')
+ ->notPath('node_modules')
+ ->notPath('src')
+ ->notPath('vendor')
+ ->in(__DIR__);
+return $config;
diff --git a/.scrutinizer.yml b/.scrutinizer.yml
new file mode 100755
index 0000000..3047eed
--- /dev/null
+++ b/.scrutinizer.yml
@@ -0,0 +1,12 @@
+filter:
+ excluded_paths:
+ - 'acanio-viewer/*'
+ - 'vendor/*'
+ - 'tests/*'
+
+imports:
+ - javascript
+ - php
+
+tools:
+ external_code_coverage: true
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..57e12b0
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at coc@acanio.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/LICENSE b/LICENSE
old mode 100644
new mode 100755
diff --git a/Makefile b/Makefile
index 8de19fa..2a72f35 100644
--- a/Makefile
+++ b/Makefile
@@ -1,34 +1,15 @@
# Makefile for building the project
app_name=dicomviewer
-project_dir=$(CURDIR)
-src_js_dir=$(CURDIR)/src
-build_dir=$(project_dir)/build
appstore_build_dir=/tmp/build
appstore_sign_dir=/tmp/sign
cert_dir=$(HOME)/.nextcloud/certificates
-webpack=node_modules/.bin/webpack
-jssources=$(wildcard js/*) $(wildcard js/*/*) $(wildcard css/*/*) $(wildcard css/*)
-othersources=$(wildcard appinfo/*) $(wildcard css/*/*) $(wildcard controller/*/*) $(wildcard templates/*/*) $(wildcard log/*/*)
+build:
+ npm install
+ npm run build
-all: build
-
-clean:
- rm -rf $(build_dir)
- rm -rf vendor
- rm -rf node_modules
- rm -rf js/vendor
- rm -rf js/node_modules
-
-build: $(jssources)
- cd $(src_js_dir) && yarn install
- cd $(src_js_dir) && yarn lint
- cd $(src_js_dir) && yarn build
-
-appstore: clean build package
-
-package: build $(othersources)
+appstore: build
rm -rf $(appstore_build_dir)
mkdir -p $(appstore_build_dir)
rm -rf $(appstore_sign_dir)
@@ -38,14 +19,24 @@ package: build $(othersources)
--exclude=.idea \
--exclude=.github \
--exclude=.tx \
+ --exclude=acanio-viewer \
+ --exclude=node_modules \
--exclude=src \
--exclude=screenshots \
--exclude=tests \
+ --exclude=.eslintignore \
+ --exclude=.eslintrc.js \
--exclude=.gitignore \
+ --exclude=.gitmodules \
--exclude=.l10nignore \
+ --exclude=.php-cs-fixer.dist.php \
+ --exclude=.scrutinizer.yml \
--exclude=.travis.yml \
- --exclude=Makefile \
+ --exclude=babel.config.js \
--exclude=composer.* \
+ --exclude=Makefile \
+ --exclude=stylelint.config.js \
+ --exclude=webpack.config.js \
../$(app_name) $(appstore_sign_dir)
@if [ -f $(cert_dir)/$(app_name).key ]; then \
sudo chown $(webserveruser) $(appstore_sign_dir)/$(app_name)/appinfo ;\
diff --git a/README.md b/README.md
index 8552f8b..bf6f20c 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,9 @@
# DICOM Viewer
-It is a DICOM viewer which uses [cornerstonejs](https://github.com/cornerstonejs) library to display DICOM files in Nextcloud.
+It is a medical imaging viewer which was built on top of OHIF Viewer v3 for viewing DICOM files in Nextcloud.
+It renders DICOM data sets in 2D, 3D, and reconstructed representations; allows for the manipulation, annotation,
+and serialization of observations; supports internationalization, hotkeys, and many more features.
For more information, see the blog post [Nextcloud in Digital Imaging](https://nextcloud.com/blog/digital-imaging-for-medicine-in-nextcloud/)
@@ -18,9 +20,8 @@ For more information, see the blog post [Nextcloud in Digital Imaging](https://n
### Features
-* **Viewer:** A DICOM viewer which displays images grouped by study and series in selected folders and allows to manipulate images with imaging tools.
-* **DICOM Dump:** A list of DICOM attributes displayed on the sidebar with image thumbnail.
-* **Translation:** The ability to use localized languages. Translators are encouraged to contribute.
+* **DICOM Viewer:** A medical imaging viewer for loading and viewing DICOM files with advanced imaging tools, including MPR, in Nextcloud.
+* **DICOM Sidebar:** A sidebar component for viewing and searching DICOM attributes with an image thumbnail for DICOM files in Nextcloud.
### Quick Start
@@ -32,9 +33,8 @@ On your Nextcloud, simply navigate to Apps > Multimedia > DICOM Viewer, and enab
#### Pre-requisites
-- make
-- [NodeJS](https://nodejs.org)
-- [Nextcloud Server](https://nextcloud.com/install/#instructions-server)
+- [NodeJS 20+](https://nodejs.org)
+- [Nextcloud Server 28+](https://nextcloud.com/install/#instructions-server)
* Docker options including docker-compose is [here](https://github.com/nextcloud/docker) and Docker images are [here](https://hub.docker.com/_/nextcloud/)
* You can easily find VM and other options [here](https://nextcloud.com)
@@ -46,7 +46,7 @@ You can build the source code with the following steps:
2. Change into the directory you have cloned this repository
-3. Run `make` command to build source code
+3. Run `npm run install` command to build source code
4. Enable the DICOM Viewer app in Nextcloud
@@ -57,5 +57,6 @@ Thanks to our all contributors and sponsors!
+
diff --git a/acanio-viewer b/acanio-viewer
new file mode 160000
index 0000000..3a2d36f
--- /dev/null
+++ b/acanio-viewer
@@ -0,0 +1 @@
+Subproject commit 3a2d36f620f2dec93e75cb98700c28878479dcf0
diff --git a/appinfo/app.php b/appinfo/app.php
deleted file mode 100644
index 7e002c4..0000000
--- a/appinfo/app.php
+++ /dev/null
@@ -1,31 +0,0 @@
-getContentSecurityPolicyManager();
-$csp = new \OCP\AppFramework\Http\ContentSecurityPolicy();
-$csp->addAllowedChildSrcDomain("'self' ".$server_name);
-$csp->addAllowedScriptDomain("'self' ".$server_name);
-$csp->addAllowedImageDomain('*');
-$csp->addAllowedFontDomain("'self'");
-$csp->allowEvalScript(false);
-$cspManager->addDefaultPolicy($csp);
diff --git a/appinfo/info.xml b/appinfo/info.xml
index 8cf1529..17d89cf 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -7,7 +7,7 @@
- 1.2.5
+ 2.0.0
agpl
Aysel Afsar
DICOMViewer
@@ -22,7 +22,7 @@ See [README](https://github.com/ayselafsar/dicomviewer) for a list of full featu
https://raw.githubusercontent.com/ayselafsar/dicomviewer/master/screenshots/dump1.png
https://raw.githubusercontent.com/ayselafsar/dicomviewer/master/screenshots/dump2.png
-
+
diff --git a/appinfo/routes.php b/appinfo/routes.php
new file mode 100755
index 0000000..4d5c159
--- /dev/null
+++ b/appinfo/routes.php
@@ -0,0 +1,16 @@
+ [
+ ['name' => 'display#showDICOMViewer', 'url' => '/ncviewer', 'verb' => 'GET'],
+ ['name' => 'display#showDICOMViewerModeViewer', 'url' => '/ncviewer/viewer', 'verb' => 'GET'],
+ ['name' => 'display#showDICOMViewerModeJson', 'url' => '/ncviewer/viewer/dicomjson', 'verb' => 'GET'],
+ ['name' => 'display#getDICOMViewerFile', 'url' => '/ncviewer/{filepath}', 'verb' => 'GET'],
+ ['name' => 'display#getDICOMViewerAsset', 'url' => '/ncviewer/assets/{assetpath}', 'verb' => 'GET'],
+ ['name' => 'display#getDICOMViewerAssetSub', 'url' => '/ncviewer/viewer/assets/{assetpath}', 'verb' => 'GET'],
+ ['name' => 'display#getDICOMJson', 'url' => '/dicomjson', 'verb' => 'GET'],
+ ['name' => 'display#getPublicDICOMJson', 'url' => '/publicdicomjson', 'verb' => 'GET'],
+]];
diff --git a/babel.config.js b/babel.config.js
new file mode 100755
index 0000000..8be4fc3
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,3 @@
+const babelConfig = require('@nextcloud/babel-config')
+
+module.exports = babelConfig
diff --git a/changelog.md b/changelog.md
index 524cb52..1cd4be5 100644
--- a/changelog.md
+++ b/changelog.md
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+## [2.0.0] - 2024-03-18
+
+### Added
+- Support for Nextcloud 28
+- Integrate Acan.io, 1.0.0-beta.0, which is a zero-footprint medical image viewer, built on top of OHIF Viewer v3 provided by the Open Health Imaging Foundation (OHIF). It is capable of loading DICOM images directly from Nextcloud, requiring no additional installation. It facilitates rendering sets in 2D, 3D, and reconstructed representations. It also enables the manipulation, annotation, and serialization of observations for medical images, and supports internationalization, hotkeys, and numerous other features.
+
## [1.2.5] - 2023-10-19
### Added
diff --git a/composer.json b/composer.json
index ae83b4c..fc61a4c 100644
--- a/composer.json
+++ b/composer.json
@@ -1,5 +1,12 @@
{
"name": "ayselafsar/dicomviewer",
+ "config": {
+ "optimize-autoloader": true,
+ "classmap-authoritative": true,
+ "platform": {
+ "php": "7.4"
+ }
+ },
"description": "DICOM viewer on Nextcloud",
"type": "project",
"license": "AGPL",
@@ -8,8 +15,14 @@
"name": "Aysel Afsar"
}
],
- "require": {},
+ "scripts": {
+ "cs:fix": "php-cs-fixer fix",
+ "cs:check": "php-cs-fixer fix --dry-run --diff",
+ "lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l",
+ "test:unit": "phpunit -c tests/phpunit.xml"
+ },
"require-dev": {
- "phpunit/phpunit": ">=7"
+ "nextcloud/coding-standard": "^1.0.0",
+ "phpunit/phpunit": "^9"
}
}
diff --git a/css/annotationDialogs.css b/css/annotationDialogs.css
deleted file mode 100644
index 3a51877..0000000
--- a/css/annotationDialogs.css
+++ /dev/null
@@ -1,40 +0,0 @@
-#AppDicomViewer .annotationDialog {
- border: 1px solid #44626F;
- background: #14202A;
- color: #91B9CD;
- z-index: 1000;
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- margin: auto;
- overflow: hidden;
- padding: 10px;
- width: 300px;
- height: 140px;
- border-radius: 8px;
-}
-
-#AppDicomViewer .annotationDialog h5,
-#AppDicomViewer .annotationDialog label {
- font-weight: 400;
-}
-
-#AppDicomViewer .annotationDialog .annotationTextInputOptions {
- padding: 10px 0;
-}
-
-#AppDicomViewer .annotationDialog .annotationTextInput {
- margin-left: 5px;
-}
-
-#AppDicomViewer .annotationDialog .annotationDialogConfirm,
-#AppDicomViewer .annotationDialog .relabelConfirm,
-#AppDicomViewer .annotationDialog .relabelRemove {
- background-color: #16202b !important;
- color: #ffffff !important;
- border-color: #92b9cc !important;
- border-radius: 3px !important;
- float: right;
-}
diff --git a/css/bootstrap_accordion.css b/css/bootstrap_accordion.css
deleted file mode 100644
index 156ab2c..0000000
--- a/css/bootstrap_accordion.css
+++ /dev/null
@@ -1,293 +0,0 @@
-#viewerMain .fade {
- transition: opacity 0.15s linear;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- #viewerMain .fade {
- transition: none;
- }
-}
-
-#viewerMain .fade:not(.show) {
- opacity: 0;
-}
-
-#viewerMain .collapse:not(.show) {
- display: none;
-}
-
-#viewerMain .collapsing {
- position: relative;
- height: 0;
- overflow: hidden;
- transition: height 0.35s ease;
-}
-
-@media screen and (prefers-reduced-motion: reduce) {
- #viewerMain .collapsing {
- transition: none;
- }
-}
-
-#viewerMain .card {
- position: relative;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
- min-width: 0;
- word-wrap: break-word;
- background-color: transparent;
- background-clip: border-box;
- border: 1px solid rgba(0, 0, 0, 0.125);
- border-radius: 0.25rem;
-}
-
-#viewerMain .card > hr {
- margin-right: 0;
- margin-left: 0;
-}
-
-#viewerMain .card > .list-group:first-child .list-group-item:first-child {
- border-top-left-radius: 0.25rem;
- border-top-right-radius: 0.25rem;
-}
-
-#viewerMain .card > .list-group:last-child .list-group-item:last-child {
- border-bottom-right-radius: 0.25rem;
- border-bottom-left-radius: 0.25rem;
-}
-
-#viewerMain .card-body {
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
-}
-
-#viewerMain .card-title {
- margin-bottom: 0.75rem;
-}
-
-#viewerMain .card-subtitle {
- margin-top: -0.375rem;
- margin-bottom: 0;
-}
-
-#viewerMain .card-text:last-child {
- margin-bottom: 0;
-}
-
-#viewerMain .card-link:hover {
- text-decoration: none;
-}
-
-#viewerMain .card-link + .card-link {
- margin-left: 1.25rem;
-}
-
-#viewerMain .card-header {
- padding: 0.75rem 1.25rem;
- margin-bottom: 0;
- background-color: rgba(0, 0, 0, 0.03);
- border-bottom: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-#viewerMain .card-header:first-child {
- border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
-}
-
-#viewerMain .card-header + .list-group .list-group-item:first-child {
- border-top: 0;
-}
-
-#viewerMain .card-footer {
- padding: 0.75rem 1.25rem;
- background-color: rgba(0, 0, 0, 0.03);
- border-top: 1px solid rgba(0, 0, 0, 0.125);
-}
-
-#viewerMain .card-footer:last-child {
- border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);
-}
-
-#viewerMain .card-header-tabs {
- margin-right: -0.625rem;
- margin-bottom: -0.75rem;
- margin-left: -0.625rem;
- border-bottom: 0;
-}
-
-#viewerMain .card-header-pills {
- margin-right: -0.625rem;
- margin-left: -0.625rem;
-}
-
-#viewerMain .card-img-overlay {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 1.25rem;
-}
-
-#viewerMain .card-img {
- width: 100%;
- border-radius: calc(0.25rem - 1px);
-}
-
-#viewerMain .card-img-top {
- width: 100%;
- border-top-left-radius: calc(0.25rem - 1px);
- border-top-right-radius: calc(0.25rem - 1px);
-}
-
-#viewerMain .card-img-bottom {
- width: 100%;
- border-bottom-right-radius: calc(0.25rem - 1px);
- border-bottom-left-radius: calc(0.25rem - 1px);
-}
-
-#viewerMain .card-deck {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-
-#viewerMain .card-deck .card {
- margin-bottom: 15px;
-}
-
-@media (min-width: 576px) {
- #viewerMain .card-deck {
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- margin-right: -15px;
- margin-left: -15px;
- }
- #viewerMain .card-deck .card {
- display: -ms-flexbox;
- display: flex;
- -ms-flex: 1 0 0%;
- flex: 1 0 0%;
- -ms-flex-direction: column;
- flex-direction: column;
- margin-right: 15px;
- margin-bottom: 0;
- margin-left: 15px;
- }
-}
-
-#viewerMain .card-group {
- display: -ms-flexbox;
- display: flex;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-
-#viewerMain .card-group > .card {
- margin-bottom: 15px;
-}
-
-@media (min-width: 576px) {
- #viewerMain .card-group {
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- }
- #viewerMain .card-group > .card {
- -ms-flex: 1 0 0%;
- flex: 1 0 0%;
- margin-bottom: 0;
- }
- #viewerMain .card-group > .card + .card {
- margin-left: 0;
- border-left: 0;
- }
- #viewerMain .card-group > .card:first-child {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- }
- #viewerMain .card-group > .card:first-child .card-img-top,
- #viewerMain .card-group > .card:first-child .card-header {
- border-top-right-radius: 0;
- }
- #viewerMain .card-group > .card:first-child .card-img-bottom,
- #viewerMain .card-group > .card:first-child .card-footer {
- border-bottom-right-radius: 0;
- }
- #viewerMain .card-group > .card:last-child {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- }
- #viewerMain .card-group > .card:last-child .card-img-top,
- #viewerMain .card-group > .card:last-child .card-header {
- border-top-left-radius: 0;
- }
- #viewerMain .card-group > .card:last-child .card-img-bottom,
- #viewerMain .card-group > .card:last-child .card-footer {
- border-bottom-left-radius: 0;
- }
- #viewerMain .card-group > .card:only-child {
- border-radius: 0.25rem;
- }
- #viewerMain .card-group > .card:only-child .card-img-top,
- #viewerMain .card-group > .card:only-child .card-header {
- border-top-left-radius: 0.25rem;
- border-top-right-radius: 0.25rem;
- }
- #viewerMain .card-group > .card:only-child .card-img-bottom,
- #viewerMain .card-group > .card:only-child .card-footer {
- border-bottom-right-radius: 0.25rem;
- border-bottom-left-radius: 0.25rem;
- }
- #viewerMain .card-group > .card:not(:first-child):not(:last-child):not(:only-child) {
- border-radius: 0;
- }
- #viewerMain .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,
- #viewerMain .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,
- #viewerMain .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header,
- #viewerMain .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer {
- border-radius: 0;
- }
-}
-
-#viewerMain .card-columns .card {
- margin-bottom: 0.75rem;
-}
-
-@media (min-width: 576px) {
- #viewerMain .card-columns {
- -webkit-column-count: 3;
- -moz-column-count: 3;
- column-count: 3;
- -webkit-column-gap: 1.25rem;
- -moz-column-gap: 1.25rem;
- column-gap: 1.25rem;
- orphans: 1;
- widows: 1;
- }
- #viewerMain .card-columns .card {
- display: inline-block;
- width: 100%;
- }
-}
-
-#viewerMain .accordion .card:not(:first-of-type):not(:last-of-type) {
- border-bottom: 0;
- border-radius: 0;
-}
-
-#viewerMain .accordion .card:not(:first-of-type) .card-header:first-child {
- border-radius: 0;
-}
-
-#viewerMain .accordion .card:first-of-type {
- border-bottom: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-#viewerMain .accordion .card:last-of-type {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
diff --git a/css/captureImageDialog.css b/css/captureImageDialog.css
deleted file mode 100644
index bc2c8f5..0000000
--- a/css/captureImageDialog.css
+++ /dev/null
@@ -1,137 +0,0 @@
-.captureImageDialog .modal-dialog {
- margin-top: 50px !important;
-}
-
-.captureImageDialog .modal-content {
- background-color: #000;
- color: #91b9cd;
-}
-
-.captureImageDialog .modal-title {
- font-weight: bold;
- margin-top: 0;
-}
-
-.captureImageDialog .modal-title, .captureImageDialog .modal-sub-title {
- color: #91b9cd;
-}
-
-.captureImageDialog .btn-image-download, .captureImageDialog .btn-close {
- background-color: #16202b !important;
- color: #ffffff !important;
- border-color: #92b9cc !important;
-}
-
-.captureImageDialog .card-round {
- background-color: #16202b;
- border-radius: 5px;
- padding: 10px;
-}
-
-.captureImageDialog .card-round > h4 {
- font-size: 18px;
- font-weight: 500;
- line-height: 1.1;
- margin-bottom: 10px;
-}
-
-.captureImageDialog .viewport-element-hidden {
- display: none;
-}
-
-.captureImageDialog .viewport-preview-wrap {
- width: 100%;
- margin: 20px auto 0;
- text-align: center;
-}
-
-.captureImageDialog .viewport-preview-wrap > .card-round {
- display: inline-block;
-}
-
-.captureImageDialog .viewport-preview {
- width: 512px;
- height: 512px;
-}
-
-.captureImageDialog .form-content {
- display: flex;
- flex-direction: row;
- align-items: center;
-}
-
-.captureImageDialog .full-width {
- display: flex;
- flex-direction: row;
- align-items: center;
- margin: 0 auto;
- width: 100%;
-}
-
-.captureImageDialog .form-column {
- display: flex;
- flex-direction: row;
- flex: 1;
- align-items: center;
-}
-
-.captureImageDialog .form-label {
- flex: 1 1 40%;
- font-size: 14px;
- font-weight: 400;
- padding-right: 10px;
- text-align: right;
-}
-
-.captureImageDialog .form-control {
- flex: 1 1 60%;
- padding-right: 10px;
- text-align: left;
-}
-
-.captureImageDialog .form-control, .captureImageDialog .form-control:hover,
-.captureImageDialog .form-control:focus {
- background-color: #16202b !important;
- border-color: #91b9cd;
- color: #fff;
-}
-
-.captureImageDialog .form-control-fixed {
- flex: 0 0 50px;
-}
-
-.captureImageDialog #keepAspectRatio {
- background-color: #16202b;
- border-radius: 3px !important;
- color: #91b9cd;
- margin-left: 10px;
-}
-
-.captureImageDialog .show-annotations-container {
- font-size: 14px;
- justify-content: flex-end;
- height: 40px;
-}
-
-.captureImageDialog #show-annotations {
- padding: 5px 10px;
- margin-bottom: 10px;
-}
-
-.captureImageDialog .aspect-ratio-cell {
- padding-left: 0;
-}
-
-
-table.capture-settings tr, table.capture-settings td {
- border-bottom: none !important;
-}
-
-table.capture-settings tr:hover, table.capture-settings > td:hover {
- background-color: transparent;
-}
-
-#viewport-preview-width, #viewport-preview-height,
-#viewport-preview-quality {
- width: 80px;
-}
\ No newline at end of file
diff --git a/css/external/font-awesome/font-awesome.min.css b/css/external/font-awesome/font-awesome.min.css
deleted file mode 100755
index a41cf41..0000000
--- a/css/external/font-awesome/font-awesome.min.css
+++ /dev/null
@@ -1,4 +0,0 @@
-/*!
- * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:'FontAwesome';src:url('fonts/fontawesome-webfont.eot');src:url('fonts/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),url('fonts/fontawesome-webfont.woff2') format('woff2'),url('fonts/fontawesome-webfont.woff') format('woff'),url('fonts/fontawesome-webfont.ttf') format('truetype'),url('fonts/fontawesome-webfont.svg?#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/css/external/font-awesome/fonts/FontAwesome.otf b/css/external/font-awesome/fonts/FontAwesome.otf
deleted file mode 100755
index 401ec0f..0000000
Binary files a/css/external/font-awesome/fonts/FontAwesome.otf and /dev/null differ
diff --git a/css/external/font-awesome/fonts/fontawesome-webfont.eot b/css/external/font-awesome/fonts/fontawesome-webfont.eot
deleted file mode 100755
index e9f60ca..0000000
Binary files a/css/external/font-awesome/fonts/fontawesome-webfont.eot and /dev/null differ
diff --git a/css/external/font-awesome/fonts/fontawesome-webfont.svg b/css/external/font-awesome/fonts/fontawesome-webfont.svg
deleted file mode 100755
index 855c845..0000000
--- a/css/external/font-awesome/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,2671 +0,0 @@
-
-
-
-
-Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
- By ,,,
-Copyright Dave Gandy 2016. All rights reserved.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/css/external/font-awesome/fonts/fontawesome-webfont.ttf b/css/external/font-awesome/fonts/fontawesome-webfont.ttf
deleted file mode 100755
index 35acda2..0000000
Binary files a/css/external/font-awesome/fonts/fontawesome-webfont.ttf and /dev/null differ
diff --git a/css/external/font-awesome/fonts/fontawesome-webfont.woff b/css/external/font-awesome/fonts/fontawesome-webfont.woff
deleted file mode 100755
index 400014a..0000000
Binary files a/css/external/font-awesome/fonts/fontawesome-webfont.woff and /dev/null differ
diff --git a/css/external/font-awesome/fonts/fontawesome-webfont.woff2 b/css/external/font-awesome/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index abe76b9..0000000
Binary files a/css/external/font-awesome/fonts/fontawesome-webfont.woff2 and /dev/null differ
diff --git a/css/viewer.css b/css/viewer.css
deleted file mode 100644
index ecfb3be..0000000
--- a/css/viewer.css
+++ /dev/null
@@ -1,254 +0,0 @@
-#body-public .full-height {
- height: 100%;
-}
-.ie #body-public .full-height {
- display: block;
-}
-
-.icon-dicomviewer-dark {
- background-image: url('../img/app-dark.svg');
-}
-
-footer.hidden {
- display: none !important;
-}
-
-
-/* Toolbar */
-
-
-.toolbarSection {
- background-color: #000;
- border-bottom: 1px solid #44626f;
- flex: 0 0 auto;
- height: 50px;
- padding-top: 6px;
- position: relative;
- width: 100%;
- text-align: center;
-}
-
-.toolbarSectionButton {
- color: #91b9cd;
- cursor: pointer;
- display: inline-block;
- min-width: 30px;
- outline: none;
- position: relative;
- text-align: center;
- padding-left: 8px;
- padding-right: 8px;
-}
-
-.toolbarSectionButton > .buttonLabel {
- color: #91b9cd;
- font-size: 12px;
- font-weight: 600;
- line-height: 17px;
-}
-
-.toolbarSectionButton > .buttonLabel > span {
- cursor: pointer;
-}
-
-.toolbarSectionButton > .svgContainer {
- margin: 0 auto;
- text-align: center;
- cursor: pointer;
- color: #91b9cd;
-}
-
-.toolbarSectionButton > .svgContainer > i {
- font-size: 18px;
- line-height: 30px;
-}
-
-.svgContent {
- background-color: #91b9cd;
- cursor: pointer;
- margin: 2px auto;
- width: 21px;
- height: 21px;
-}
-
-.rotate-right {
- -webkit-mask-image: url('../img/rotate-right.svg');
- mask-image: url('../img/rotate-right.svg');
-}
-
-.rotate-left {
- -webkit-mask-image: url('../img/rotate-right.svg');
- mask-image: url('../img/rotate-right.svg');
- -moz-transform: scaleX(-1);
- -o-transform: scaleX(-1);
- -webkit-transform: scaleX(-1);
- transform: scaleX(-1);
- filter: FlipH;
- -ms-filter: "FlipH";
-}
-
-.magnifyTool {
- border: 4px white solid;
- box-shadow: 2px 2px 10px #1e1e1e;
- border-radius: 50%;
- display: none;
- cursor: none;
-}
-
-.toolbarSectionButton:not(.active):hover .buttonLabel, .toolbarSectionButton:not(.active):hover .svgContainer {
- color: #ffffff;
-}
-
-.toolbarSectionButton:not(.active):hover .svgContent {
- background-color: #ffffff;
-}
-
-.active > .buttonLabel, .active > .svgContainer{
- color: #20a5d6;
-}
-
-.active .svgContent {
- background-color: #20a5d6;
-}
-
-.button-close {
- display: block;
-}
-
-.button-close {
- background-color: #000;
- border: none;
- color: #dcdcdc;
- display: inline-block;
- font-size: 14px;
- line-height: 14px;
- position: absolute;
- top: 15px;
- right: 6px;
- white-space: nowrap;
- vertical-align: middle;
-}
-
-.button-close:hover {
- color: #fff;
-}
-
-
-/* Viewer */
-
-
-.viewerSection {
- width: 100%;
- height: calc(100% - 57px);
- margin: 0 auto;
-}
-
-.viewerMain {
- width: 100%;
- height: 100%;
- position: relative;
-}
-
-.imageViewerViewport {
- width: 100%;
- height: 100%;
- background-color: black;
- outline: 0 !important;
- overflow: hidden;
-}
-
-.imageViewerViewportOverlay {
- color: #91b9cd;
-}
-
-.dicomTag {
- position: absolute;
- font-size: 14px;
- font-weight: 600;
- text-shadow: 1px 1px black;
- pointer-events: none;
-}
-
-.topleft {
- top: 15px;
- left: 15px;
-}
-
-.topright {
- top: 15px;
- right: 50px;
- text-align: right;
-}
-
-.bottomleft {
- bottom: 15px;
- left: 15px;
-}
-
-.bottomright {
- bottom: 15px;
- right: 50px;
- text-align: right;
-}
-
-.viewportOrientationMarkers {
- pointer-events: none;
- font-size: 15px;
- color: rgb(204, 204, 204);
- line-height: 18px
-}
-
-.orientationMarker {
- position: absolute;
-}
-
-.topMid {
- top: 5px;
- left: 50%;
-}
-
-.leftMid {
- top: 47%;
- left: 5px;
-}
-
-.load-progress-content {
- font-size: 16px;
- position: absolute;
- top: 40%;
- bottom: 60%;
- display: inline-block;
- left: 0;
- right: 0;
- text-align: center;
- color: #91b9cd;
-}
-
-
-@media (max-width: 600px) {
- .toolbarSection {
- height: 171px;
- }
-
- .viewerSection {
- height: calc(100% - 171px);
- }
-
- /*.button-close {*/
- /*display: none;*/
- /*}*/
-}
-
-@media (min-width: 600px) and (max-width: 900px) {
- .toolbarSection {
- height: 104px;
- }
-
- .viewerSection {
- height: calc(100% - 104px);
- }
-
- /*.button-close {*/
- /*display: none;*/
- /*}*/
-}
\ No newline at end of file
diff --git a/css/viewerMain.css b/css/viewerMain.css
deleted file mode 100644
index 9273245..0000000
--- a/css/viewerMain.css
+++ /dev/null
@@ -1,639 +0,0 @@
-#viewerMain {
- background-color: #000000;
- font-family: 'Roboto', 'OpenSans', 'HelveticaNeue-Light', 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- overflow: hidden;
- z-index: 9999;
-
- display: flex;
- flex-direction: column;
-}
-
-.loadingViewerMain {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: #000000;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 32px;
- color: #44626f;
-}
-
-#viewerMain .toolbar {
- width: 100%;
- flex: 0 1 50px;
-}
-
-#viewerMain .content {
- display: flex;
- flex-direction: row;
- flex: 1;
- width: 100%;
- border: 1px solid #44626f;
-}
-
-#viewerMain .sidebarMenu {
- width: 0;
- border-right: 1px solid #44626f;
- position: relative;
- transition: all 0.3s ease;
-}
-
-#viewerMain .mainContent {
- flex: 1;
- width: calc(100% - 272px);
- transition: all 0.3s ease;
-}
-
-#viewerMain .mainContent.content-full {
- width: 100%;
- transition: all 0.3s ease;
-}
-
-#viewerMain .viewerMainLoading {
- color: #44626f;
- text-align: center;
- font-size: 20px;
- margin-top: 40%;
-}
-
-#layoutManagerTarget .viewportContainer {
- width: 100%;
- height: 100%;
- margin: 0 auto;
- position: relative;
-}
-
-#viewerMain .removable {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
-}
-
-#viewerMain #layoutManagerTarget, #viewerMain .imageViewerViewport {
- width: 100%;
- height: 100%;
- margin: 0 auto;
-}
-
-#viewerMain .sidebarMenu.sidebar-open {
- width: 272px;
- transition: all 0.3s ease;
-}
-
-#studyBrowser {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background-color: black;
-}
-
-.studyBrowser {
- width: 100%;
- height: 100%;
- position: relative;
-}
-
-.slimScrollBar {
- margin: 10px 0;
- cursor: grab;
- cursor: -moz-grab;
- cursor: -webkit-grab;
-}
-
-.slimScrollBarActive {
- background-color: #2CA6D4 !important;
-}
-
-.thumbnailEntry {
- cursor: pointer;
- display: table;
- margin: 5px auto 15px;
-}
-
-.imageThumbnail {
- border: 1px solid #44626f;
- border-radius: 12px;
- cursor: grab;
- height: 135px;
- margin: 0 auto;
- padding: 1px 7px;
- position: relative;
- width: 217px;
- -moz-background-clip: padding;
- -webkit-background-clip: padding;
- background-clip: padding-box;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.imageThumbnail.active {
- border: 5px solid #2CA6D4;
-}
-
-.imageThumbnailCanvas {
- cursor: grab;
- height: 100%;
- overflow: hidden;
-}
-
-.seriesDetails {
- color: #ffffff;
- display: flex;
- font-size: 14px;
- line-height: 1.3em;
- margin-top: 5px;
- max-width: 240px;
- min-height: 36px;
- position: relative;
- word-wrap: break-word;
-}
-
-.seriesDescription {
- font-size: 12px;
- font-weight: 600;
- flex-grow: 1;
-}
-
-.seriesInformation {
- padding-right: 4px;
- width: 45px;
-}
-
-.seriesInformation .item-frames .icon {
- height: 18px;
-}
-
-.seriesInformation .icon {
- color: #20a5d6;
- display: inline-block;
- float: left;
- font-size: 10px;
- font-weight: 900;
- text-align: right;
- width: 11px;
-}
-
-.seriesInformation .icon > div {
- background-color: #678696;
- margin-top: 6px;
- position: relative;
- content: '';
- display: inline-block;
- height: 11px;
- width: 11px;
-}
-
-.seriesInformation .icon div:after {
- background-color: #20a5d6;
- box-shadow: 1px 1px rgba(0, 0, 0, .115);
- left: -5px;
- position: absolute;
- top: -5px;
- border: 1px solid #000;
- content: '';
- display: inline-block;
- height: 11px;
- width: 11px;
-}
-
-.seriesInformation .value {
- color: #91b9cd;
- display: inline-block;
- float: right;
- font-size: 12px;
- font-weight: 600;
- margin-left: 4px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- width: calc(100% - 15px);
-}
-
-/* TOOLBAR */
-#toolbar .toolbarSectionTools {
- margin-left: 65px;
- margin-right: 20px;
- width: auto;
- text-align: center;
- height: 50px;
- transition: 0.3s;
-}
-
-#toolbar .toolbarSectionButton {
- color: #91b9cd;
- cursor: pointer;
- display: inline-block;
- min-width: 30px;
- outline: none;
- position: relative;
- text-align: center;
- padding-left: 8px;
- padding-right: 8px;
-}
-
-#toolbar .toolbarSectionButton > .buttonLabel {
- color: #91b9cd;
- font-size: 12px;
- font-weight: 600;
- line-height: 17px;
-}
-
-#toolbar .toolbarSectionButton > .buttonLabel > span {
- cursor: pointer;
-}
-
-#toolbar .toolbarSectionButton > .svgContainer {
- margin: 0 auto;
- text-align: center;
- cursor: pointer;
- color: #91b9cd;
-}
-
-#toolbar .toolbarSectionButton > .svgContainer > i {
- font-size: 18px;
- line-height: 30px;
-}
-
-.svgContent {
- background-color: #91b9cd;
- cursor: pointer;
- margin: 2px auto;
- width: 21px;
- height: 21px;
-}
-
-.rotate-right {
- -webkit-mask-image: url('../img/rotate-right.svg');
- mask-image: url('../img/rotate-right.svg');
-}
-
-.rotate-left {
- -webkit-mask-image: url('../img/rotate-right.svg');
- mask-image: url('../img/rotate-right.svg');
- -moz-transform: scaleX(-1);
- -o-transform: scaleX(-1);
- -webkit-transform: scaleX(-1);
- transform: scaleX(-1);
- filter: FlipH;
- -ms-filter: "FlipH";
-}
-
-.toolbarSectionTools .moreTools {
- color: #91b9cd;
- display: none;
- position: absolute;
- top: 0;
- right: 35px;
-}
-
-.toolbarSectionTools .moreTools .toolbarSectionButton .svgContainer {
- transition: 0.3s;
-}
-
-.series-panel {
- height: 15px;
- width: 15px;
- -webkit-mask-image: url('../img/series-panel.svg');
- mask-image: url('../img/series-panel.svg');
-}
-
-#toolbar .toolbarSectionButton:not(.active):hover .buttonLabel,
-#toolbar .toolbarSectionButton:not(.active):hover .svgContainer {
- color: #ffffff;
-}
-
-#toolbar .toolbarSectionButton:not(.active):hover .svgContent {
- background-color: #ffffff;
-}
-
-#toolbar .active > .buttonLabel, #toolbar .active > .svgContainer{
- color: #20a5d6;
-}
-
-#toolbar .active .svgContent {
- background-color: #20a5d6;
-}
-
-#toolbar .toggleSeriesPanel {
- position: absolute;
- left: 0;
- top: 4px;
- bottom: 0;
- width: 65px;
- height: 46px;
-}
-
-#toolbar .toggleSeriesPanel .svgContainer {
- border: 2px solid #91b9cd;
- border-radius: 15px;
- width: 50px;
-}
-
-#toolbar .toggleSeriesPanel .svgContainer > .svgContent {
- width: 15px;
- height: 15px;
-}
-
-#toolbar .toggleSeriesPanel .buttonLabel {
- position: absolute;
- width: 50px;
- margin-top: 2px;
-}
-
-#toolbar .toggleSeriesPanelButton.active > .svgContainer {
- border-color: #2CA6D4;
- color: #2CA6D4 !important;
-}
-
-#toolbar .toggleSeriesPanelButton.active > .buttonLabel > span {
- color: #2CA6D4 !important;
-}
-
-#toolbar .toggleSeriesPanelButton:hover .svgContent {
- background-color: #2CA6D4 !important;
-}
-
-#toolbar .toggleSeriesPanelButton:hover > .svgContainer {
- border-color: #2CA6D4;
- color: #2CA6D4 !important;
-}
-
-#toolbar .toggleSeriesPanelButton:hover > .buttonLabel > span {
- color: #2CA6D4 !important;
-}
-
-#imageControls .imageControlButton {
- position: absolute;
- right: 0;
- color: #163239;
- cursor: pointer;
- font-size: 28px;
- width: 40px;
- height: 40px;
- padding: 4px;
-}
-
-#imageControls .imageControlButtonActive {
- color: #2CA6D4;
-}
-
-#imageControls .imageControlUp {
- top: 10px;
-}
-
-#imageControls .imageControlDown {
- bottom: 10px;
-}
-
-.imageControls {
- position: absolute;
- right: 14px;
- top: 50px;
- bottom: 40px;
-}
-
-.imageControls .scrollbar {
- height: calc(100% - 20px);
- margin-top: 5px;
- position: relative;
- width: 14px;
-}
-
-.imageControls .scrollbar .imageSlider {
- height: 14px;
- min-height: 14px !important;
- padding: 0;
- position: absolute;
- top: 0;
- left: 7px;
- transform: rotate(90deg);
- transform-origin: top left;
- -webkit-appearance: none;
- background-color: rgba(0,0,0,0);
-}
-
-.imageControls .scrollbar .imageSlider:focus {
- outline: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- -ms-box-shadow: none;
- -o-box-shadow: none;
- box-shadow: none;
-}
-
-.imageControls .scrollbar .imageSlider::-moz-focus-outer {
- border: none;
-}
-
-.imageControls .scrollbar .imageSlider::-webkit-slider-runnable-track {
- background-color: rgba(0,0,0,0);
- border: none;
- cursor: pointer;
- height: 14px;
- z-index: 6;
-}
-
-.imageControls .scrollbar .imageSlider::-moz-range-track {
- background-color: rgba(0,0,0,0);
- border: none;
- cursor: pointer;
- height: 14px;
- z-index: 6;
-}
-
-.imageControls .scrollbar .imageSlider::-ms-track {
- animate: 0.2s;
- background: transparent;
- border: none;
- border-width: 15px 0;
- color: rgba(0,0,0,0);
- cursor: pointer;
- height: 14px;
- width: 100%;
-}
-
-.imageControls .scrollbar .imageSlider::-ms-fill-lower {
- background: rgba(0,0,0,0);
-}
-
-.imageControls .scrollbar .imageSlider::-ms-fill-upper {
- background: rgba(0,0,0,0);
-}
-
-.imageControls .scrollbar .imageSlider::-webkit-slider-thumb {
- -webkit-appearance: none !important;
- background-color: #163239;
- border: none;
- border-radius: 57px;
- cursor: -webkit-grab;
- height: 14px;
- margin-top: -4px;
- width: 39px;
-}
-
-.imageControls .scrollbar .imageSlider::-webkit-slider-thumb:active {
- background-color: #2CA6D4;
- cursor: -webkit-grabbing
-}
-
-.imageControls .scrollbar .imageSlider::-moz-range-thumb {
- background-color: #163239;
- border: none;
- border-radius: 57px;
- cursor: -moz-grab;
- height: 14px;
- width: 39px;
- z-index: 7;
-}
-
-.imageControls .scrollbar .imageSlider::-moz-range-thumb:active {
- background-color: #2CA6D4;
- cursor: -moz-grabbing;
-}
-
-.imageControls .scrollbar .imageSlider::-ms-thumb {
- background-color: #163239;
- border: none;
- border-radius: 57px;
- cursor: ns-resize;
- height: 14px;
- width: 39px;
-}
-
-.imageControls .scrollbar .imageSlider::-ms-thumb:active {
- background-color: #2CA6D4;
-}
-
-.imageControls .scrollbar .imageSlider::-ms-tooltip {
- display: none;
-}
-
-#studyBrowserAccordion .card-header {
- padding: 0 5px;
-}
-
-#studyBrowserAccordion .study-text {
- cursor: grab;
- font-size: 13px;
- left: 89px;
- line-height: 14px;
- position: absolute;
- right: 7px;
- top: 12px;
-}
-
-#studyBrowserAccordion .study-text .study-date {
- margin-top: 8px;
- color: #91b9cd;
- cursor: grab;
-}
-
-#studyBrowserAccordion .study-text .study-description {
- margin-top: 8px;
- color: #ffffff;
- cursor: grab;
-}
-
-#studyBrowserAccordion div:not(.collapsed) .study-item-box {
- border: 1px solid transparent;
- border-radius: 12px;
- cursor: grab;
- padding: 5px 7px 10px;
- position: relative;
- z-index: 0;
-}
-
-#studyBrowserAccordion div:not(.collapsed) .study-item-box:hover {
- background-color: #14191E;
- border-color: #2d4660;
-}
-
-#studyBrowserAccordion div:not(.collapsed) .study-modality:before {
- position: absolute;
- background-color: #2CA6D4;
- border: 2px solid #000000;
- border-radius: 8px;
- content: '';
- display: block;
- top: -8px;
- left: -8px;
- z-index: -1;
- width: 50px;
- height: 50px;
-}
-
-#studyBrowserAccordion div:not(.collapsed) .study-modality {
- border: 2px solid #000000;
- border-radius: 8px;
- color: #000000;
- width: 50px;
- height: 50px;
- background-color: #2CA6D4;
- font-size: 14px;
- line-height: 50px;
- margin-left: 12px;
- margin-top: 12px;
- position: relative;
-}
-
-#studyBrowserAccordion div:not(.collapsed) .study-modality:after {
- position: absolute;
- background-color: #2CA6D4;
- border: 2px solid #000000;
- border-radius: 8px;
- content: '';
- display: block;
- top: -14px;
- left: -14px;
- z-index: -2;
- width: 50px;
- height: 50px;
-}
-
-#studyBrowserAccordion div:not(.collapsed) .study-modality-text {
- height: 100%;
- overflow: hidden;
- text-align: center;
- text-transform: uppercase;
-}
-
-#studyBrowserAccordion div.collapsed .study-modality:before,
-#studyBrowserAccordion div.collapsed .study-modality,
-#studyBrowserAccordion div.collapsed .study-modality:after {
- background-color: #2d4660;
- color: #91b9cd;
-}
-
-.expandedToolbar {
- height: auto !important;
-}
-
-.rotate-180 {
- -webkit-transform: rotate(180deg);
- -moz-transform: rotate(180deg);
- transform: rotate(180deg);
-}
-
-@media only screen and (max-width: 1200px) {
- #toolbar .toolbarSectionTools {
- padding-right: 60px;
- }
-
- .toolbarSectionTools .moreTools {
- display: block;
- }
-}
diff --git a/css/viewerMainDialog.css b/css/viewerMainDialog.css
deleted file mode 100644
index 3aed2ed..0000000
--- a/css/viewerMainDialog.css
+++ /dev/null
@@ -1,257 +0,0 @@
-/*!
- * Bootstrap v4.0.0 (https://getbootstrap.com)
- * Copyright 2011-2018 The Bootstrap Authors
- * Copyright 2011-2018 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-/*******************************************/
-/** Add bootstrap style to prevent **/
-/** conflict with core application's style **/
-/*******************************************/
-
-/** Button **/
-#viewerMain .btn {
- display: inline-block;
- font-weight: 400;
- text-align: center;
- white-space: nowrap;
- vertical-align: middle;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- border: 1px solid transparent;
- padding: 0.375rem 0.75rem;
- font-size: 1rem;
- line-height: 1.5;
- border-radius: 0.25rem;
- 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;
-}
-
-#viewerMain .btn:hover, #viewerMain .btn:focus {
- text-decoration: none;
-}
-
-#viewerMain .btn:focus, #viewerMain .btn.focus {
- outline: 0;
- box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
-}
-
-#viewerMain .btn.disabled, .btn:disabled {
- opacity: 0.65;
-}
-
-#viewerMain .btn:not(:disabled):not(.disabled) {
- cursor: pointer;
-}
-
-#viewerMain .btn:not(:disabled):not(.disabled):active, #viewerMain .btn:not(:disabled):not(.disabled).active {
- background-image: none;
-}
-
-#viewerMain a.btn.disabled,
-#viewerMain fieldset:disabled a.btn {
- pointer-events: none;
-}
-
-/** Close button **/
-
-#viewerMain .close {
- float: right;
- font-size: 1.5rem;
- font-weight: 700;
- line-height: 1;
- color: #000;
- text-shadow: 0 1px 0 #fff;
- opacity: .5;
-}
-
-#viewerMain .close:hover, #viewerMain .close:focus {
- color: #000;
- text-decoration: none;
- opacity: .75;
-}
-
-#viewerMain .close:not(:disabled):not(.disabled) {
- cursor: pointer;
-}
-
-#viewerMain button.close {
- padding: 0;
- background-color: transparent;
- border: 0;
- -webkit-appearance: none;
-}
-
-
-/** Modal **/
-
-#viewerMain .modal-open {
- overflow: hidden;
-}
-
-#viewerMain .modal {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1050;
- display: none;
- overflow: hidden;
- outline: 0;
-}
-
-#viewerMain .modal-open .modal {
- overflow-x: hidden;
- overflow-y: auto;
-}
-
-#viewerMain .modal-dialog {
- position: relative;
- width: auto;
- margin: 0.5rem;
- pointer-events: none;
-}
-
-#viewerMain .modal.fade .modal-dialog {
- transition: -webkit-transform 0.3s ease-out;
- transition: transform 0.3s ease-out;
- transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
- -webkit-transform: translate(0, -25%);
- transform: translate(0, -25%);
-}
-
-#viewerMain .modal.show .modal-dialog {
- -webkit-transform: translate(0, 0);
- transform: translate(0, 0);
-}
-
-#viewerMain .modal-dialog-centered {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- min-height: calc(100% - (0.5rem * 2));
-}
-
-#viewerMain .modal-content {
- position: relative;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- width: 100%;
- pointer-events: auto;
- background-color: #000;
- background-clip: padding-box;
- border: 1px solid #91b9cd;
- border-radius: 6px;
- color: #91b9cd;
- outline: 0;
-}
-
-#viewerMain .modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: #000;
-}
-
-#viewerMain .modal-backdrop.fade {
- opacity: 0;
-}
-
-#viewerMain .modal-header {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: flex-start;
- -webkit-box-pack: justify;
- -ms-flex-pack: justify;
- justify-content: space-between;
- padding: 1rem;
- border-bottom: 1px solid #91b9cd;
- border-top-left-radius: 0.3rem;
- border-top-right-radius: 0.3rem;
-}
-
-#viewerMain .modal-header .close {
- padding: 1rem;
- margin: -1rem -1rem -1rem auto;
-}
-
-#viewerMain .modal-title {
- margin-bottom: 0;
- line-height: 1.5;
-}
-
-#viewerMain .modal-body {
- position: relative;
- -webkit-box-flex: 1;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- padding: 1rem;
- max-height: calc(100vh - 210px);
- overflow-y: auto;
-}
-
-#viewerMain .modal-footer {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- padding: 1rem;
- border-top: 1px solid #91b9cd;
-}
-
-#viewerMain .modal-footer > :not(:first-child) {
- margin-left: .25rem;
-}
-
-#viewerMain .modal-footer > :not(:last-child) {
- margin-right: .25rem;
-}
-
-#viewerMain .modal-scrollbar-measure {
- position: absolute;
- top: -9999px;
- width: 50px;
- height: 50px;
- overflow: scroll;
-}
-
-@media (min-width: 576px) {
- #viewerMain .modal-dialog {
- max-width: 500px;
- margin: 1.75rem auto;
- }
- #viewerMain .modal-dialog-centered {
- min-height: calc(100% - (1.75rem * 2));
- }
- #viewerMain .modal-sm {
- max-width: 300px;
- }
-}
-
-@media (min-width: 992px) {
- #viewerMain .modal-lg {
- max-width: 900px;
- }
-}
\ No newline at end of file
diff --git a/img/app-dark.svg b/img/app-dark.svg
deleted file mode 100644
index 499827b..0000000
--- a/img/app-dark.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-dcm
-
diff --git a/img/app.svg b/img/app.svg
index f55ff58..499827b 100644
--- a/img/app.svg
+++ b/img/app.svg
@@ -1,15 +1,14 @@
-
-
-dcm
+
+dcm
diff --git a/img/rotate-right.svg b/img/rotate-right.svg
deleted file mode 100644
index 5bfec9c..0000000
--- a/img/rotate-right.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/img/series-panel.svg b/img/series-panel.svg
deleted file mode 100644
index 12d1418..0000000
--- a/img/series-panel.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php
new file mode 100755
index 0000000..4be40b7
--- /dev/null
+++ b/lib/AppInfo/Application.php
@@ -0,0 +1,35 @@
+registerEventListener(LoadViewer::class, LoadViewerListener::class);
+ $context->registerEventListener(BeforeTemplateRenderedEvent::class, LoadPublicViewerListener::class);
+ $context->registerEventListener(AddContentSecurityPolicyEvent::class, CSPListener::class);
+ }
+
+ public function boot(IBootContext $context): void {
+ }
+}
diff --git a/lib/Controller/DisplayController.php b/lib/Controller/DisplayController.php
new file mode 100755
index 0000000..e1dd072
--- /dev/null
+++ b/lib/Controller/DisplayController.php
@@ -0,0 +1,499 @@
+config = $config;
+ $this->urlGenerator = $urlGenerator;
+ $this->logger = $logger;
+ $this->mimeTypeDetector = $mimeTypeDetector;
+ $this->rootFolder = $rootFolder;
+ $this->shareManager = $shareManager;
+
+ $this->publicViewerFolderPath = null;
+ $this->publicViewerAssetsFolderPath = null;
+ $appsPaths = $this->config->getSystemValue('apps_paths');
+ foreach($appsPaths as $appsPath) {
+ $viewerFolder = $appsPath['path'] . '/dicomviewer/js/public/viewer';
+ if (file_exists($viewerFolder)) {
+ $this->publicViewerFolderPath = $viewerFolder;
+ $this->publicViewerAssetsFolderPath = $viewerFolder . '/assets';
+ break;
+ }
+ }
+
+ $this->dataFolder = $this->config->getSystemValue('datadirectory');
+ }
+
+ private function getNextcloudBasePath() {
+ if ($this->config->getSystemValueBool('htaccess.IgnoreFrontController', false) || getenv('front_controller_active') === 'true') {
+ return $this->urlGenerator->getWebroot();
+ } else {
+ return $this->urlGenerator->getWebroot() . '/index.php';
+ }
+ }
+
+ private function getQueryParam($key) {
+ $requestUri = $this->request->getRequestUri();
+ $qPos = strpos($requestUri, '?');
+ if (!$qPos) {
+ return null;
+ }
+
+ $queryParamsStr = substr($requestUri, $qPos + 1);
+ $queryParams = array();
+ if ($queryParamsStr !== null) {
+ $queryParamsStrSplit = explode('&', $queryParamsStr);
+ for ($i = 0; $i < count($queryParamsStrSplit); $i++) {
+ $queryParamKeyValueToMapSplit = explode('=', $queryParamsStrSplit[$i]);
+ if (count($queryParamKeyValueToMapSplit) === 2 && $queryParamKeyValueToMapSplit[0] === $key) {
+ return urldecode($queryParamKeyValueToMapSplit[1]);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private function arrayFindIndex($array, $searchKey, $searchValue) {
+ for ($i = 0; $i < count($array); $i++) {
+ if ($array[$i][$searchKey] === $searchValue) {
+ return $i;
+ }
+ }
+ return -1;
+ }
+
+ private function cleanDICOMTagValue($value) {
+ if (is_string($value)) {
+ return str_replace('\u0000', '', trim($value));
+ }
+
+ return $value;
+ }
+
+ private function getAllDICOMFilesInFolder($parentPathToRemove, $folderNode) {
+ $filepaths = array();
+ $nodes = $folderNode->getDirectoryListing();
+ foreach($nodes as $node) {
+ if ($node->getType() == 'dir') {
+ $filepaths = array_merge($filepaths, $this->getAllDICOMFilesInFolder($parentPathToRemove, $node));
+ } else if ($node->getType() == 'file' && $node->getMimetype() == 'application/dicom') {
+ array_push($filepaths, implode('', explode($parentPathToRemove, $node->getPath(), 2)));
+ }
+ }
+ return $filepaths;
+ }
+
+ private function getContentSecurityPolicy() {
+ $policy = new EmptyContentSecurityPolicy();
+ $policy->addAllowedChildSrcDomain('http: *');
+ $policy->addAllowedFontDomain('data: http: *');
+ $policy->addAllowedImageDomain('data: http: *');
+ $policy->addAllowedScriptDomain('http: *');
+ $policy->addAllowedStyleDomain('http: *');
+ $policy->addAllowedConnectDomain('http: *');
+ $policy->addAllowedWorkerSrcDomain('http: *');
+ $policy->addAllowedFrameDomain('http: *');
+ $policy->addAllowedFrameAncestorDomain('http: *');
+ $policy->allowEvalScript(true);
+ $policy->allowEvalWasm(true);
+ $policy->allowInlineStyle(true);
+ $policy->useStrictDynamic(false);
+ $policy->useStrictDynamicOnScripts(false);
+ return $policy;
+ }
+
+ private function generateDICOMJson($dicomFilePaths, $selectedFileFullPath, $parentFullPath, $downloadUrlPrefix, $isPublic, $singlePublicFileDownload) {
+ $dicomJson = array('studies' => array());
+
+ foreach($dicomFilePaths as $dicomFilePath) {
+ $fileUrlPath = '';
+ if ($isPublic) {
+ if ($singlePublicFileDownload) {
+ $urlParamFiles = substr($dicomFilePath, strrpos($dicomFilePath, '/') + 1);
+ $fileUrlPath = $downloadUrlPrefix.'/'.$urlParamFiles;
+ } else {
+ $urlParamPath = substr($dicomFilePath, 0, strrpos($dicomFilePath, '/'));
+ $urlParamFiles = substr($dicomFilePath, strrpos($dicomFilePath, '/') + 1);
+ $fileUrlPath = $downloadUrlPrefix.'?path='.$urlParamPath.'&files='.$urlParamFiles;
+ }
+ } else {
+ $fileUrlPath = $downloadUrlPrefix.$dicomFilePath;
+ }
+
+ $fileUrl = $this->urlGenerator->getAbsoluteURL($fileUrlPath);
+
+ $fileFullPath = $parentFullPath.$dicomFilePath;
+ $dicom = Nanodicom::factory($fileFullPath);
+ $dicom->parse()->profiler_diff('parse');
+
+ $StudyInstanceUID = $this->cleanDICOMTagValue($dicom->value(0x0020, 0x000D));
+ $StudyDate = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0020));
+ $StudyTime = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0030));
+ $StudyDescription = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x1030));
+ $PatientName = $this->cleanDICOMTagValue($dicom->value(0x0010, 0x0010));
+ $PatientID = $this->cleanDICOMTagValue($dicom->value(0x0010, 0x0020));
+ $PatientBirthDate = $this->cleanDICOMTagValue($dicom->value(0x0010, 0x0030));
+ $AccessionNumber = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0050));
+ $PatientAge = $this->cleanDICOMTagValue($dicom->value(0x0010, 0x1010));
+ $PatientSex = $this->cleanDICOMTagValue($dicom->value(0x0010, 0x0040));
+ $NumInstances = 0;
+ $Modalities = '';
+ $SeriesInstanceUID = $this->cleanDICOMTagValue($dicom->value(0x0020, 0x000E));
+ $SeriesDescription = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x103E));
+ $SeriesNumber = $this->cleanDICOMTagValue($dicom->value(0x0020, 0x0011));
+ $Modality = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0060));
+ $SliceThickness = $this->cleanDICOMTagValue($dicom->value(0x0018, 0x0050));
+ $Columns = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0011));
+ $Rows = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0010));
+ $InstanceNumber = $this->cleanDICOMTagValue($dicom->value(0x0020, 0x0013));
+ $SOPClassUID = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0016));
+ $PhotometricInterpretation = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0004));
+ $BitsAllocated = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0100));
+ $BitsStored = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0101));
+ $PixelRepresentation = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0103));
+ $SamplesPerPixel = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0002));
+ $PixelSpacing = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0030));
+ $HighBit = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0102));
+ $ImageOrientationPatient = $this->cleanDICOMTagValue($dicom->value(0x0020, 0x0037));
+ $ImagePositionPatient = $this->cleanDICOMTagValue($dicom->value(0x0020, 0x0032));
+ $FrameOfReferenceUID = $this->cleanDICOMTagValue($dicom->value(0x0020, 0x0052));
+ $ImageType = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0008));
+ $Modality = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0060));
+ $SOPInstanceUID = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0018));
+ $WindowCenter = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x1050));
+ $WindowWidth = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x1051));
+ $SeriesDate = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0021));
+
+ // STUDY
+ $studyIndex = $this->arrayFindIndex($dicomJson['studies'], 'StudyInstanceUID', $StudyInstanceUID);
+ if ($studyIndex < 0) {
+ $study = array(
+ 'StudyInstanceUID' => $StudyInstanceUID,
+ 'StudyDate' => $StudyDate,
+ 'StudyTime' => $StudyTime,
+ 'StudyDescription' => $StudyDescription,
+ 'PatientName' => $PatientName,
+ 'PatientID' => $PatientID,
+ 'PatientBirthDate' => $PatientBirthDate,
+ 'AccessionNumber' => $AccessionNumber,
+ 'PatientAge' => $PatientAge,
+ 'PatientSex' => $PatientSex,
+ 'NumInstances' => $NumInstances,
+ 'Modalities' => $Modalities,
+ 'series' => array(),
+ );
+ array_push($dicomJson['studies'], $study);
+ $studyIndex = count($dicomJson['studies']) - 1;
+ }
+
+ // SERIES
+ $seriesIndex = $this->arrayFindIndex($dicomJson['studies'][$studyIndex]['series'], 'SeriesInstanceUID', $SeriesInstanceUID);
+ if ($seriesIndex < 0) {
+ $series = array(
+ 'SeriesInstanceUID' => $SeriesInstanceUID,
+ 'SeriesDescription' => $SeriesDescription,
+ 'SeriesNumber' => $SeriesNumber,
+ 'Modality' => $Modality,
+ 'SliceThickness' => $SliceThickness,
+ 'instances' => array(),
+ );
+ array_push($dicomJson['studies'][$studyIndex]['series'], $series);
+ $seriesIndex++;
+ }
+
+ // INSTANCE
+ $instance = array(
+ 'metadata' => array(
+ 'selected' => $fileFullPath == $selectedFileFullPath,
+ 'Columns' => $Columns,
+ 'Rows' => $Rows,
+ 'InstanceNumber' => $InstanceNumber,
+ 'SOPClassUID' => $SOPClassUID,
+ 'PhotometricInterpretation' => $PhotometricInterpretation,
+ 'BitsAllocated' => $BitsAllocated,
+ 'BitsStored' => $BitsStored,
+ 'PixelRepresentation' => $PixelRepresentation,
+ 'SamplesPerPixel' => $SamplesPerPixel,
+ 'PixelSpacing' => $PixelSpacing ? array_map('trim', explode('\\', $PixelSpacing)) : $PixelSpacing,
+ 'HighBit' => $HighBit,
+ 'ImageOrientationPatient' => $ImageOrientationPatient ? array_map('trim', explode('\\', $ImageOrientationPatient)) : $ImageOrientationPatient,
+ 'ImagePositionPatient' => $ImagePositionPatient ? array_map('trim', explode('\\', $ImagePositionPatient)) : $ImagePositionPatient,
+ 'FrameOfReferenceUID' => $FrameOfReferenceUID,
+ 'ImageType' => $ImageType ? array_map('trim', explode('\\', $ImageType)) : $ImageType,
+ 'Modality' => $Modality,
+ 'SOPInstanceUID' => $SOPInstanceUID,
+ 'SeriesInstanceUID' => $SeriesInstanceUID,
+ 'StudyInstanceUID' => $StudyInstanceUID,
+ 'WindowCenter' => $WindowCenter ? explode('\\', $WindowCenter)[0] : $WindowCenter,
+ 'WindowWidth' => $WindowWidth ? explode('\\', $WindowWidth)[0] : $WindowWidth,
+ 'SeriesDate' => $SeriesDate,
+ ),
+ 'url' => 'dicomweb:'.$fileUrl,
+ );
+ array_push($dicomJson['studies'][$studyIndex]['series'][$seriesIndex]['instances'], $instance);
+ $dicomJson['studies'][$studyIndex]['NumInstances']++;
+ if ($dicomJson['studies'][$studyIndex]['Modalities'] == '' || !in_array($Modality, explode(',', $dicomJson['studies'][$studyIndex]['Modalities']))) {
+ if ($dicomJson['studies'][$studyIndex]['Modalities'] == '') {
+ $dicomJson['studies'][$studyIndex]['Modalities'] = $Modality;
+ } else {
+ $dicomJson['studies'][$studyIndex]['Modalities'] .= ','.$Modality;
+ }
+ }
+ }
+
+ return $dicomJson;
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @return TemplateResponse
+ */
+ public function showDICOMViewer(): TemplateResponse {
+ $params = [
+ 'urlGenerator' => $this->urlGenerator,
+ 'ignoreFrontController' => $this->config->getSystemValueBool('htaccess.IgnoreFrontController', false) || getenv('front_controller_active') === 'true'
+ ];
+
+ $response = new TemplateResponse(Application::APP_ID, 'viewer', $params, 'blank');
+ $response->setContentSecurityPolicy($this->getContentSecurityPolicy());
+ $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin');
+ $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp');
+
+ return $response;
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @return TemplateResponse
+ */
+ public function showDICOMViewerModeViewer(): TemplateResponse {
+ $params = [
+ 'urlGenerator' => $this->urlGenerator,
+ 'ignoreFrontController' => $this->config->getSystemValueBool('htaccess.IgnoreFrontController', false) || getenv('front_controller_active') === 'true'
+ ];
+
+ $response = new TemplateResponse(Application::APP_ID, 'viewer', $params, 'blank');
+ $response->setContentSecurityPolicy($this->getContentSecurityPolicy());
+ $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin');
+ $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp');
+
+ return $response;
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @return TemplateResponse
+ */
+ public function showDICOMViewerModeJson(): TemplateResponse {
+ $params = [
+ 'urlGenerator' => $this->urlGenerator,
+ 'ignoreFrontController' => $this->config->getSystemValueBool('htaccess.IgnoreFrontController', false) || getenv('front_controller_active') === 'true'
+ ];
+
+ $response = new TemplateResponse(Application::APP_ID, 'viewer', $params, 'blank');
+ $response->setContentSecurityPolicy($this->getContentSecurityPolicy());
+ $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin');
+ $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp');
+
+ return $response;
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @param string $filepath
+ * @return StreamResponse
+ */
+ public function getDICOMViewerFile(string $filepath): StreamResponse {
+ $filename = str_replace('viewer/', '', $filepath);
+ $fullFilePath = $this->publicViewerFolderPath . '/' . $filename;
+ $fpHandle = null;
+
+ // Replace nextcloud base path with the actual path in this environment
+ // TODO: Move this to replace __NEXTCLOUD_BASE_PATH__ on app install and htaccess update only
+ if (str_ends_with($fullFilePath, '.html') || str_ends_with($fullFilePath, '.js')) {
+ $fpHandle = fopen('php://temp/maxmemory:'.$filename.'.customized', 'r+');
+ fputs($fpHandle, str_replace('__NEXTCLOUD_BASE_PATH__', $this->getNextcloudBasePath(), file_get_contents($fullFilePath)));
+ rewind($fpHandle);
+ } else {
+ $fpHandle = fopen($fullFilePath, 'rb');
+ }
+
+ $response = new StreamResponse($fpHandle);
+ $fileMimeType = mime_content_type($fullFilePath);
+ $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($filename) . '"');
+ $response->addHeader('Content-Type', $this->mimeTypeDetector->detectPath($fullFilePath));
+ $response->setContentSecurityPolicy($this->getContentSecurityPolicy());
+ $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin');
+ $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp');
+
+ return $response;
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @param string $assetpath
+ * @return StreamResponse
+ */
+ public function getDICOMViewerAsset(string $assetpath): StreamResponse {
+ $filename = str_replace('viewer/', '', $assetpath);
+ $fullFilePath = $this->publicViewerAssetsFolderPath . '/' . $filename;
+
+ $response = new StreamResponse(fopen($fullFilePath, 'rb'));
+ $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($filename) . '"');
+ $response->addHeader('Content-Type', $this->mimeTypeDetector->detectPath($fullFilePath));
+ $response->setContentSecurityPolicy($this->getContentSecurityPolicy());
+ $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin');
+ $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp');
+
+ return $response;
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @param string $assetpath
+ * @return StreamResponse
+ */
+ public function getDICOMViewerAssetSub(string $assetpath): StreamResponse {
+ $filename = str_replace('viewer/', '', $assetpath);
+ $fullFilePath = $this->publicViewerAssetsFolderPath . '/' . $filename;
+
+ $response = new StreamResponse(fopen($fullFilePath, 'rb'));
+ $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($filename) . '"');
+ $response->addHeader('Content-Type', $this->mimeTypeDetector->detectPath($fullFilePath));
+ $response->setContentSecurityPolicy($this->getContentSecurityPolicy());
+ $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin');
+ $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp');
+
+ return $response;
+ }
+
+ /**
+ * @NoAdminRequired
+ * @NoCSRFRequired
+ *
+ * @return JSONResponse
+ */
+ public function getDICOMJson(): JSONResponse {
+ $fileQueryParams = explode('|', $this->getQueryParam('file'));
+ $userId = $fileQueryParams[0];
+ $filepath = ltrim($fileQueryParams[1], '/');
+
+ $userFolder = $this->rootFolder->getUserFolder($userId);
+ $selectedFileFullPath = $this->dataFolder.$userFolder->get($filepath)->getPath();
+ $dicomFolder = $userFolder->get($filepath)->getParent();
+
+ $parentPathToRemove = $dicomFolder->getParent()->getPath();
+ if ($userFolder->getPath() == $dicomFolder->getPath()) {
+ $parentPathToRemove = '/'.$userId.'/files';
+ }
+
+ // Get all DICOM files in the folder and sub folders
+ $dicomFilePaths = $this->getAllDICOMFilesInFolder($parentPathToRemove, $dicomFolder);
+
+ $dicomParentFullPath = $this->dataFolder.'/'.$userId.'/files';
+ $downloadUrlPrefix = 'remote.php/dav/files/'.$userId;
+ $dicomJson = $this->generateDICOMJson($dicomFilePaths, $selectedFileFullPath, $dicomParentFullPath, $downloadUrlPrefix, false, false);
+ $response = new JSONResponse($dicomJson);
+ return $response;
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ *
+ * @return JSONResponse
+ */
+ public function getPublicDICOMJson(): JSONResponse {
+ $fileQueryParams = explode('|', $this->getQueryParam('file'));
+ $shareToken = $fileQueryParams[0];
+ $filepath = ltrim($fileQueryParams[1], '/');
+
+ try {
+ $share = $this->shareManager->getShareByToken($shareToken);
+ if ($share == null) {
+ $response = new JSONResponse(array());
+ return $response;
+ }
+
+ $selectedFileFullPath = '';
+ $dicomParentFullPath = '';
+ $dicomFilePaths = array();
+ $singlePublicFileDownload = false;
+
+ $shareNode = $share->getNode();
+ if ($shareNode->getType() == 'dir') {
+ $selectedFileFullPath = $this->dataFolder.$shareNode->get($filepath)->getPath();
+ $dicomParentFullPath = $this->dataFolder.$shareNode->getPath();
+
+ // Get all DICOM files in the share folder and sub folders
+ $parentPathToRemove = $shareNode->getPath();
+ $dicomFilePaths = $this->getAllDICOMFilesInFolder($parentPathToRemove, $shareNode);
+ } else {
+ $selectedFileFullPath = null;
+ $dicomParentFullPath = $this->dataFolder;
+ $singlePublicFileDownload = true;
+
+ // Get only shared DICOM file
+ array_push($dicomFilePaths, $shareNode->getPath());
+ }
+
+ $downloadUrlPrefix = $this->getNextcloudBasePath().'/s/'.$shareToken.'/download';
+ $dicomJson = $this->generateDICOMJson($dicomFilePaths, $selectedFileFullPath, $dicomParentFullPath, $downloadUrlPrefix, true, $singlePublicFileDownload);
+
+ $response = new JSONResponse($dicomJson);
+ return $response;
+ } catch (Exception $exception) {
+ $response = new JSONResponse(array());
+ return $response;
+ }
+ }
+}
diff --git a/lib/Listeners/CSPListener.php b/lib/Listeners/CSPListener.php
new file mode 100755
index 0000000..b338179
--- /dev/null
+++ b/lib/Listeners/CSPListener.php
@@ -0,0 +1,22 @@
+addAllowedFrameDomain('\'self\'');
+ $event->addPolicy($csp);
+ }
+}
diff --git a/lib/Listeners/LoadPublicViewerListener.php b/lib/Listeners/LoadPublicViewerListener.php
new file mode 100755
index 0000000..4feb7e0
--- /dev/null
+++ b/lib/Listeners/LoadPublicViewerListener.php
@@ -0,0 +1,27 @@
+getResponse()->getRenderAs() !== TemplateResponse::RENDER_AS_PUBLIC) {
+ return;
+ }
+
+ Util::addScript(Application::APP_ID, 'dicomviewer-public');
+ }
+}
diff --git a/lib/Listeners/LoadViewerListener.php b/lib/Listeners/LoadViewerListener.php
new file mode 100755
index 0000000..e40dd82
--- /dev/null
+++ b/lib/Listeners/LoadViewerListener.php
@@ -0,0 +1,21 @@
+assertEquals($output, $expected);
+ }
+
+ /**
+ */
+ public function provider()
+ {
+
+ $samples_dir = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'samples'.DIRECTORY_SEPARATOR;
+ $output_dir = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'tests'.DIRECTORY_SEPARATOR;
+
+ $files = array();
+ if ($handle = opendir($samples_dir))
+ {
+ while (false !== ($file = readdir($handle)))
+ {
+ if ($file != "." && $file != ".." && is_file($samples_dir.$file))
+ {
+ $files[] = $file;
+ }
+ }
+ closedir($handle);
+ }
+
+ $data = array();
+ foreach ($files as $file)
+ {
+ $filename = $samples_dir.$file;
+ $dicom = Nanodicom::factory($filename);
+ $data[] = array(
+ $dicom->summary(),
+ file_get_contents($output_dir.$file.'.summary.txt'),
+ );
+ unset($dicom);
+ }
+
+ return $data;
+ }
+
+}
diff --git a/lib/Nanodicom/nanodicom.php b/lib/Nanodicom/nanodicom.php
new file mode 100644
index 0000000..e9e366a
--- /dev/null
+++ b/lib/Nanodicom/nanodicom.php
@@ -0,0 +1,31 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+// Set the full path to the current folder
+define('NANODICOMROOT', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR);
+define('NANODICOMCOREPATH', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'nanodicom'.DIRECTORY_SEPARATOR);
+
+// Require the core class
+require_once NANODICOMCOREPATH.'core.php';
+
+/**
+ * abstract Nanodicom class.
+ *
+ * All tools extend this class. Simple wrapper for Core class.
+ * @package Nanodicom
+ * @category Base
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+abstract class Nanodicom extends Nanodicom_Core {}
diff --git a/lib/Nanodicom/nanodicom/core.php b/lib/Nanodicom/nanodicom/core.php
new file mode 100644
index 0000000..62e12be
--- /dev/null
+++ b/lib/Nanodicom/nanodicom/core.php
@@ -0,0 +1,2361 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+/**
+ * Nanodicom_Core class.
+ *
+ * @package Nanodicom
+ * @category Base
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+abstract class Nanodicom_Core {
+
+ // Release version and codename
+ const VERSION = '1.3.1';
+ const CODENAME = 'Sunny Chiclayo';
+
+ const BIG_ENDIAN = 100;
+ const LITTLE_ENDIAN = 101;
+ const VR_MODE_IMPLICIT = 100;
+ const VR_MODE_EXPLICIT = 101;
+ const IMPLICIT_VR_LITTLE_ENDIAN = '1.2.840.10008.1.2';
+ const EXPLICIT_VR_LITTLE_ENDIAN = '1.2.840.10008.1.2.1';
+ const EXPLICIT_VR_BIG_ENDIAN = '1.2.840.10008.1.2.2';
+ const DEFLATE_TRANSFER_SYNTAX = '1.2.840.10008.1.2.1.99';
+ const GROUP_LENGTH = 0x0000;
+ const METADATA_GROUP = 0x0002;
+ const GROUP_8 = 0x0008;
+ const UNDEFINED_LENGTH = -1;
+ const UNSIGNED = 100;
+ const SIGNED = 101;
+ const SEQUENCE_VR = 'SQ';
+ const ITEMS_GROUP = 0xFFFE;
+ const ITEM = 0xE000;
+ const ITEM_DELIMITER = 0xE00D;
+ const SEQUENCE_DELIMITER = 0xE0DD;
+ const INITIAL = 0; // Not parsed yet.
+ const PARTIAL = 1; // Some tags were read.
+ const SUCCESS = 2; // Is it a DICOM object.
+ const FAILURE = 3; // Not a DICOM object.
+
+ /**
+ * The elements for group 0xFFFE should be Encoded as Implicit VR.
+ * DICOM Standard 09. PS 3.6 - Section 7.5: "Nesting of Data Sets"
+ * @var array item elements
+ */
+ public static $items_elements = array(self::ITEM, self::ITEM_DELIMITER, self::SEQUENCE_DELIMITER);
+
+ /**
+ * @var array default dictionary
+ */
+ public static $default_dictionary = array('UN', '1', 'Unknown');
+
+ /**
+ * @var array list of vr that have the explicit 4 bytes
+ */
+ public static $vr_explicit_4bytes = array('OB', 'OW', 'OF', 'SQ', 'UT', 'UN');
+
+ /**
+ * @var boolean command line environment?
+ */
+ public static $is_cli = FALSE;
+
+ /**
+ * @var boolean Windows environment?
+ */
+ public static $is_windows = FALSE;
+
+ /**
+ * Value Representations (DICOM Standard PS 3.5 Section 6.2)
+ * Bytes = 0 => Undefined length.
+ * Fixed = 1 => Exact field length, otherwise max length.
+ * each array contains: Name, Bytes, Fixed
+ * @var array
+ */
+ public static $vr_array = array(
+ 'AE' => array('Application Entity', 16, 0),
+ 'AS' => array('Age String', 4, 1),
+ 'AT' => array('Attribute Tag', 4, 1),
+ 'CS' => array('Code String', 16, 0),
+ 'DA' => array('Date', 8, 1),
+ 'DS' => array('Decimal String', 16, 0),
+ 'DT' => array('Date Time', 26, 0),
+ 'FL' => array('Floating Point Single', 4, 1),
+ 'FD' => array('Floating Point Double', 8, 1),
+ 'IS' => array('Integer String', 12, 0),
+ 'LO' => array('Long String', 64, 0),
+ 'LT' => array('Long Text', 10240, 0),
+ 'OB' => array('Other Byte String', 0, 0),
+ 'OF' => array('Other Float String', 4294967292, 0),
+ 'OX' => array('Mixed. Other {Byte|Word} String', 0, 0),
+ 'OW' => array('Other Word String', 0, 0),
+ 'PN' => array('Person Name', 64, 0),
+ 'SH' => array('Short String', 16, 0),
+ 'SL' => array('Signed Long', 4, 1),
+ 'SQ' => array('Sequence of Items', 0, 0),
+ 'SS' => array('Signed Short', 2, 1),
+ 'ST' => array('Short Text', 1024, 0),
+ 'TM' => array('Time', 16, 0),
+ 'UI' => array('Unique Identifier UID', 64, 0),
+ 'UL' => array('Unsigned Long', 4, 1),
+ 'UN' => array('Unknown', 0, 0),
+ 'US' => array('Unsigned Short', 2, 1),
+ 'UT' => array('Unlimited Text', 4294967294, 0)
+ );
+
+ /**
+ * Create a new Nanodicom instance. It is usually called from a class extended
+ * from Nanodicom, ie Dumper
+ *
+ * $dicom_object = Nanodicom::factory($location, 'dumper');
+ *
+ * or from Nanodicom itself
+ *
+ * $dicom_object = Nanodicom::factory($location);
+ *
+ * for passing 'blobs', use the second parameter as 'blob'
+ *
+ * $dicom_object = Nanodicom::factory($blob, 'blob');
+ *
+ * @param mixed blob or location of the file
+ * @param string name of the tool to load
+ * @param string type of data passed
+ * @return Dicom_tool A Tool
+ */
+ public static function factory($location, $name = 'simple', $type = 'file')
+ {
+ // Get the parts from the name
+ $parts = explode('_', $name);
+
+ $directory = NANODICOMROOT.'tools'.DIRECTORY_SEPARATOR;
+
+ // Load all the needed files
+ foreach ($parts as $part)
+ {
+ require_once $directory.strtolower($part).'.php';
+ $directory .= strtolower($part).DIRECTORY_SEPARATOR;
+ }
+
+ // Add the Dicom prefix
+ $class = 'Dicom_'.$name;
+
+ return new $class($location, $name, $type);
+ }
+
+ /**
+ * Get the VR mode and endian from a transfer syntax.
+ *
+ * @param string transfer syntax to check
+ * @return array returning the vr mode and endian
+ */
+ public static function decode_transfer_syntax($transfer_syntax)
+ {
+ switch (trim($transfer_syntax))
+ {
+ case self::IMPLICIT_VR_LITTLE_ENDIAN:
+ $vr_mode = self::VR_MODE_IMPLICIT;
+ $endian = self::LITTLE_ENDIAN;
+ break;
+ case self::EXPLICIT_VR_BIG_ENDIAN:
+ $vr_mode = self::VR_MODE_EXPLICIT;
+ $endian = self::BIG_ENDIAN;
+ break;
+ default:
+ $vr_mode = self::VR_MODE_EXPLICIT;
+ $endian = self::LITTLE_ENDIAN;
+ break;
+ }
+ return array($vr_mode, $endian);
+ }
+
+ // Define which function to read integers based on size of integer
+ protected static $_read_int = '_read_int_32';
+
+ // Define which function to write integers based on size of integer
+ protected static $_write_int = '_write_int_32';
+
+ // In case a string was given for vr list, we force to load dictionaries
+ protected $_force_load_dictionary = FALSE;
+
+ // Array of DICOM elements indexed by group and element index. The dataset
+ protected $_dataset = array();
+
+ // Flag indicating if file has DICOM preamble or not. TRUE => DICM, FALSE => Anything else (NEMA?)
+ public $has_dicom_preamble = FALSE;
+
+ // Holds the performance times
+ public $profiler = array();
+
+ // Stores the list of warnings
+ public $warnings = array();
+
+ // Stores the list of errors
+ public $errors = array();
+
+ /**
+ * @var integer Denotes status of given file.
+ * 0 => Initial (Not parsed yet),
+ * 1 => Partial (Some tags were read),
+ * 2 => Success (Is it a DICOM file),
+ * 3 => Failure (Not a DICOM file)
+ */
+ public $status = self::INITIAL;
+
+ // Flag to know if file has been parsed
+ protected $_is_parsed = FALSE;
+
+ // Preamble
+ protected $_preamble;
+
+ // Location of file or 'blob'
+ protected $_location;
+
+ // Metagroup last byte
+ protected $_meta_group_last_byte = -1;
+
+ // Length of the file or blob
+ protected $_file_length;
+
+ // The current pointer in the blob
+ protected $_current_pointer = 0;
+
+ // The meta information group length
+ protected $_meta_information_group_length = NULL;
+
+ // In case we want to read only certain fields
+ protected $_vr_reading_list = array();
+
+ // Transfer Syntax. Defaults to Implicit Little Endian
+ protected $_transfer_syntax = self::IMPLICIT_VR_LITTLE_ENDIAN;
+
+ // Stores the blob
+ protected $_blob = '';
+
+ // For extending the class to use other tools
+ protected $_children;
+
+ // To let the Item know if the data is a Data Set or direct data
+ protected $_parent_vr;
+
+ // Number of parsed elements
+ protected $_counted_elements = 0;
+
+ // Flag to know if Group 8 has been found
+ protected $_found_group_8 = FALSE;
+
+ // Callback to check if we need to stop after certain tags are read
+ protected $_check_list_function = '_dummy';
+
+ // Callback to check deflate
+ protected $_check_deflate_function = '_check_deflate';
+
+ // Callback to check proper endian
+ protected $_check_proper_endian_function = '_check_proper_endian';
+
+ // Number of retries to read oversized lenghts
+ protected $_oversize_retries = 0;
+
+ /**
+ * Create a new Nanodicom instance. It is usually called from a class extended
+ * from core, ie Dumper
+ *
+ * $dicom_object = DICOM_Dumper::factory($location);
+ *
+ * @param mixed file blob or location of the file
+ * @param string the name of the tool created
+ * @param string type of first parameter
+ * @return Nanodicom
+ */
+ public function __construct($location, $name, $type)
+ {
+ // Load necessary files
+ require_once NANODICOMCOREPATH.'exception.php';
+
+ // Load the dictionary
+ require_once NANODICOMCOREPATH.'dictionary.php';
+
+ self::$_read_int = (PHP_INT_SIZE > 4) ? '_read_int_64' : '_read_int_32';
+ self::$_write_int = (PHP_INT_SIZE > 4) ? '_write_int_64' : '_write_int_32';
+
+ if ($type == 'file')
+ {
+ // It is a file
+ $this->_location = $location;
+ }
+ elseif ($type == 'blob')
+ {
+ // It is a blob
+ $this->_location = 'blob';
+ $this->_blob = $location;
+ }
+
+ // To prevent the extension of loaded tool
+ $this->_children[$name] = TRUE;
+
+ // Determine if we are running in a command line environment
+ self::$is_cli = (PHP_SAPI === 'cli');
+
+ // Determine if we are running in a Windows environment
+ self::$is_windows = (DIRECTORY_SEPARATOR === '\\');
+ }
+
+ /**
+ * Returns the name of the loaded file or 'blob'
+ *
+ * @return string name of loaded file or 'blob'
+ */
+ final public function __toString()
+ {
+ return $this->_location;
+ }
+
+ /**
+ * Magic method, calls [Nanodicom::value] with the same parameters. Used to get values by name.
+ *
+ * $transfer_syntax = $dicom_object->transfer_syntax;
+ *
+ * @param string tag element name
+ * @return mixed
+ */
+ public function __get($name)
+ {
+ return $this->value($name);
+ }
+
+ /**
+ * Magic method, calls [Nanodicom::value] with the corresponding group and element based on the tag name.
+ *
+ * $dicom_object->patient_name = 'Anonymous';
+ *
+ * @param string tag element name
+ * @param mixed new value
+ * @return this
+ */
+ public function __set($name, $value)
+ {
+ // Get the proper name
+ $name = $this->_proper_name($name);
+ if (isset(Nanodicom_Dictionary::$dict_by_name[$name]))
+ {
+ list($group, $element) = Nanodicom_Dictionary::$dict_by_name[$name];
+ $this->value($group, $element, $value);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Magic method to unset a tag element. To be used wisely.
+ *
+ * unset($dicom_object->patient_name);
+ *
+ * @param string tag element name
+ * @return this
+ */
+ public function __unset($name)
+ {
+ // Get the proper name
+ $name = $this->_proper_name($name);
+ if (isset(Nanodicom_Dictionary::$dict_by_name[$name]))
+ {
+ list($group, $element) = Nanodicom_Dictionary::$dict_by_name[$name];
+ if (isset($this->_dataset[$group][$element]))
+ {
+ unset($this->_dataset[$group][$element]);
+ }
+
+ // Update the group length if needed
+ $this->_update_group_length($this->_dataset, $group);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Magic method to call an undefined method. It will look for methods on children
+ * Performance is better when called directly
+ *
+ * @param string tag element name
+ * @return mixed|false when the method if found in any children or false in case the method does not exist
+ */
+ public function __call($name, $args)
+ {
+ // Search in children
+ foreach ($this->_children as $child_name => $child_class)
+ {
+ if (is_callable(array($child_class, $name), TRUE) AND method_exists($child_class, $name))
+ {
+ // Method found.
+ return call_user_func_array(array($child_class, $name), $args);
+ }
+ }
+
+ // Nothing found
+ return FALSE;
+ }
+
+ /**
+ * Public method to extend the tool to include other tools.
+ * It is preferable to load the required tool directly. This mechanism is still under
+ * evaluation.
+ *
+ * Unknown results when the object is extended and then manipulated and then extended.
+ *
+ * @param string name of the tool to extend
+ * @return this
+ */
+ public function extend($name)
+ {
+ // Check if children is already set. Does not extend original loaded extension
+ if (isset($this->_children[$name]))
+ return $this;
+
+ // Attach the instance of the new tool to a child
+ $this->_children[$name] = ($this->_location == 'blob')
+ ? self::factory($this->_blob, $name, 'blob')
+ : self::factory($this->_location, $name);
+
+ $this->_children[$name]->_force_load_dictionary = $this->_force_load_dictionary;
+ $this->_children[$name]->_dataset = $this->_dataset;
+ $this->_children[$name]->has_dicom_preamble = $this->has_dicom_preamble;
+ $this->_children[$name]->profiler = $this->profiler;
+ $this->_children[$name]->errors = $this->errors;
+ $this->_children[$name]->warnings = $this->warnings;
+ $this->_children[$name]->status = $this->status;
+ $this->_children[$name]->_check_proper_endian_function = $this->_check_proper_endian_function;
+ $this->_children[$name]->_check_deflate_function = $this->_check_deflate_function;
+ $this->_children[$name]->_is_parsed = $this->_is_parsed;
+ $this->_children[$name]->_found_group_8 = $this->_found_group_8;
+ $this->_children[$name]->_meta_group_last_byte = $this->_meta_group_last_byte;
+ $this->_children[$name]->_current_pointer = 0;
+ $this->_children[$name]->_meta_information_group_length = $this->_meta_information_group_length;
+ $this->_children[$name]->_vr_reading_list = $this->_vr_reading_list;
+ $this->_children[$name]->_transfer_syntax = $this->_transfer_syntax;
+ $this->_children[$name]->_blob = $this->_blob;
+ $this->_children[$name]->_parent_vr = $this->_parent_vr;
+ $this->_children[$name]->_file_length = $this->_file_length;
+ $this->_children[$name]->_preamble = $this->_preamble;
+
+ return $this;
+ }
+
+ /**
+ * Public method to show the profiling time for methods. Profiling names MUST be equal to method names.
+ *
+ * @param string name of the method
+ * @return float the number of seconds used
+ */
+ public function profiler_diff($name, $units = 'ms')
+ {
+ $diff = 0;
+
+ // Get the profiling time is exists in current object
+ if (isset($this->profiler[$name]) AND isset($this->profiler[$name]['start']) AND isset($this->profiler[$name]['end']))
+ {
+ $diff = $this->profiler[$name]['end'] - $this->profiler[$name]['start'];
+ }
+ else
+ {
+ // Otherwise, navigate the children to find it.
+ foreach ($this->_children as $child_name => $child_class)
+ {
+ if (method_exists($child_class, $name) AND is_callable(array($child_class, $name), TRUE))
+ {
+ $diff = $this->_children[$child_name]->profiler[$name]['end'] - $this->_children[$child_name]->profiler[$name]['start'];
+ }
+ }
+ }
+
+ switch ($units)
+ {
+ case 'ms':
+ return $diff*1000;
+ break;
+ default:
+ // This is for seconds
+ return $diff;
+ break;
+ }
+ }
+
+ /**
+ * Returns the last error found
+ *
+ * @return mixed last error found or FALSE otherwise
+ */
+ public function last_error()
+ {
+ return ( ! end($this->errors)) ? end($this->errors) : FALSE;
+ }
+
+ /**
+ * Public method to quickly check if file is DICOM. Does a brute force parse of the object and checks the
+ * returned status.
+ *
+ * @param boolean set to TRUE to allow partially read files
+ * @return boolean true if file was parsed (depends on parameter to check partial reads), false otherwise
+ */
+ public function is_dicom($allow_partial = FALSE)
+ {
+ // Parse the file
+ $this->parse();
+
+ if ($allow_partial)
+ // Check for self::PARTIAL as well is allowing partial
+ return (in_array($this->status, array(self::SUCCESS, self::PARTIAL)));
+
+ // Otherwise, check only for success
+ return (self::SUCCESS == $this->status);
+ }
+
+ /**
+ * Public method to get the transfer syntax used
+ *
+ * @return string trimmed transfer syntax used
+ */
+ public function get_transfer_syntax()
+ {
+ // Parse the file
+ $this->parse();
+
+ // Return the transfer syntax used
+ return trim($this->_transfer_syntax);
+ }
+
+ /**
+ * Public method to flush the object
+ *
+ * @return this
+ */
+ public function flush()
+ {
+ $this->_force_load_dictionary = FALSE;
+ $this->_dataset = array();
+ $this->has_dicom_preamble = FALSE;
+ $this->profiler = array();
+ $this->errors = array();
+ $this->warnings = array();
+ $this->status = self::INITIAL;
+ $this->_is_parsed = FALSE;
+ $this->_meta_group_last_byte = -1;
+ $this->_current_pointer = 0;
+ $this->_meta_information_group_length = NULL;
+ $this->_vr_reading_list = array();
+ $this->_transfer_syntax = self::EXPLICIT_VR_LITTLE_ENDIAN;
+ $this->_blob = '';
+ $this->_parent_vr = '';
+ $this->_file_length = 0;
+ $this->_check_proper_endian_function = '_check_proper_endian';
+
+ return $this;
+ }
+
+ /**
+ * Public method to get and set values, but only values at top level.
+ *
+ * @param mixed either the group or name of the tag
+ * @param mixed either the element or value to set of the tag
+ * @param mixed either the value to set or the create
+ * @param boolean for creating/updating values. true for binary, false everything els
+ * @return mixed|false|void found value or false when tag was not found or not enough arguments or void when setting a value successfully
+ */
+ public function value($group = NULL, $element = NULL, $new_value = NULL, $binary = FALSE)
+ {
+ return $this->dataset_value($this->_dataset, $group, $element, $new_value, $binary);
+ }
+
+ /**
+ * Public method to delete a value using the group and element values
+ *
+ * @param mixed either the group as number or hex string
+ * @param mixed either the element as number or hex string
+ * @return $this
+ */
+ public function delete($group, $element)
+ {
+ $group = is_string($group) ? hexdec($group) : $group;
+ $element = is_string($element) ? hexdec($element) : $element;
+
+ if (isset($this->_dataset[$group][$element]))
+ {
+ unset($this->_dataset[$group][$element]);
+ }
+
+ // Update the group length if needed
+ $this->_update_group_length($this->_dataset, $group);
+
+ return $this;
+ }
+
+ /**
+ * Public static method to get the value from an array. If index does not exist, it returns the default.
+ *
+ * @param array the array to search
+ * @param string the index to look
+ * @param mixed the default value in case index not found
+ * @return mixed Either the found or the default value
+ */
+ public static function array_get($array, $index, $default = '')
+ {
+ if ( isset($array[$index]))
+ return $array[$index];
+
+ return $default;
+ }
+
+ /**
+ * Public method to get the summary of the given file.
+ *
+ * @param string how the output is returned. Either as string (ready to be echoed) or array
+ * @return mixed|false Either a string, array or FALSE (when file is not DICOM)
+ */
+ public function summary($output = 'string')
+ {
+ // Parse the file
+ $this->parse();
+
+ $transfer_syntax = trim($this->get(0x0002, 0x0010, 'UN'));
+ $transfer_syntax .= ($transfer_syntax == 'UN' OR ! array_key_exists($transfer_syntax, Nanodicom_Dictionary::$transfer_syntaxes))
+ ? ' - Unknow'
+ : ' - Parsed using: '.Nanodicom_Dictionary::$transfer_syntaxes[$transfer_syntax][0];
+ //.'. Parsed using: '.Nanodicom_Dictionary::$transfer_syntaxes[$this->_transfer_syntax][0];
+
+ if ($transfer_syntax == 'UN - Unknow')
+ {
+ $transfer_syntax .= ' [Parsed Using: '.$this->_transfer_syntax.' - '
+ .Nanodicom_Dictionary::$transfer_syntaxes[$this->_transfer_syntax][0].']';
+ }
+
+ // Checking for "rows" since that value should be set for images.
+ $has_images = ($this->get(0x0028, 0x0010, 'N/A') != 'N/A') ? 'YES' : 'NO';
+
+ $statuses = array(
+ 'Not parsed yet',
+ 'Partially parsed. Some tags were found',
+ 'Successfully parsed!',
+ 'Failed',
+ );
+
+ $values = array(
+ 'Filename: ' => basename($this->_location),
+ 'Transfer Syntax: ' => $transfer_syntax,
+ 'DICOM file? ' => $statuses[$this->status],
+ 'Has DCM preamble? ' => ($this->has_dicom_preamble === TRUE) ? 'YES' : 'NO',
+ 'Has Metadata? ' => ($this->get(0x0002, 0x0000, FALSE)) ? 'YES' : 'NO',
+ 'Modality: ' => $this->get(0x0008, 0x0060, 'UN'),
+ 'Patient Name: ' => $this->get(0x0010, 0x0010, 'N/A'),
+ 'Images? ' => $has_images,
+ );
+
+ $pixel_representation = array(
+ '0' => 'Unsigned Integer. Only positive values allowed.',
+ '1' => '2\'s complement. Negative and positive allowed.',
+ 'N/A' => 'Not available',
+ );
+
+ $planar_configuration = array(
+ '0' => 'Color-by-pixel: RGB, RGB, RGB..',
+ '1' => 'Color-by-plane: RRR..., GGG..., BBB...',
+ 'N/A' => 'Not available',
+ );
+
+ if ($has_images == 'YES')
+ {
+ $values = $values + array(
+ 'Rows: ' => $this->get(0x0028, 0x0010, 'N/A'),
+ 'Cols: ' => $this->get(0x0028, 0x0011, 'N/A'),
+ 'Samples per pixel: ' => $this->get(0x0028, 0x0002, 'N/A'),
+ 'Bits Allocated: ' => $this->get(0x0028, 0x0100, 'N/A'),
+ 'Bits Stored: ' => $this->get(0x0028, 0x0101, 'N/A'),
+ 'High bit: ' => $this->get(0x0028, 0x0102, 'N/A'),
+ 'Dose scaling: ' => $this->get(0x3004, 0x000E, 'N/A'),
+ 'Window Width: ' => $this->get(0x0028,0x1051, 'N/A'),
+ 'Window Center: ' => $this->get(0x0028,0x1050, 'N/A'),
+ 'Rescale intercept: ' => $this->get(0x0028,0x1052, 'N/A'),
+ 'Rescale slope: ' => $this->get(0x0028,0x1053, 'N/A'),
+ 'Number of Frames: ' => $this->get(0x0028,0x0008, 'N/A'),
+ 'Photometric Inter: ' => $this->get(0x0028,0x0004, 'N/A'),
+ 'Px Representation: ' => $this->get(0x0028,0x0103, 'N/A').' - '.Nanodicom::array_get($pixel_representation, $this->get(0x0028,0x0103, 'N/A'), 'Wrong'),
+ 'Planar Config: ' => $this->get(0x0028,0x0006, 'N/A').' - '.Nanodicom::array_get($planar_configuration, $this->get(0x0028,0x0006, 'N/A'), 'Wrong'),
+ );
+ }
+
+ if ($output == 'string')
+ {
+ $output = '';
+ foreach ($values as $index => $value)
+ {
+ $output .= $index."\t".$value."\n";
+ }
+
+ // Set the output back to values
+ $values = $output;
+ }
+
+ return $values;
+ }
+
+ /**
+ * Public method to get the value of an element.
+ *
+ * @param mixed either the group or name of the tag
+ * @param mixed either the element or value to set of the tag
+ * @param mixed the default value to return if no value found
+ * @param mixed the dataset to use, if not set, used full dataset from parsing
+ * @return mixed|false|void found value or default value
+ */
+ public function get($group = NULL, $element = NULL, $default = NULL, $dataset = NULL)
+ {
+ // Determine the dataset to used. Fallbacks to object dataset
+ $dataset = ($dataset !== NULL) ? $dataset : $this->_dataset;
+ // Get the correspoding value
+ $value = $this->dataset_value($dataset, $group, $element);
+
+ // Return the proper value if correctly set, otherwise the default one
+ return ($value === FALSE OR (is_array($value) AND empty($value))
+ OR (is_string($value) AND trim($value) == '') OR $value === NULL) ? $default : $value;
+ }
+
+ /**
+ * Public method to get items from a sequence.
+ *
+ * Gets items from a sequence
+ * @param array a dataset
+ */
+ public function read_sequence_items( & $dataset)
+ {
+ $group = 0xFFFE;
+ $element = 0xE000;
+
+ if (isset($dataset[$group][$element]))
+ {
+ $total = count($dataset[$group][$element]);
+ $results = array();
+
+ for ($i = 0; $i < $total; $i++)
+ {
+ if ( ! isset($dataset[$group][$element][$i]['done']))
+ {
+ // Read value from blob
+ $this->_read_value_from_blob($dataset[$group][$element][$i], $group, $element);
+ }
+
+ $results[] = $dataset[$group][$element][$i]['ds'];
+ }
+
+ return $results;
+ }
+
+ unset($group, $element);
+
+ return FALSE;
+ }
+
+ /**
+ * Public method to get and set values when passing a dataset.
+ *
+ * It supports retrieving a single element or a dataset for reading values
+ * @param array a dataset
+ * @param mixed either the group or name of the tag
+ * @param mixed either the element or value to set of the tag
+ * @param mixed either the value to set or the create
+ * @param boolean used for update/create, true for binary, false for anything else
+ * @return mixed|false|void found value or false when tag was not found or not enough arguments or void when setting a value successfully
+ */
+ public function dataset_value( & $dataset, $group = NULL, $element = NULL, $new_value = NULL, $binary = FALSE)
+ {
+ // No group set. Return FALSE
+ if ($group == NULL) return FALSE;
+
+ if (is_string($group))
+ {
+ // It is a string
+ $name = $this->_proper_name($group);
+
+ // Move the other arguments to the next
+ $create = $new_value;
+ $new_value = $element;
+
+ // Check if there is an entry in the dictionary
+ if (isset(Nanodicom_Dictionary::$dict_by_name[$name]))
+ {
+ list($group, $element) = Nanodicom_Dictionary::$dict_by_name[$name];
+ }
+ else
+ {
+ // Sorry, no dictionary entry found, cannot read value
+ return FALSE;
+ }
+
+ // Continue with the rest
+ }
+
+ if ($new_value === NULL)
+ {
+ // TODO: Multiplicity values
+ // Reading value. It supports returning datasets too
+ if (isset($dataset[$group][$element]))
+ {
+ if ( ! isset($dataset[$group][$element][0]['done']))
+ {
+ // Read value from blob
+ $this->_read_value_from_blob($dataset[$group][$element][0], $group, $element);
+ }
+
+ // It is a dataset, then return it, otherwise, just the value
+ return (count($dataset[$group][$element][0]['ds']) == 0) ? $dataset[$group][$element][0]['val']
+ : $dataset[$group][$element][0]['ds'];
+ }
+
+ return FALSE;
+ }
+
+ $original_vr = '';
+
+ // Rest of the code is for setting a value (creation or update)
+ if (isset($dataset[$group][$element]))
+ {
+ // Update vr value
+ if ( ! isset($dataset[$group][$element][0]['done']))
+ {
+ // Read value from blob
+ $this->_read_value_from_blob($dataset[$group][$element][0], $group, $element);
+ }
+
+ // This is the vr read from file. Use it as a fallback
+ $original_vr = $dataset[$group][$element][0]['_vr'];
+ }
+
+ // Load the dictionary for this group
+ Nanodicom_Dictionary::load_dictionary($group, TRUE);
+
+ // Grab the vr
+ list($value_representation, $multiplicity, $name) = $this->_decode_vr($group, $element, $original_vr, 0);
+
+ if (is_array($new_value))
+ {
+ // Extract vr and value from array
+ $value_representation = $new_value['vr'];
+ $new_value = $new_value['value'];
+ }
+
+ if (self::$vr_array[$value_representation][2] == 0)
+ {
+ // Finding right length
+ $new_value = (strlen($new_value) % 2 == 0) ? $new_value : $new_value.chr(0);
+ $length = sprintf('%u', strlen($new_value));
+ }
+ else
+ {
+ $length = self::$vr_array[$value_representation][1];
+ }
+
+ // Set the Transfer Syntax UID if needed
+ if ($group == self::METADATA_GROUP AND $element == 0x0010)
+ {
+ $this->_transfer_syntax = trim($new_value);
+ }
+
+ if (isset($dataset[$group][$element]))
+ {
+ // Update the element
+ $dataset[$group][$element][0]['done'] = TRUE;
+ $dataset[$group][$element][0]['val'] = $new_value;
+ $dataset[$group][$element][0]['len'] = $length;
+ $dataset[$group][$element][0]['vr'] = $value_representation;
+ }
+ else
+ {
+ // Create a new element
+ $value = array(
+ 'len' => $length,
+ 'val' => $new_value,
+ 'vr' => $value_representation,
+ '_vr' => $value_representation,
+ 'bin' => $binary,
+ 'off' => 0, // We don't know the offset
+ 'ds' => array(),
+ 'done' => TRUE,
+ );
+
+ $dataset[(int) $group][(int) $element][0] = $value;
+ }
+
+ $this->_update_group_length($dataset, $group);
+ // TODO: Update the length of parent element (SQ or IT)
+
+ unset($group, $element, $new_value);
+ }
+
+ /**
+ * Parses the object.
+ *
+ * If the list of elements has a tag name, dictionaries will be loaded. For performance
+ * is better to pass only arrays of the form:
+ * array(group, element) where group and element are numbers (hex or decimal equivalents or any other base).
+ * @param mixed array for a list of elements tags to read. parsing stops when all found. Or TRUE to force
+ * load dictionaries when parsing. Default is FALSE to avoid reading dictionaries.
+ * @param boolean a flag to test if dicom file has DCM header only.
+ * @return this
+ */
+ public function parse($vr_reading_list = FALSE, $check_dicom_preamble = FALSE)
+ {
+ // If file has been parsed, return right away
+ if ($this->_is_parsed) return $this;
+
+ if (is_array($vr_reading_list))
+ {
+ // Setting the list of elements to look for
+ $this->set_vr_reading_list($vr_reading_list);
+
+ // Setting the function to used after reading each element. Dummy improves performance
+ $this->_check_list_function = (count($vr_reading_list) == 0)? '_dummy' : '_check_list';
+ }
+ elseif (is_bool($vr_reading_list))
+ {
+ $this->load_dictionaries($vr_reading_list);
+ }
+
+ // Do the parse
+ return $this->_parse($check_dicom_preamble);
+ }
+
+ /**
+ * Writes the file to the specified location
+ *
+ * TODO: Throw exceptions in errors
+ * @param string location of the file where the contents will be written
+ * @return this
+ */
+ public function write_file($filename)
+ {
+ file_put_contents($filename, $this->write());
+ return $this;
+ }
+
+ /**
+ * Force to load dictionaries when parsing when TRUE. Otherwise,
+ * __get calls won't be able to return the right values.
+ * Defaults to FALSE.
+ *
+ * @return this
+ */
+ public function load_dictionaries($value = FALSE)
+ {
+ $this->_force_load_dictionary = $value;
+ return $this;
+ }
+
+ /**
+ * Returns a blob of the current dataset
+ * This function will do some corrections:
+ * 1. Make the File Meta Information EXPLICIT VR LITTLE ENDIAN
+ * 2. Convert Known tags to their real Tag values
+ * 3. Prepends preamble if not present (forces it)
+ * 4. [probably] Prepend File Meta Information if not present (future versions)
+ *
+ * @return string binary string of contents
+ */
+ public function write()
+ {
+ if (sprintf('%u', strlen($this->_blob)) > 0)
+ {
+ // Do the parse if not done
+ // But only when the blob is larger than 0, otherwise is considered new file
+ $this->parse();
+ }
+
+ // Profile this task
+ $this->profiler['write']['start'] = microtime(TRUE);
+
+ // Create the preamble
+ if ($this->has_dicom_preamble)
+ {
+ $buffer = $this->_preamble;
+ }
+ else
+ {
+ $buffer = '';
+ for($i = 0; $i < 128; $i++)
+ {
+ $buffer .= 0x0;
+ }
+ }
+
+ // Add the DICM.
+ $buffer .= 'DICM';
+
+ // Sort the keys
+ ksort($this->_dataset);
+
+ // Iterate through the current elements
+ foreach ($this->_dataset as $group => $elements)
+ {
+ // Sort the elements
+ ksort($elements);
+
+ // Through groups
+ foreach ($elements as $element => $indexes)
+ {
+ // Through elements
+ foreach ($indexes as $data)
+ {
+ // Indices. Extra level for multiplicity > 1 (SQ have them a lot!)
+ $buffer .= $this->_write($group, $element, $data);
+ }
+ unset($element, $data);
+ }
+ unset($group, $elements);
+ }
+
+ switch (trim($this->_transfer_syntax))
+ {
+ // deflated DICOM Data Set
+ case self::DEFLATE_TRANSFER_SYNTAX:
+ $metadata_length = (isset($this->_dataset[self::METADATA_GROUP][self::GROUP_LENGTH]))
+ // The 12 bytes are for the Metadata Group Length element itself
+ ? $this->_dataset[self::METADATA_GROUP][self::GROUP_LENGTH][0]['off']
+ + $this->_dataset[self::METADATA_GROUP][self::GROUP_LENGTH][0]['val'] + 12
+ : 0;
+ $buffer = substr($buffer, 0, $metadata_length).gzdeflate(substr($buffer, $metadata_length));
+ break;
+ }
+
+ // Finish the profiling
+ $this->profiler['write']['end'] = microtime(TRUE);
+
+ // Return buffer
+ return $buffer;
+ }
+
+ /**
+ * Public method to set the vrs to read
+ *
+ * @param array a list of elements tags to read. Either names or array of (group,element)
+ * @return this
+ */
+ public function set_vr_reading_list($vr_reading_list)
+ {
+ $list = array();
+ foreach ($vr_reading_list as $tag)
+ {
+ // Acccepts strings and arrays
+ if (is_array($tag))
+ {
+ // This should be an array of group,element. The merged hex values (4 digits) is added to list
+ $list[] = sprintf('0x%04X',$tag[0]).'.'.sprintf('0x%04X',$tag[1]);
+ }
+ else
+ {
+ // If a string is found we force to load the dictionary and add name to list
+ $this->_force_load_dictionary = TRUE;
+ $list[] = $tag;
+ }
+ }
+ $this->_vr_reading_list = $list;
+
+ return $this;
+ }
+
+ /**
+ * Dummy function to be used instead of other time consuming functions.
+ *
+ * @param mixed
+ * @param mixed
+ * @param mixed
+ * @param mixed
+ * @param mixed
+ * @return void
+ */
+ protected function _dummy($arg1 = NULL, $arg2 = NULL, $arg3 = NULL, $arg4 = NULL, $arg5 = NULL)
+ {
+ }
+
+ /**
+ * Updates the group length value if exists
+ *
+ * @param integer the group
+ * @return void
+ */
+ protected function _update_group_length( & $dataset, $group)
+ {
+ if ($this->dataset_value($dataset, $group, self::GROUP_LENGTH) !== FALSE)
+ {
+ // To update the group length value of the group if exists
+ $length = 0;
+ foreach ($dataset[$group] as $element => $group_elements)
+ {
+ foreach ($group_elements as $index => $values)
+ {
+ if ($element == self::GROUP_LENGTH)
+ continue;
+ $length += $values['len'] + 8;
+ }
+ }
+ $dataset[$group][self::GROUP_LENGTH][0]['val'] = $length;
+ }
+ }
+
+ /**
+ * Get the proper name of the tag name. Removes spaces and _, and converts it
+ * to lowercase.
+ *
+ * @param string tag name
+ * @return string the proper name
+ */
+ protected function _proper_name($name)
+ {
+ // Dictionary names are lowercase without _
+ return strtolower(str_replace(array('_', ' '), '', $name));
+ }
+
+ /**
+ * Checks if the given group and element are part of the list of elements to look for.
+ * Stops after all elements are found.
+ *
+ * @param integer the group
+ * @param integer the element
+ * @return boolean true if all elements have been found (finish parsing), false otherwise
+ */
+ protected function _check_list($group, $element)
+ {
+ // If nothing was passed return to continue parsing.
+ if (empty($this->_vr_reading_list))
+ return FALSE;
+
+ if (in_array(sprintf('0x%04X',$group).'.'.sprintf('0x%04X',$element), $this->_vr_reading_list)
+ OR (isset(Nanodicom_Dictionary::$dict[$group][$element])
+ AND in_array(Nanodicom_Dictionary::$dict[$group][$element][2], $this->_vr_reading_list)))
+ {
+ // Element is in list
+ $this->_counted_elements++;
+ }
+
+ return ($this->_counted_elements == count($this->_vr_reading_list)) ? TRUE : FALSE;
+ }
+
+ /**
+ * Check that proper endian is used
+ *
+ * @param integer the group
+ * @param integer the endian mode
+ * @return array the proper group and endian
+ */
+ protected function _check_proper_endian($group, $endian)
+ {
+ if ( ! $this->_found_group_8)
+ {
+ // Group 0x0008 has not been read yet. This is a must!
+ if ($group < self::GROUP_8)
+ return array($group, $endian);
+
+ // Group 0x0008 found.
+ $this->_found_group_8 = TRUE;
+ // From now on, call _check_proper_endian_same function instead.
+ $this->_check_proper_endian_function = '_check_proper_endian_same';
+
+ if ($group > self::GROUP_8)
+ {
+ // Group is bigger than 8
+ // Rewind 2 bytes to re-read the group
+ $this->_rewind(-2);
+ // Reverse to default transfer syntax
+ $this->_transfer_syntax = self::EXPLICIT_VR_LITTLE_ENDIAN;
+ // Set the new endian
+ $endian = self::LITTLE_ENDIAN;
+ // Read correct group value (redoing the read)
+ $group = $this->{self::$_read_int}(2, $endian, 2);
+ }
+ else
+ {
+ // It is equal to 8
+ }
+ }
+
+ return array($group, $endian);
+ }
+
+ /**
+ * Returns the same values passed
+ *
+ * @param integer the group
+ * @param integer the endian mode
+ * @return array the group and endian passed
+ */
+ protected function _check_proper_endian_same($group, $endian)
+ {
+ return array($group, $endian);
+ }
+
+ /**
+ * Decodes the proper vr from the group, element, current vr and length.
+ * The priority order is:
+ * 1) From dictionary
+ * 2) If current vr is a valid vr and not UN or empty, then set as current vr (Explicit mode)
+ * 3) If length is undefined, most likely it is a sequence,
+ * 4) Otherwise is it the default VR ('UN')
+ *
+ * @param integer the group
+ * @param integer the element
+ * @return boolean true if all elements have been found (finish parsing), false otherwise
+ */
+ protected function _decode_vr($group, $element, $vr, $length)
+ {
+ if ( isset(Nanodicom_Dictionary::$dict[$group][$element]))
+ {
+ // Group and Element are listed.
+ // 1) From dictionary
+ list($value_representation, $multiplicity, $name) = Nanodicom_Dictionary::$dict[$group][$element];
+ }
+ else
+ {
+ // Group and Element do not exist. Possible reasons:
+ // - Private Data Element. TODO: Check if it is "odd" group.
+ // - New Data Element not updated in Dictionary. Should be in the case of "even" groups.
+ list($value_representation, $multiplicity, $name) = self::$default_dictionary;
+
+ $value_representation = ( ! in_array($vr, array('', 'UN')) AND array_key_exists($vr, self::$vr_array))
+ // 2) If current VR is valid VR and not UN or empty, then set as current vr (Explicit mode)
+ ? $vr
+ // 3) If length is undefined, most likely it is a sequence,
+ // 4) Otherwise is it the default VR ('UN')
+ : (($length == self::UNDEFINED_LENGTH) ? self::SEQUENCE_VR : $value_representation);
+ }
+ return array($value_representation, $multiplicity, $name);
+ }
+
+ /**
+ * Parsing code
+ *
+ * @param boolean true to check file is dicom, default to false
+ * @return this for chaining
+ */
+ protected function _parse($check_preamble_only = FALSE)
+ {
+ // Profile this task
+ $this->profiler['parse']['start'] = microtime(TRUE);
+
+ // Instantiate the status to Failure
+ $this->status = self::FAILURE;
+
+ if ($check_preamble_only)
+ {
+ // Try reading only first 128 bytes + 4 of DICM
+ try
+ {
+ $this->_read_file(0, 132);
+ }
+ catch (Nanodicom_Exception $e)
+ {
+ $this->errors[] = $e->getMessage();
+ return $this;
+ }
+ }
+ else
+ {
+ // Try reading whole file
+ try
+ {
+ $this->_read_file();
+ }
+ catch (Nanodicom_Exception $e)
+ {
+ $this->errors[] = $e->getMessage();
+ return $this;
+ }
+ }
+
+ // Following 2 calls need to be wrapped in a try/catch to avoid throwing exceptions
+ try
+ {
+ // Test for NEMA or DICOM file.
+ $this->_preamble = $this->_read(128);
+ }
+ catch (Nanodicom_Exception $e)
+ {
+ $this->errors[] = $e->getMessage();
+ return $this;
+ }
+
+ try
+ {
+ // Test to see if has preamble
+ $this->has_dicom_preamble = (bool) ($this->_read(4) == 'DICM');
+ }
+ catch (Nanodicom_Exception $e)
+ {
+ $this->errors[] = $e->getMessage();
+ return $this;
+ }
+
+ // If checking only for DICOM preamble. Return current object
+ if ($check_preamble_only)
+ return $this;
+
+ // Continue with the rest
+ if ( ! $this->has_dicom_preamble)
+ {
+ // Rewinding. No Dicom preamble found
+ $this->_rewind();
+ $this->_transfer_syntax = self::IMPLICIT_VR_LITTLE_ENDIAN;
+ }
+
+ // Read the file
+ while ($this->_read())
+ {
+ // Read a new element with a try/catch block
+ try
+ {
+ $new_element = $this->_read_element();
+ }
+ catch (Nanodicom_Exception $e)
+ {
+ $this->errors[] = $e->getMessage();
+ break;
+ }
+
+ // Add element to dataset
+ $this->_dataset[$new_element[0]][$new_element[1]][] = $new_element[2];
+ // So far partially read at least once
+ $this->status = self::PARTIAL;
+
+ // Check if belongs to Metadata Group
+ if ($new_element[0] == self::METADATA_GROUP)
+ {
+ if ($new_element[1] == self::GROUP_LENGTH)
+ {
+ // Set the meta information group length
+ $this->_meta_information_group_length = $new_element[2]['val'];
+ if ( ! is_int($new_element[2]['val']))
+ {
+ $this->errors[] = strtr('Meta info group length not an integer found in file :file',
+ array(':file' => $this->_location));
+ break;
+ }
+
+ $this->_meta_group_last_byte = $this->_current_pointer + $this->_meta_information_group_length;
+ }
+
+ // Check if the element is actually the Transfer Syntax
+ if ($new_element[1] == 0x0010)
+ {
+ // Set the transfer syntax
+ $this->_transfer_syntax = trim($new_element[2]['val']);
+ if ($this->_transfer_syntax !== self::DEFLATE_TRANSFER_SYNTAX)
+ {
+ // Deflate has been done, don't check again
+ $this->_check_deflate_function = '_dummy';
+ }
+ }
+ }
+
+ // Load dictionary (if necessary)
+ Nanodicom_Dictionary::load_dictionary($new_element[0], $this->_force_load_dictionary);
+
+ if ($this->{$this->_check_list_function}($new_element[0], $new_element[1]))
+ {
+ // All elements found. Done!
+ break;
+ }
+ }
+
+ unset($check_dicom_only, $new_element);
+
+ // Instance parsed, don't do it again
+ $this->_is_parsed = TRUE;
+
+ // Instance successfully read if no errors found
+ if (count($this->errors) == 0)
+ $this->status = self::SUCCESS;
+
+ // Finish the profiling
+ $this->profiler['parse']['end'] = microtime(TRUE);
+
+ // Return the instance
+ return $this;
+ }
+
+ /**
+ * Read an element
+ *
+ * PS 3.10 Page 22 (2009)
+ * Except for the 128 byte preamble and the 4 byte prefix, the File Meta Information shall be encoded using
+ * the Explicit VR Little Endian Transfer Syntax (UID=1.2.840.10008.1.2.1) as defined in DICOM PS 3.5.
+ * Values of each File Meta Element shall be padded when necessary to achieve an even length, as
+ * specified in PS 3.5 by their corresponding Value Representation. The Unknown (UN) Value
+ * Representation shall not be used in the File Meta Information. For compatibility with future versions of this
+ * Standard, any Tag (0002,xxxx) not defined in Table 7.1-1 shall be ignored.
+ *
+ * However, this parser CAN read File Meta Information encoded (wrongly) with Implicit VR Little Endian
+ * TODO: Thow a warning
+ *
+ * This parser handles (incorrectly set) odd lengths as well.
+ *
+ * @return void
+ * @throws Nanodicom_Exception
+ */
+ protected function _read_element()
+ {
+ // Setting some general values
+ $allow_undefined_length = TRUE;
+ $is_binary = FALSE;
+ $value = '';
+ $vr = '';
+ $items = array();
+ $value_representation = 'UN';
+ $offset = $this->_tell();
+
+ // Get the vr_mode and endian from the Transfer Syntax
+ list($vr_mode, $endian) = ($this->_meta_group_last_byte != -1 AND $offset >= $this->_meta_group_last_byte)
+ ? self::decode_transfer_syntax($this->_transfer_syntax)
+ : self::decode_transfer_syntax(self::EXPLICIT_VR_LITTLE_ENDIAN);
+
+ // Reading the group and element value
+ $group = $this->{self::$_read_int}(2, $endian, 2);
+
+ // Rectify endian and transfer syntax if needed
+ list($group, $endian) = $this->{$this->_check_proper_endian_function}($group, $endian);
+ $element = $this->{self::$_read_int}(2, $endian, 2);
+
+ if ($group == self::ITEMS_GROUP AND in_array($element, self::$items_elements))
+ $vr_mode = self::VR_MODE_IMPLICIT;
+
+ // Some VRs accept Undefined Length (0xFFFFFFFF). If they don't they will be changed to FALSE accordingly.
+ // DICOM Standard 09. PS 3.6 - Section 7.1: "Data Elements"
+ if ($vr_mode == self::VR_MODE_EXPLICIT OR $group == self::METADATA_GROUP)
+ {
+ // It is explicit. Next value is the VR.
+ $vr = $this->_read(2);
+
+ // Somehow the VR is not correct. Should we assume it is IMPLICIT?
+ if ( ! array_key_exists($vr, self::$vr_array))
+ {
+ $this->_rewind(-2);
+ $vr = '';
+ $vr_mode = self::VR_MODE_IMPLICIT;
+ }
+ else
+ {
+ // vr exists. This is VR_MODE_EXPLICIT for sure now
+ if (in_array($vr, self::$vr_explicit_4bytes))
+ {
+ // VR is in list. Next 2 bytes should be 0000H (but we don't care)
+ $this->_forward(2);
+
+ // Length is 32-bit unsigned integer
+ $length = $this->{self::$_read_int}(4, $endian, 4);
+
+ if ($vr == 'UT')
+ {
+ // Do not allow undefined length on UT
+ $allow_undefined_length = FALSE;
+ }
+ }
+ else
+ {
+ // Length is next. 16-bit unsigned integer
+ $length = $this->{self::$_read_int}(2, $endian, 2);
+
+ // Explicit and not in list of (OB, OW, OF, SQ, UN, UT) should not allow undefined length
+ $allow_undefined_length = FALSE;
+ }
+ }
+ }
+
+ // Read the length, this is done to allow the fallback to read Implicit when Explicit failed
+ if ($vr_mode == self::VR_MODE_IMPLICIT)
+ {
+ // It is implicit. Next values are length. No guessing
+ $length = $this->{self::$_read_int}(4, $endian, 4);
+ }
+
+ // Checking for Unexpected Undefined lengths
+ if ( ! $allow_undefined_length AND $length == self::UNDEFINED_LENGTH) {
+ throw new Nanodicom_Exception('Unexpected Undefined Length found at [:group][:element]',
+ array(':group' => $group, ':element' => $element), 100);
+ }
+
+ // Odd length. Add to warnings
+ if ($length > 0 AND $length % 2 != 0)
+ $this->warnings[] = 'Found odd length '.$length.' reading Group '.$group.' and Element '.$element;
+
+ // Fast forward if length is set and not Metadata Group
+ if ($length >= 0 AND $group != self::METADATA_GROUP)
+ {
+ // Save the offset to where the value starts
+ $_offset = $this->_tell();
+
+ // Add the pointer to corresponding length
+ $bytes_forwarded = $this->_forward($length);
+
+ if ($bytes_forwarded != $length)
+ {
+ // Need to rewind
+ $this->_rewind(-1*$length);
+ $length = $bytes_forwarded;
+ }
+
+ unset($endian, $vr_mode);
+ return array($group, $element,
+ array('len' => $length,
+ 'val' => $value,
+ 'vr' => $value_representation,
+ '_vr' => $vr,
+ 'bin' => $is_binary,
+ 'off' => $offset,
+ '_off' => $_offset,
+ 'ds' => $items)
+ );
+ }
+
+ // Decode the vr if we made it to here
+ list($value_representation, $multiplicity, $name) = $this->_decode_vr($group, $element, $vr, $length);
+
+ // Read values
+ list($value, $value_representation, $is_binary, $items) = $this->_read_value($vr, $value_representation, $length, $vr_mode, $endian);
+
+ unset($endian, $vr_mode, $multiplicity, $name, $current_pointer, $new_element);
+ return array($group, $element,
+ array('len' => $length,
+ 'val' => $value,
+ 'vr' => $value_representation,
+ '_vr' => $vr,
+ 'bin' => $is_binary,
+ 'off' => $offset,
+ 'ds' => $items,
+ 'done' => TRUE)
+ );
+ }
+
+
+ /**
+ * Read the value from the blob
+ *
+ * @param object the element array
+ * @param integer the group
+ * @param integer the element
+ * @return void
+ */
+ protected function _read_value_from_blob( & $elem, $group, $element)
+ {
+ // Load dictionaries (Forced loading)
+ Nanodicom_Dictionary::load_dictionary($group, TRUE);
+
+ // Save current pointer
+ $current_pointer = $this->_tell();
+
+ // Values have not been read
+ $this->_rewind($elem['_off']);
+
+ // Decode the right VR.
+ list($elem['vr'], $multiplicity, $name)
+ = $this->_decode_vr($group, $element, $elem['_vr'], $elem['len']);
+
+ // Read the value
+ list($elem['val'], $elem['vr'], $elem['bin'], $elem['ds'])
+ = $this->_read_value($elem['_vr'], $elem['vr'], $elem['len'], $this->_transfer_syntax);
+
+ // Element has been read. Set to true
+ $elem['done'] = TRUE;
+
+ // Rewind to previous pointer, we just read and returned everything back to normal
+ $this->_rewind($current_pointer);
+ }
+
+ /**
+ * Read the value of an Tag element accordingly. No numeric values are interpreted. No reading of PN
+ *
+ * @param string the read VR
+ * @param string the obtained VR
+ * @param integer the number of bytes to read
+ * @param mixed either the vr_mode already or the transfer syntax
+ * @param mixed either NULL (not set so decode from transfer syntax), or the endian
+ * @return array a list of $value, $value_representation, $is_binary, $items
+ */
+ protected function _read_value($vr, $value_representation, $length, $vr_mode, $endian = NULL)
+ {
+ // TODO: Check if values so far correspond to dictionary information (VR, length, data type)
+ // TODO: Take care of OF type.
+
+ // Setting some general values
+ $is_binary = FALSE;
+ $value = '';
+ $items = array();
+
+ if ($endian == NULL)
+ {
+ // vr_mode is then transfer syntax. Get proper vr_mode and endian from the Transfer Syntax
+ list($vr_mode, $endian) = self::decode_transfer_syntax($this->_transfer_syntax);
+ }
+
+ // Read values accordingly to VR type (From dictionary);
+ switch ($value_representation)
+ {
+ // Decode Attribute Tag
+ case 'AT':
+ $value = array();
+ for ($i = 0; $i < $length; $i = $i + 4)
+ {
+ $value[] = array($this->{self::$_read_int}(2, $endian, 2), $this->{self::$_read_int}(2, $endian, 2));
+ }
+ break;
+ // Decode numeric values: shorts, longs, floats.
+ case 'UL':
+ $value = $this->{self::$_read_int}(4, $endian, $length);
+ break;
+ case 'SL':
+ $value = $this->{self::$_read_int}(4, $endian, $length, self::SIGNED);
+ break;
+ case 'XS':
+ case 'SS':
+ case 'US':
+ // TODO: Check for the right way to find out US or SS
+ if ($vr == 'US')
+ {
+ $value = $this->{self::$_read_int}(2, $endian, $length);
+ $value_representation = 'US';
+ }
+ else
+ {
+ $value = $this->{self::$_read_int}(2, $endian, $length, self::SIGNED);
+ $value_representation = 'SS';
+ }
+ break;
+ case 'FL':
+ $value = $this->_read_float(4, $length);
+ break;
+ case 'FD':
+ $value = $this->_read_float(8, $length);
+ break;
+ case 'OX':
+ // Check for the right way to find out OB or OW
+ if ($vr_mode == self::VR_MODE_IMPLICIT OR $this->value(0x0028, 0x0100) > 8)
+ {
+ $value_representation = 'OW';
+ }
+ else
+ {
+ $value_representation = 'OB';
+ }
+ case 'OW':
+ case 'OB':
+ // Binary data.
+ switch ($length)
+ {
+ case 0:
+ $value = '';
+ break;
+ case self::UNDEFINED_LENGTH:
+ // The Element has an undefined length. It is a sequence of fragments
+ while ($this->_read())
+ {
+ // Let's iterate
+ // Setting the parent VR as OB, OW or OX, so Items know they should
+ // treat value as data not data sets
+ $this->_parent_vr = $value_representation;
+
+ // Read next element
+ $new_element = $this->_read_element();
+ $items[$new_element[0]][$new_element[1]][] = $new_element[2];
+ // Check for Items Group or Delimeters
+ if ($new_element[0] == Nanodicom::ITEMS_GROUP
+ AND in_array($new_element[1], array(Nanodicom::ITEM_DELIMITER, Nanodicom::SEQUENCE_DELIMITER))) break;
+ }
+ break;
+ default:
+ // It is direct binary data.
+ $value = $this->_read($length);
+ $is_binary = TRUE;
+ break;
+ }
+ break;
+ // It is a Sequence or Item
+ case 'SQ':
+ case 'IT':
+ case 'DI':
+ switch ($length)
+ {
+ case 0:
+ $value = '';
+ break;
+ case self::UNDEFINED_LENGTH:
+ // The Element has an undefined length. Should terminate with a {Sequence|Item} Delimitation Item
+
+ while ($this->_read())
+ {
+ // Let's iterate
+
+ // To let the Item know that value should be treated as Datas Sets
+ $this->_parent_vr = $value_representation;
+
+ $new_element = $this->_read_element();
+ $items[$new_element[0]][$new_element[1]][] = $new_element[2];
+ // Check for Items Group or Delimeters
+ if ($new_element[0] == Nanodicom::ITEMS_GROUP
+ AND in_array($new_element[1], array(Nanodicom::ITEM_DELIMITER, Nanodicom::SEQUENCE_DELIMITER))) break;
+ }
+ break;
+ default:
+ // The length is fixed.
+
+ // Let's check if parent was a binary VR
+ if (in_array($this->_parent_vr, array('OB', 'OW', 'OX')))
+ {
+ // It is an Item from a binary Sequence. Just read the data
+ $value = $this->_read($length);
+ $is_binary = TRUE;
+ }
+ else
+ {
+ // It is an Item from a Sequence. We should read the embedded Data Sets
+
+ // Get current pointer in blob;
+ $current_pointer = $this->_tell();
+
+ // Iterate while file has contents and current pointer is less than given length
+ while ($this->_read() AND ($this->_tell() < $current_pointer + $length))
+ {
+ // Let's iterate
+ $new_element = $this->_read_element();
+ $items[$new_element[0]][$new_element[1]][] = $new_element[2];
+ unset($new_element);
+ }
+ }
+ break;
+ }
+ break;
+ default:
+ switch ($length)
+ {
+ case 0:
+ $value = '';
+ break;
+ case self::UNDEFINED_LENGTH:
+ // The Element has an undefined length. It is a sequence of fragments
+ while ($this->_read())
+ {
+ // Let's iterate
+
+ // Setting the parent VR as OB, OW or OX, so Items know they should
+ // treat value as data not data sets
+ $this->_parent_vr = $value_representation;
+
+ // Read next element
+ $new_element = $this->_read_element();
+ $items[$new_element[0]][$new_element[1]][] = $new_element[2];
+ // Check for Items Group or Delimeters
+ if ($new_element[0] == Nanodicom::ITEMS_GROUP
+ AND in_array($new_element[1], array(Nanodicom::ITEM_DELIMITER, Nanodicom::SEQUENCE_DELIMITER))) break;
+ }
+ break;
+ default:
+ // Made it to here: Read bytes verbatim.
+ $value = $this->_read($length);
+ break;
+ }
+ break;
+ }
+ return array($value, $value_representation, $is_binary, $items);
+ }
+
+ /**
+ * Creates a binary string from the current dataset
+ *
+ * @param integer the group
+ * @param integer the element
+ * @param string the data
+ * @return string the binary string
+ */
+ protected function _write($group, $element, $data)
+ {
+ // Empty buffer
+ $buffer = '';
+
+ // Get the vr_mode (Implicit or Explicit) and the endian (Little or Big)
+ list($vr_mode, $endian) = (($group == self::METADATA_GROUP)
+ ? self::decode_transfer_syntax(self::EXPLICIT_VR_LITTLE_ENDIAN)
+ : self::decode_transfer_syntax($this->_transfer_syntax));
+
+ // Add the group and element
+ $buffer .= $this->{self::$_write_int}($group, 2, $endian, 2);
+ $buffer .= $this->{self::$_write_int}($element, 2, $endian, 2);
+
+ // Get the vr_mode for rest
+ $vr_mode = ($group == self::ITEMS_GROUP AND in_array($element, self::$items_elements))
+ ? self::VR_MODE_IMPLICIT
+ : $vr_mode;
+
+ // Read data if it has been not done
+ if ( ! isset($data['done']))
+ {
+ // Values have not been read
+ $this->_read_value_from_blob($data, $group, $element);
+ }
+
+ $bytes = 4;
+ $vr_index = ($data['vr'] != $data['_vr'] AND ! empty($data['_vr'])) ? '_vr' : 'vr';
+
+ if ($vr_mode == self::VR_MODE_EXPLICIT OR $group == self::METADATA_GROUP)
+ {
+ // For Explicit or Metadata Group
+ $buffer .= $data[$vr_index];
+ if (in_array($data[$vr_index], self::$vr_explicit_4bytes))
+ {
+ $buffer .= chr(0).chr(0);
+ }
+ else
+ {
+ $bytes = 2;
+ }
+ }
+
+ // Setting the length
+ $buffer .= $this->{self::$_write_int}($data['len'], $bytes, $endian, $bytes);
+
+ // Setting the value
+ // TODO: Encode AT properly
+ switch ($data[$vr_index])
+ {
+ // Decode Attribute Tag
+ case 'AT':
+ for ($i = 0; $i < $data['len']; $i = $i + 4)
+ {
+ $index = (int) $i/4;
+ $buffer .= $this->{self::$_write_int}($data['val'][$index][0], 2, $endian, 2)
+ .$this->{self::$_write_int}($data['val'][$index][1], 2, $endian, 2);
+ }
+ break;
+ // Decode numeric values: shorts, longs, floats.
+ case 'UL':
+ $buffer .= $this->{self::$_write_int}($data['val'], 4, $endian, $data['len']);
+ break;
+ case 'US':
+ $buffer .= $this->{self::$_write_int}($data['val'], 2, $endian, $data['len']);
+ break;
+ case 'SL':
+ $buffer .= $this->{self::$_write_int}($data['val'], 4, $endian, $data['len'], self::SIGNED);
+ break;
+ case 'SS':
+ $buffer .= $this->{self::$_write_int}($data['val'], 2, $endian, $data['len'], self::SIGNED);
+ break;
+ case 'FL':
+ $buffer .= $this->_write_float($data['val'], 4, $data['len']);
+ break;
+ case 'FD':
+ $buffer .= $this->_write_float($data['val'], 8, $data['len']);
+ break;
+ case 'OW':
+ case 'OB':
+ case 'OX':
+ // Binary data.
+ switch ($data['len'])
+ {
+ case 0:
+ // Nothing to add
+ break;
+ case self::UNDEFINED_LENGTH:
+ // The Element has an undefined length. Let's get the rest from the items
+
+ // Setting the parent VR as OB, OW or OX, so Items know they should
+ // treat value as data not data sets
+ $this->_parent_vr = $data[$vr_index];
+
+ // Sort the keys
+ ksort($data['ds']);
+
+ // Iterate through the current elements
+ foreach ($data['ds'] as $ds_group => $ds_elements)
+ {
+ // Sort the elements
+ ksort($ds_elements);
+
+ // Through groups
+ foreach ($ds_elements as $ds_element => $ds_indexes)
+ {
+ // Through elements
+ foreach ($ds_indexes as $ds_data)
+ {
+ // Through indexes
+ $buffer .= $this->_write($ds_group, $ds_element, $ds_data);
+ unset($ds_data);
+ }
+ unset($ds_element, $ds_indexes);
+ }
+ unset($ds_group, $ds_elements);
+ }
+ break;
+ default:
+ // It is direct binary data.
+ $buffer .= $data['val'];
+ break;
+ }
+ break;
+ // It is a Sequence or Item
+ case 'SQ':
+ case 'IT':
+ case 'DI':
+ switch ($data['len'])
+ {
+ case 0:
+ // Nothing to add
+ break;
+ case self::UNDEFINED_LENGTH:
+ // The Element has an undefined length. Let's get the rest from the items
+
+ // To let the Item know that value should be treated as Datas Sets
+ $this->_parent_vr = $data[$vr_index];
+
+ // Sort the keys
+ ksort($data['ds']);
+
+ // Iterate through the current elements
+ foreach ($data['ds'] as $ds_group => $ds_elements)
+ {
+ // Sort the elements
+ ksort($ds_elements);
+
+ // Through groups
+ foreach ($ds_elements as $ds_element => $ds_indexes)
+ {
+ // Through elements
+ foreach ($ds_indexes as $ds_data)
+ {
+ // Through indexes
+ $buffer .= $this->_write($ds_group, $ds_element, $ds_data);
+ unset($ds_data);
+ }
+ unset($ds_element, $ds_indexes);
+ }
+ unset($ds_group, $ds_elements);
+ }
+ break;
+ default:
+ // The length is fixed.
+
+ // Let's check if parent was a binary VR
+ if (count($data['ds']) == 0)
+ {
+ // It is an Item from a binary Sequence. Just write the data
+ $buffer .= $data['val'];
+ }
+ else
+ {
+ // It is an Item from a Sequence. We should read the embedded Data Sets
+ $new_length = 0;
+
+ // Sort the keys
+ ksort($data['ds']);
+
+ // Iterate through the current elements
+ foreach ($data['ds'] as $ds_group => $ds_elements)
+ {
+ // Sort the elements
+ ksort($ds_elements);
+
+ // Through groups
+ foreach ($ds_elements as $ds_element => $ds_indexes)
+ {
+ // Through elements
+ foreach ($ds_indexes as $ds_data)
+ {
+ // Through indexes
+ $new_buffer = $this->_write($ds_group, $ds_element, $ds_data);
+ $new_length += strlen($new_buffer);
+ $buffer .= $new_buffer;
+ unset($ds_data, $new_buffer);
+ }
+ unset($ds_element, $ds_indexes);
+ }
+ unset($ds_group, $ds_elements);
+ }
+
+ // Update the length based on data just stored. Calculate length first
+ $length = $this->{self::$_write_int}($new_length, $bytes, $endian, $bytes);
+ // Replace length with new value. Sweet!
+ $buffer = substr($buffer, 0, -1 * $new_length - $bytes).$length.substr($buffer, -1 * $new_length);
+ }
+
+ break;
+ }
+ break;
+ default: // Made it to here: Write bytes verbatim.
+ $buffer .= $data['val'];
+ break;
+ }
+
+ return $buffer;
+ }
+
+ /**
+ * Reads an integer for 64-bit machines
+ *
+ * @param integer the bytes needed per integer
+ * @param integer the endian mode: Little or Big Endian
+ * @param integer the number of bytes to read
+ * @param integer the sign
+ * @param string if present, a binary string, otherwise, read from file
+ * @return mixed a single value or an array
+ */
+ protected function _read_int_64($bytes, $endian, $length, $sign = self::UNSIGNED, $data = NULL)
+ {
+ // Do actual reading at 32 bits
+ $values = $this->_read_int_32($bytes, $endian, $length, $sign, $data);
+
+ if ( ! is_array($values))
+ {
+ // It is a single value. Check and return. 2147483647 = 2^31 - 1;
+ return ($values > 2147483647) ? -1 : $values;
+ }
+
+ // Is array, check its values and change accordingly
+ for($i = 1, $count = count($values); $i <= $count; $i++)
+ {
+ $values['val'.$i] = ($values['val'.$i] > 2147483647) ? -1 : $values['val'.$i];
+ }
+
+ return $values;
+ }
+
+ /**
+ * Reads integers
+ *
+ * @param integer the bytes needed per integer
+ * @param integer the endian mode: Little or Big Endian
+ * @param integer the number of bytes to read
+ * @param integer the sign
+ * @param string if present, a binary string, otherwise, read from file
+ * @return mixed a single value or an array
+ */
+ protected function _read_int_32($bytes, $endian, $length, $sign = self::UNSIGNED, $data = NULL)
+ {
+ // In case the file said 0 for the length?
+ // TODO: Raise a warning
+
+ // Get the right format
+ $format = ($sign == self::SIGNED)
+ ? (($bytes == 2) ? 's' : (($bytes == 4) ? 'l' : 'c'))
+ : (($bytes == 2) ? (($endian == self::BIG_ENDIAN) ? 'n' : 'v' )
+ : (($bytes == 4) ? (($endian == self::BIG_ENDIAN) ? 'N' : 'V') : 'C'));
+
+ // TODO: Check for buffer size (avoid overflow)
+ $buffer = ($data == NULL) ? $this->_read($length) : $data;
+ $format = $format.($length/$bytes).'val';
+ $values = unpack($format, $buffer);
+
+ unset ($format, $buffer);
+
+ // Return either a value or an array
+ return ($length == $bytes) ? $values['val'] : $values;
+ }
+
+ /**
+ * Writes an integer for 64-bit machines. Uses 32-bit function
+ *
+ * @param integer the new value
+ * @param integer the bytes needed per integer
+ * @param integer the endian mode: Little or Big Endian
+ * @param integer the number of bytes to read
+ * @param integer the sign
+ * @return string the binary value
+ */
+ protected function _write_int_64($value, $bytes, $endian, $length, $sign = self::UNSIGNED)
+ {
+ if ($value == -1)
+ {
+ return ($bytes == 2) ? chr(0xFF).chr(0xFF) : chr(0xFF).chr(0xFF).chr(0xFF).chr(0xFF);
+ }
+
+ return $this->_write_int_32($value, $bytes, $endian, $length, $sign);
+ }
+
+ /**
+ * Writes an integer for 32-bit machines.
+ *
+ * @param integer the new value
+ * @param integer the bytes needed per integer
+ * @param integer the endian mode: Little or Big Endian
+ * @param integer the number of bytes to read
+ * @param integer the sign
+ * @return string the binary value
+ */
+ protected function _write_int_32($value, $bytes, $endian, $length, $sign = self::UNSIGNED)
+ {
+ if ($length == 0) return '';
+
+ $format = ($sign == self::SIGNED)
+ ? (($bytes == 2) ? 's' : 'l')
+ : (($bytes == 2) ? (($endian == self::BIG_ENDIAN) ? 'n' : 'v' ) : (($endian == self::BIG_ENDIAN) ? 'N' : 'V'));
+
+ if (is_array($value))
+ {
+ $result = '';
+ foreach ($value as $val)
+ {
+ $result .= pack($format, $val);
+ }
+ return $result;
+ }
+ else
+ {
+ return pack($format, $value);
+ }
+ }
+
+ /**
+ * Reads a float
+ *
+ * @param integer number of bytes to read per float
+ * @param integer total length to read
+ * @param integer the sign
+ * @return mixed a float or an array of floats
+ */
+ protected function _read_float($bytes, $length)
+ {
+ // In case the file said 0 for the length?
+
+ $format = ($bytes == 4) ? 'f' : 'd';
+
+ // TODO: Check for buffer size (avoid overflow)
+ $buffer = $this->_read($length);
+ $format = $format.($length / $bytes).'val';
+ $values = unpack($format, $buffer);
+
+ unset ($format, $buffer);
+
+ return ($length == $bytes) ? $values['val'] : $values;
+ }
+
+ /**
+ * Writes a float
+ *
+ * @param integer the new value
+ * @param integer the bytes needed per integer
+ * @param integer the number of bytes to read
+ * @return string the binary value
+ */
+ protected function _write_float($value, $bytes, $length)
+ {
+ if ($length == 0) return '';
+
+ $format = ($bytes == 4) ? 'f' : 'd';
+
+ if (is_array($value))
+ {
+ // Multiple values
+ $result = '';
+ foreach ($value as $val)
+ {
+ $result .= pack($format, $val);
+ }
+ return $result;
+ }
+ else
+ {
+ // Single value
+ return pack($format, $value);
+ }
+ }
+
+ /**
+ * Set the current_pointer to a given value
+ *
+ * @param integer the new position, defaults to beginning of file
+ * @return void
+ */
+ protected function _rewind($position = 0)
+ {
+ if ($position < 0)
+ {
+ // If negative substract from current position (rewind)
+ $this->_current_pointer += $position;
+ }
+ else
+ {
+ // If positive set to that position
+ $this->_current_pointer = $position;
+ }
+ }
+
+ /**
+ * Moves the current_pointer forward
+ *
+ * @param integer number of bytes to move forward
+ * @return void
+ */
+ protected function _forward($offset)
+ {
+ $increment = $offset;
+ $offset = $this->_current_pointer + $offset;
+
+ // Check if after forwarding with offset still within limits of DICOM object
+ if ($offset > $this->_file_length)
+ {
+ if ($this->_oversize_retries > 0)
+ {
+ $missing_bytes = $offset - $this->_file_length;
+ throw new Nanodicom_Exception('End of file :file has been reached. File size is :filesize, failed to allocate :missing bytes at byte :byte'
+ , array(':file' => $this->_location, ':filesize' => $this->_file_length,
+ ':missing' => $missing_bytes, ':byte' => sprintf('0x%04X',$this->_current_pointer)), 3);
+ }
+ else
+ {
+ // Blew up first time
+ $this->warnings[] = 'Retry file overflow while forwarding file pointer';
+ $this->_oversize_retries++;
+ $increment = 0;
+ }
+ }
+
+ // Otherwise is fine to add the offest to current_pointer
+ $this->_current_pointer = $offset;
+ return $increment;
+ }
+
+ /**
+ * Finds current position of pointer
+ *
+ * @return integer current position of pointer
+ */
+ protected function _tell()
+ {
+ return $this->_current_pointer;
+ }
+
+ /**
+ * Read file or blob accordingly
+ *
+ * @param integer starting byte for reading
+ * @param mixed how many bytes to read
+ * @return void
+ * @throws Nanodicom_Exception
+ */
+ protected function _read_file($starting_byte = 0, $length = NULL)
+ {
+ // Read contents
+ if ($this->_location == 'blob')
+ {
+ // There is no filename, it is a blob
+
+ // Read the lenght of the blob
+ $this->_file_length = sprintf('%u', strlen($this->_blob));
+
+ // Define the number of bytes to read
+ $length = ($length === NULL) ? $this->_file_length : $length;
+
+ // Read the whole file
+ $this->_blob = substr($this->_blob, $starting_byte, $length);
+
+ unset($length, $starting_byte);
+ }
+ else
+ {
+ // It is a file
+
+ // Checking if file exists
+ if ( ! (file_exists($this->_location) AND is_file($this->_location)))
+ throw new Nanodicom_Exception('File :file does not exist', array(':file' => $this->_location), 0);
+
+ // Opening handler for reading
+ $file_handle = fopen($this->_location, 'rb');
+
+ // Checking if file can be opened
+ if ( ! $file_handle)
+ throw new Nanodicom_Exception('File :file cannot be opened', array(':file' => $this->_location), 1);
+
+ // Safely read long file values
+ $this->_file_length = sprintf('%u', filesize($this->_location));
+
+ // Set the file position if needed
+ if ($starting_byte != 0)
+ fseek($file_handle, $starting_byte);
+
+ // Define the number of bytes to read
+ $length = ($length === NULL) ? $this->_file_length : $length;
+
+ if ($length <= 0)
+ throw new Nanodicom_Exception('Length :length found at file :file at byte :byte',
+ array(':length' => $length, ':file' => $this->_location, ':byte' => sprintf('0x%04X',$starting_byte)), 2);
+
+ // Read the specified number of bytes
+ try
+ {
+ $this->_blob = fread($file_handle, $length);
+ }
+ catch (Exception $e)
+ {
+ throw new Nanodicom_Exception('Error occured. Reading :length from file :file at byte :byte got an error',
+ array(':length' => $length, ':file' => $this->_location, ':byte' => sprintf('0x%04X',$starting_byte)), 3);
+ }
+
+ // Close the file
+ fclose($file_handle);
+
+ unset($file_handle, $length, $starting_byte);
+ }
+ }
+
+ /**
+ * Reads specified number of bytes from blob, or checks if there is still data
+ * left to be read
+ *
+ * @param integer number of bytes to read or NULL
+ * @return boolean|string boolean when checking if there is still data or a binary string otherwise
+ * @throws Nanodicom_Exception
+ */
+ protected function _read($length = NULL)
+ {
+ if ($length === NULL)
+ {
+ // A quick way to check if file has reached its end or not.
+ return ($this->_current_pointer >= $this->_file_length) ? FALSE : TRUE;
+ }
+
+ // Inflating a deflated DICOM Data Set
+ $this->{$this->_check_deflate_function}();
+
+ // Save the current pointer location as starting byte
+ $starting_byte = $this->_current_pointer;
+ // Increase the reading pointer
+ $this->_current_pointer += $length;
+
+ if ($this->_current_pointer > $this->_file_length)
+ {
+ $missing_bytes = $this->_current_pointer - $this->_file_length;
+ throw new Nanodicom_Exception('End of file :file has been reached. File size is :filesize, failed to allocate :missing bytes at byte :byte'
+ , array(':file' => $this->_location, ':filesize' => $this->_file_length,
+ ':missing' => $missing_bytes, ':byte' => sprintf('0x%04X',$starting_byte)), 3);
+ }
+
+ if ($this->_current_pointer < 0)
+ throw new Nanodicom_Exception('Trying to read negative bytes on file :file', array(':file' => $this->_location), 4);
+
+ // Return the bytes requested
+ return substr($this->_blob, $starting_byte, $length);
+ }
+
+ protected function _check_deflate()
+ {
+ if ($this->_meta_information_group_length !== NULL AND $this->_current_pointer == $this->_meta_group_last_byte
+ AND $this->_transfer_syntax == self::DEFLATE_TRANSFER_SYNTAX)
+ {
+ $this->_original_blob = $this->_blob;
+ $uncompressed = gzinflate(substr($this->_blob, $this->_current_pointer, $this->_file_length - $this->_current_pointer));
+ $this->_file_length = $this->_current_pointer + strlen($uncompressed);
+ $this->_blob = substr($this->_blob, 0, $this->_current_pointer).$uncompressed;
+ $this->_check_deflate_function = '_dummy';
+ }
+ }
+
+} // End Nanodicom
diff --git a/lib/Nanodicom/nanodicom/dict/0X300E.php b/lib/Nanodicom/nanodicom/dict/0X300E.php
new file mode 100644
index 0000000..020be93
--- /dev/null
+++ b/lib/Nanodicom/nanodicom/dict/0X300E.php
@@ -0,0 +1,6 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+ /**
+ * Nanodicom_Dictionary class.
+ * @package Nanodicom
+ * @category Base
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+class Nanodicom_Dictionary
+{
+ public static $dict;
+ public static $dict_by_name;
+
+ public static $transfer_syntaxes = array(
+ '1.2.840.10008.1.2' => array('Implicit VR Little Endian: Default Transfer Syntax for DICOM'),
+ '1.2.840.10008.1.2.1' => array('Explicit VR Little Endian'),
+ '1.2.840.10008.1.2.1.99' => array('Deflated Explicit VR Little Endian'),
+ '1.2.840.10008.1.2.2' => array('Explicit VR Big Endian'),
+ '1.2.840.10008.1.2.4.50' => array('JPEG Baseline (Process 1): Default Transfer Syntax for Lossy JPEG 8 Bit Image Compression'),
+ '1.2.840.10008.1.2.4.51' => array('JPEG Extended (Process 2 & 4): Default Transfer Syntax for Lossy JPEG 12 Bit Image Compression (Process 4 only)'),
+ '1.2.840.10008.1.2.4.52' => array('JPEG Extended (Process 3 & 5)'), // RET
+ '1.2.840.10008.1.2.4.53' => array('JPEG Spectral Selection, Non-Hierarchical (Process 6 & 8)'), // RET
+ '1.2.840.10008.1.2.4.54' => array('JPEG Spectral Selection, Non-Hierarchical (Process 7 & 9)'), // RET
+ '1.2.840.10008.1.2.4.55' => array('JPEG Full Progression, Non-Hierarchical (Process 10 & 12)'), // RET
+ '1.2.840.10008.1.2.4.56' => array('JPEG Full Progression, Non-Hierarchical (Process 11 & 13)'), // RET
+ '1.2.840.10008.1.2.4.57' => array('JPEG Lossless, Non-Hierarchical (Process 14)'),
+ '1.2.840.10008.1.2.4.58' => array('JPEG Lossless, Non-Hierarchical (Process 15)'), // RET
+ '1.2.840.10008.1.2.4.59' => array('JPEG Extended, Hierarchical (Process 16 & 18)'), // RET
+ '1.2.840.10008.1.2.4.60' => array('JPEG Extended, Hierarchical (Process 17 & 19)'), // RET
+ '1.2.840.10008.1.2.4.61' => array('JPEG Spectral Selection, Hierarchical (Process 20 & 22)'), // RET
+ '1.2.840.10008.1.2.4.62' => array('JPEG Spectral Selection, Hierarchical (Process 21 & 23)'), // RET
+ '1.2.840.10008.1.2.4.63' => array('JPEG Full Progression, Hierarchical (Process 24 & 26)'), // RET
+ '1.2.840.10008.1.2.4.64' => array('JPEG Full Progression, Hierarchical (Process 25 & 27)'), // RET
+ '1.2.840.10008.1.2.4.65' => array('JPEG Lossless, Hierarchical (Process 28)'), // RET
+ '1.2.840.10008.1.2.4.66' => array('JPEG Lossless, Hierarchical (Process 29)'), // RET
+ '1.2.840.10008.1.2.4.70' => array('JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 array(Selection Value 1)): Default Transfer Syntax for Lossless JPEG Image Compression'),
+ '1.2.840.10008.1.2.4.80' => array('JPEG-LS Lossless Image Compression'),
+ '1.2.840.10008.1.2.4.81' => array('JPEG-LS Lossy (Near-Lossless) Image Compression'),
+ '1.2.840.10008.1.2.4.90' => array('JPEG 2000 Image Compression (Lossless Only)'),
+ '1.2.840.10008.1.2.4.91' => array('JPEG 2000 Image Compression'),
+ '1.2.840.10008.1.2.4.92' => array('JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only)'),
+ '1.2.840.10008.1.2.4.93' => array('JPEG 2000 Part 2 Multi-component Image Compression'),
+ '1.2.840.10008.1.2.4.94' => array('JPIP Referenced'),
+ '1.2.840.10008.1.2.4.95' => array('JPIP Referenced Deflate'),
+ '1.2.840.10008.1.2.4.100' => array('MPEG2 Main Profile @ Main Level'),
+ '1.2.840.10008.1.2.4.101' => array('MPEG2 Main Profile @ High Level'),
+ '1.2.840.10008.1.2.5' => array('RLE Lossless'),
+ '1.2.840.10008.1.2.6.1' => array('RFC 2557 MIME encapsulation'),
+ '1.2.840.10008.1.2.6.2' => array('XML Encoding'),
+ );
+
+ // Array that holds which dictionaries have been loaded
+ protected static $_loaded_dictionaries = array();
+
+ // Make sure it only loads 1 time
+ protected static $_loaded = FALSE;
+
+ /**
+ * Loads the dictionary of the group into memory. Dictionaries are load by group
+ * to allow easy extension for private groups but primarily for performance issues.
+ * Many groups are rarely used, thus loading them wastes resources.
+ *
+ * @param integer the group of the dictionary to load
+ * @param mixed the vr_mode or to force to load the dictionary
+ * @return void other times
+ */
+ public static function load_dictionary($group, $force = FALSE)
+ {
+ // Only continue if we are forced to load the dictionary (when a string was passed to
+ // the $this->_vr_reading_list) or when is has been explicitly said so (setting second
+ // argument to TRUE)
+ // Thus, it returns right away if neither of those are set
+ if ( ! $force) return;
+
+ // Let's load dictionary if it was not loaded yet
+ if (! isset(self::$_loaded_dictionaries[$group])
+ AND file_exists(NANODICOMROOT.DIRECTORY_SEPARATOR.'nanodicom'.DIRECTORY_SEPARATOR.'dict'.DIRECTORY_SEPARATOR.sprintf('0x%04X',$group).'.php'))
+ {
+ // Load the dictionary
+ require_once(NANODICOMROOT.DIRECTORY_SEPARATOR.'nanodicom'.DIRECTORY_SEPARATOR.'dict'.DIRECTORY_SEPARATOR.sprintf('0x%04X',$group).'.php');
+
+ // Some dictionaries could be empty
+ if (isset(Nanodicom_Dictionary::$dict[$group]) AND count(Nanodicom_Dictionary::$dict[$group]) > 0)
+ {
+ // Load the corresponding lookup table for names
+ foreach (Nanodicom_Dictionary::$dict[$group] as $dict_element => $dict_data)
+ {
+ Nanodicom_Dictionary::$dict_by_name[strtolower($dict_data[2])] = array($group, $dict_element);
+ unset($dict_element, $dict_data);
+ }
+ }
+
+ // Dictionary was loaded
+ self::$_loaded_dictionaries[$group] = TRUE;
+ }
+ }
+
+ /**
+ * Create a new Nanodicom_Dictionary instance. There should be only 1 instance running at all times
+ *
+ * @return void
+ */
+ function __construct()
+ {
+ if (self::$_loaded) return;
+ // Load this class only once
+ self::$_loaded = TRUE;
+
+ // Group 0x0002
+ Nanodicom_Dictionary::$dict[0x0002][0x0000] = array('UL', '1', 'MetaElementGroupLength');
+ Nanodicom_Dictionary::$dict[0x0002][0x0001] = array('OB', '1', 'FileMetaInformationVersion');
+ Nanodicom_Dictionary::$dict[0x0002][0x0002] = array('UI', '1', 'MediaStorageSOPClassUID');
+ Nanodicom_Dictionary::$dict[0x0002][0x0003] = array('UI', '1', 'MediaStorageSOPInstanceUID');
+ Nanodicom_Dictionary::$dict[0x0002][0x0010] = array('UI', '1', 'TransferSyntaxUID');
+ Nanodicom_Dictionary::$dict[0x0002][0x0012] = array('UI', '1', 'ImplementationClassUID');
+ Nanodicom_Dictionary::$dict[0x0002][0x0013] = array('SH', '1', 'ImplementationVersionName');
+ Nanodicom_Dictionary::$dict[0x0002][0x0016] = array('AE', '1', 'SourceApplicationEntityTitle');
+ Nanodicom_Dictionary::$dict[0x0002][0x0100] = array('UI', '1', 'PrivateInformationCreatorUID');
+ Nanodicom_Dictionary::$dict[0x0002][0x0102] = array('OB', '1', 'PrivateInformation');
+ // Group 0xFFFE
+ // IT = Item
+ // DI = Delimitation Item
+ Nanodicom_Dictionary::$dict[0xFFFE][0xE000] = array('IT', '1', 'Item');
+ Nanodicom_Dictionary::$dict[0xFFFE][0xE00D] = array('DI', '1', 'ItemDelimitationItem');
+ Nanodicom_Dictionary::$dict[0xFFFE][0xE0DD] = array('DI', '1', 'SequenceDelimitationItem');
+
+ // Minimum set of groups loaded
+ Nanodicom_Dictionary::$_loaded_dictionaries[0x0002] = TRUE;
+ Nanodicom_Dictionary::$_loaded_dictionaries[0xFFFE] = TRUE;
+ }
+
+}
+
+new Nanodicom_Dictionary;
diff --git a/lib/Nanodicom/nanodicom/exception.php b/lib/Nanodicom/nanodicom/exception.php
new file mode 100644
index 0000000..86f4e22
--- /dev/null
+++ b/lib/Nanodicom/nanodicom/exception.php
@@ -0,0 +1,62 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+/**
+ * Nanodicom_Extension class.
+ *
+ * Own class for exception. Many lines of code taken from the {http://www.kohanaframework.org
+ * Kohana framework}
+ * @package Nanodicom
+ * @category Base
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+class Nanodicom_Exception extends Exception {
+
+ /**
+ * Creates a new translated exception.
+ *
+ * throw new Nanodicom_Exception('Something went terrible wrong, :user',
+ * array(':user' => $user));
+ *
+ * @param string error message
+ * @param array translation variables
+ * @param integer the exception code
+ * @return void
+ */
+ public function __construct($message, array $variables = NULL, $code = 0)
+ {
+ // Set the message
+ $message = empty($variables) ? $message : strtr($message, $variables);
+
+ // Pass the message to the parent
+ parent::__construct($message, $code);
+ }
+
+ /**
+ * Magic object-to-string method.
+ *
+ * Get a single line of text representing the exception:
+ * echo $exception;
+ * Error [ Code ]: Message
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('%s [ %s ]: %s',
+ get_class($this), $this->getCode(), strip_tags($this->getMessage()));
+ }
+
+} // End Nanodicom_Exception
diff --git a/lib/Nanodicom/tools/anonymizer.php b/lib/Nanodicom/tools/anonymizer.php
new file mode 100644
index 0000000..394204f
--- /dev/null
+++ b/lib/Nanodicom/tools/anonymizer.php
@@ -0,0 +1,219 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+/**
+ * Dicom_Anonymizer class.
+ *
+ * Extends Nanodicom. It overwrites certain file tags. Fully extensible.
+ * @package Nanodicom
+ * @category Tools
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+class Dicom_Anonymizer extends Nanodicom {
+
+ const RETURN_BLOB = 0;
+
+ // Very basic tag elements to anonymize
+ protected static $_basic = array(
+ array(0x0008, 0x0020, '{date|Ymd}'), // Study Date
+ array(0x0008, 0x0021, '{date|Ymd}'), // Series Date
+ array(0x0008, 0x0090, 'physician{random}'), // Referring Physician
+ array(0x0010, 0x0010, 'patient{consecutive}'), // Patient Name
+ array(0x0010, 0x0020, 'id{consecutive}'), // Patient ID
+ );
+
+ // The mapped values
+ protected $_map;
+
+ // The tags to use
+ protected $_tags;
+
+ // The case sensitivity of the mapping
+ protected static $case = 'insensitive';
+
+ /**
+ * Anonymizes the dataset
+ *
+ * @param mixed NULL or an array to overwrite defaults
+ * @param array a set of values to be used for mapping (higher preference than replacement)
+ * Each entry has 4 values:
+ * group = group of tag element
+ * element = element of the tag element
+ * value = the expect value to be matched (trimmed)
+ * assignment = the new replacement value for the given tag element and found value combined
+ * @param integer the mode
+ * @return string the anonymized dataset
+ */
+ public function anonymize($tags = NULL, $map = NULL, $mode = self::RETURN_BLOB)
+ {
+ $tags = ($tags == NULL) ? self::$_basic : $tags;
+ $this->parse();
+ $this->profiler['anonymize']['start'] = microtime(TRUE);
+
+ // Set the tags
+ foreach ($tags as $entry)
+ {
+ list($group, $element, $replacement) = $entry;
+ $this->_tags[$group][$element] = $replacement;
+ }
+
+ if ($map !== NULL)
+ {
+ // Values were passed to be mapped
+ foreach ($map as $entry)
+ {
+ // Each entry has 4 values:
+ // group = group of tag element
+ // element = element of the tag element
+ // value = the expect value to be matched (trimmed)
+ // assignment = the new replacement value for the given tag element and found value combined
+ list ($group, $element, $value, $assignment) = $entry;
+ $value = (self::$case == 'insensitive') ? strtolower($value) : $value;
+ $name = sprintf('0x%04X',$group).'.'.sprintf('0x%04X',$element);
+ $this->_map[$name][$value] = $assignment;
+ }
+ }
+
+ // Anonymize the top level dataset
+ $this->_anonymize($this->_dataset);
+
+ // Return the new blob
+ // TODO: allow more modes. Maybe replace, backup?
+ switch ($mode)
+ {
+ case self::RETURN_BLOB:
+ // Return the blob
+ $blob = $this->write();
+ break;
+ default:
+ $blob = $this->write();
+ break;
+ }
+
+ $this->profiler['anonymize']['end'] = microtime(TRUE);
+ return $blob;
+ }
+
+ /**
+ * Anonymizes the dataset
+ *
+ * @param array the dataset passed by reference
+ * @return string the anonymized dataset
+ */
+ protected function _anonymize(&$dataset)
+ {
+ // Iterate groups
+ foreach ($dataset as $group => $elements)
+ {
+ // Iterate elements
+ foreach ($elements as $element => $indexes)
+ {
+ // Iterate indexes
+ foreach ($indexes as $index => $values)
+ {
+ if ( ! isset($values['done']))
+ {
+ // Read value if not read yet
+ $this->_read_value_from_blob($dataset[$group][$element][$index], $group, $element);
+ }
+
+ // Update the tag element to anonymized values (if conditions are met)
+ $this->_replace($dataset, $group, $element);
+
+ if (count($values['ds']) > 0)
+ {
+ // Take care of items
+ $this->_anonymize($dataset[$group][$element][$index]['ds']);
+ }
+
+ }
+ unset($values);
+ }
+ unset($element, $indexes);
+ }
+ unset($group, $elements);
+ }
+
+ /**
+ * Replaces the values
+ *
+ * @param array the dataset
+ * @param integer the group
+ * @param integer the element
+ * @return boolean true if replacement was made, false otherwise
+ */
+ protected function _replace( & $dataset, $group, $element)
+ {
+ // Search the value in the current dataset
+ $original_value = $this->dataset_value($dataset, $group, $element);
+
+ // Do not update arrays
+ if (is_array($original_value))
+ return FALSE;
+
+ // In case the value is not set
+ $value = (empty($original_value)) ? 'none' : trim($original_value);
+
+ // Check if we are doing a case insensitive comparison
+ $value = (self::$case == 'insensitive') ? strtolower($value) : $value;
+
+ $name = sprintf('0x%04X',$group).'.'.sprintf('0x%04X',$element);
+
+ // A mapping was found. Return it
+ if (isset($this->_map[$name][$value]))
+ {
+ $this->dataset_value($dataset, $group, $element, $this->_map[$name][$value]);
+ return TRUE;
+ }
+
+ // If no tag is found, return false. Do not update dataset
+ if ( ! isset($this->_tags[$group][$element]))
+ return FALSE;
+
+ // Get the replacement expression
+ $replacement = $this->_tags[$group][$element];
+
+ // Search for regex expressions
+ if (preg_match('/{([a-z0-9]+)(\|([a-z0-9]+))?}$/i', $replacement, $matches))
+ {
+ switch ($matches[1])
+ {
+ // Set to date
+ case 'date':
+ $replacement = $this->_map[$name][$value] = str_replace('{date|'.$matches[3].'}', date($matches[3]), $replacement);
+ break;
+ // Consecutive
+ case 'consecutive':
+ $count = (isset($this->_map[$name])) ? count($this->_map[$name]) : 0;
+ $replacement = $this->_map[$name][$value] = str_replace('{consecutive}', $count, $replacement);
+ break;
+ // Random, do not store it
+ case 'random':
+ $replacement = str_replace('{random}', sprintf('%04d',rand()), $replacement);
+ break;
+ }
+ }
+ else
+ {
+ $this->_map[$name][$value] = $replacement;
+ }
+
+ // Update the dataset
+ $this->dataset_value($dataset, $group, $element, $replacement);
+ // Return true
+ return TRUE;
+ }
+
+} // End Dicom_Anonymizer
diff --git a/lib/Nanodicom/tools/anonymizer/clinicaltrial.php b/lib/Nanodicom/tools/anonymizer/clinicaltrial.php
new file mode 100644
index 0000000..e09e560
--- /dev/null
+++ b/lib/Nanodicom/tools/anonymizer/clinicaltrial.php
@@ -0,0 +1,41 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+/**
+ * Dicom_Anonymizer_Clinicaltrial class.
+ *
+ * Extends Dicom_Anonymizer. Use this to extend specific tools. The idea is to have it
+ * specific to certain functionality. In this case, this tool it is an Anonymizer
+ * specific for Clinical Trials.
+ * @package Nanodicom
+ * @category Tools
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+class Dicom_Anonymizer_Clinicaltrial extends Dicom_Anonymizer {
+
+ /**
+ * Anonymizes the dataset
+ *
+ * @param mixed NULL or an array to overwrite defaults
+ * @param integer the mode
+ * @return string the anonymized dataset
+ */
+ public function anonymize($tags = NULL, $mode = self::RETURN_BLOB)
+ {
+ //Overload the function here if you want
+ }
+
+} // End Dicom_Anonymizer_Clinicaltrial
diff --git a/lib/Nanodicom/tools/dumper.php b/lib/Nanodicom/tools/dumper.php
new file mode 100644
index 0000000..b40f5a6
--- /dev/null
+++ b/lib/Nanodicom/tools/dumper.php
@@ -0,0 +1,225 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+/**
+ * Dicom_Dumper class.
+ *
+ * Extends Nanodicom. Dumps the dataset. Currently supports normal echo output and formatted
+ * html output. Fully extensible, ie. an xml output can be created as well.
+ * @package Nanodicom
+ * @category Tools
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+class Dicom_Dumper extends Nanodicom {
+
+ // Default html output
+ protected $_output_html = array(
+ 'dataset_begin' => '',
+ 'item_begin' => '',
+ 'item_end' => ' ',
+ 'spacer' => '',
+ 'text_begin' => '',
+ 'text_end' => ' ',
+ 'columns' => array(
+ 'off' => array('%05X', ' '),
+ 'g' => array('0x%04X', ':'),
+ 'e' => array('0x%04X', ' '),
+ 'name' => array('%-30.30s', ' '),
+ 'vr' => array('%2s', ' '),
+ 'len' => array('%-3d', ' '),
+ 'val' => array('[%s]', ''),
+ ),
+ );
+
+ // Default echo output
+ protected $_output_echo = array(
+ 'dataset_begin' => '',
+ 'dataset_end' => '',
+ 'item_begin' => '',
+ 'item_end' => "\n",
+ 'spacer' => ' ',
+ 'text_begin' => '',
+ 'text_end' => '',
+ 'columns' => array(
+ 'off' => array('%05X', ' '),
+ 'g' => array('%04X', ':'),
+ 'e' => array('%04X', ' '),
+ 'name' => array('%-30.30s', ' '),
+ 'vr' => array('%2s', ' '),
+ 'len' => array('%-3d', ' '),
+ 'val' => array('[%s]', ''),
+ ),
+ );
+
+ // For formatting
+ protected $output = array();
+
+ // The output
+ protected $_out = '';
+
+ /**
+ * Public method for dump
+ *
+ * @param mixed for formatting
+ * @return string the dumped full dataset
+ */
+ public function dump($output = 'echo')
+ {
+ $this->parse();
+
+ // TODO:
+ // - Check if $output exists.
+ // - Max number of nested datasets
+ // - Show binary in hexdump format
+ $this->profiler['dump']['start'] = microtime(TRUE);
+
+ if (is_array($output))
+ {
+ // Merge arrays from default and given
+ $this->output = array_merge($this->_output_echo, $output);
+ }
+ else
+ {
+ $output = '_output_'.$output;
+ foreach ($this->$output as $var => $value)
+ {
+ // Load the output
+ $this->output[$var] = $value;
+ }
+ }
+ $dump = $this->_dump($this->_dataset);
+ $this->profiler['dump']['end'] = microtime(TRUE);
+ return $dump;
+ }
+
+ /**
+ * Internal method for dumping
+ *
+ * @param object the dataset
+ * @param string the spacer
+ * @return string the dumped dataset
+ */
+ protected function _dump($dataset, $spacer = '')
+ {
+ $out = '';
+ foreach ($dataset as $group => $elements)
+ {
+ // Load dictionaries (Forced loading)
+ Nanodicom_Dictionary::load_dictionary($group, TRUE);
+ foreach ($elements as $element => $indexes)
+ {
+ foreach ($indexes as $values)
+ {
+ $elem = $values;
+ $elem['g'] = $group;
+ $elem['e'] = $element;
+
+ if ( ! isset($elem['done']))
+ {
+ // Read value if not read yet
+ $this->_read_value_from_blob($elem, $group, $element);
+ }
+
+ // Indent back when a delimiter was found. Must be done before dumping.
+ if ($group == Nanodicom::ITEMS_GROUP AND in_array($element, array(Nanodicom::ITEM_DELIMITER, Nanodicom::SEQUENCE_DELIMITER)))
+ {
+ $spacer = substr($spacer, 0, -1*strlen($this->output['spacer']));
+ }
+
+ // Start the dataset and dump the current element
+ $out .= $this->output['dataset_begin'].$this->_dump_element($elem, $spacer);
+
+ if (count($elem['ds']) > 0)
+ {
+ // Take care of items
+ $out .= $this->_dump($elem['ds'], $spacer.$this->output['spacer']);
+ }
+
+ // Close the dataset
+ $out .= $this->output['dataset_end'];
+ }
+ unset($values);
+ }
+ unset($element, $indexes);
+ }
+ unset($group, $elements);
+ return $out;
+ }
+
+ /**
+ * Dumps an element
+ *
+ * @param object the element
+ * @param string the spacer
+ * @return string the full dumped element
+ */
+ protected function _dump_element($element, $space = '')
+ {
+ $row = $this->_print_element($element);
+ return $this->output['item_begin'].$this->output['text_begin'].$space.$row.$this->output['text_end'].$this->output['item_end'];
+ }
+
+ /**
+ * Prints an element
+ *
+ * @param object the element
+ * @return string the basic dumped element
+ */
+ protected function _print_element($element)
+ {
+ $out = '';
+
+ foreach ($this->output['columns'] as $column => $values)
+ {
+ switch ($column)
+ {
+ case 'name' : $string = isset(Nanodicom_Dictionary::$dict[$element['g']][$element['e']])
+ ? Nanodicom_Dictionary::$dict[$element['g']][$element['e']][2]
+ : 'NA';
+ break;
+ case 'val' :
+ if ($element['vr'] == 'AT')
+ {
+ // AT (Attribute Tags) look "nicer" being displayed in Hex to match Group, Elements format
+ $elements = array();
+ for($i = 0; $i < count($element['val']); $i++)
+ {
+ $elements[] = '['.sprintf("0x%04X", $element['val'][$i][0]).','.sprintf("0x%04X", $element['val'][$i][1]).']';
+ }
+ $element['val'] = $elements;
+ }
+
+ $string = ($element['bin'])
+ ? 'BINARY. Element starts at '.$element['off']
+ : ((is_array($element['val']))
+ ? implode(',', $element['val'])
+ : (isset(Nanodicom_Dictionary::$dict[$element['g']][$element['e']])
+ ? trim($element['val'])
+ : 'UNKNOWN'));
+ break;
+ case 'vr' :
+ $vr_index = ($element['vr'] != $element['_vr'] AND ! empty($element['_vr'])) ? '_vr' : 'vr';
+ $string = trim($element[$vr_index]);
+ break;
+ default : $string = trim($element[$column]);
+ break;
+ }
+ $out .= sprintf($values[0], $string).$values[1];
+ }
+ return $out;
+ }
+
+} // End Dicom_Dumper
diff --git a/lib/Nanodicom/tools/getter.php b/lib/Nanodicom/tools/getter.php
new file mode 100644
index 0000000..a23ff45
--- /dev/null
+++ b/lib/Nanodicom/tools/getter.php
@@ -0,0 +1,42 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+/**
+ * Dicom_Getter class.
+ *
+ * Extends Nanodicom. Simplifies the access to fields by element name.
+ * @package Nanodicom
+ * @category Tools
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+class Dicom_Getter extends Nanodicom {
+
+ /**
+ * Parses the object.
+ *
+ * If the list of elements has a tag name, dictionaries will be loaded. For performance
+ * is better to pass only arrays of the form:
+ * array(group, element) where group and element are numbers (hex or decimal equivalents or any other base).
+ * @param mixed array for a list of elements tags to read. parsing stops when all found. Or TRUE to force
+ * load dictionaries when parsing. This tool force the reading of dictionaries
+ * @param boolean a flag to test if dicom file has DCM header only.
+ * @return this
+ */
+ public function parse($vr_reading_list = TRUE, $check_dicom_preamble = FALSE)
+ {
+ return parent::parse($vr_reading_list, $check_dicom_preamble);
+ }
+
+} // End Dicom_Getter
diff --git a/lib/Nanodicom/tools/pixeler.php b/lib/Nanodicom/tools/pixeler.php
new file mode 100644
index 0000000..834bf13
--- /dev/null
+++ b/lib/Nanodicom/tools/pixeler.php
@@ -0,0 +1,905 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+/**
+ * Dicom_Pixeler class.
+ *
+ * Extends Nanodicom. Pixel data reader.
+ * Currently support:
+ * - Only uncompressed pixel data.
+ * - Photometric Representations of: Monochrome1, Monochrome2 and RGB (color-by-plane and color-by-pixel)
+ * - Big endian and little endian, explicit and implicit
+ * - Pixel Representation: Unsigned Integer and 2's complement
+ *
+ * @package Nanodicom
+ * @category Tools
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+class Dicom_Pixeler extends Nanodicom {
+
+ /**
+ * @var string driver to be used: GD (gd), ImageMagick (imagick), GraphicsMagick (gmagick)
+ */
+ public static $driver = 'gd';
+
+ protected $_rows;
+ protected $_cols;
+ protected $_endian;
+ protected $_vr_mode;
+ protected $_dose_scaling;
+ protected $_rescale_slope;
+ protected $_rescale_intercept;
+ protected $_samples_per_pixel;
+ protected $_pixel_representation;
+
+ /**
+ * Supported Image Transfer Syntaxes for reading image data
+ * indexed by Value of the Transfer Syntax
+ * each array contains: Name.
+ * @var array
+ */
+ public static $reading_image_transfer_syntaxes = array(
+ // Implicit VR Little Endian "1.2.840.10008.1.2"
+ Nanodicom::IMPLICIT_VR_LITTLE_ENDIAN => array(
+ 'name' => 'Implicit VR Little Endian'
+ ),
+ // Explicit VR Little Endian "1.2.840.10008.1.2.1"
+ Nanodicom::EXPLICIT_VR_LITTLE_ENDIAN => array(
+ 'name' => 'Explicit VR Little Endian'
+ ),
+ // Explicit VT Big Endian "1.2.840.10008.1.2.2"
+ Nanodicom::EXPLICIT_VR_BIG_ENDIAN => array(
+ 'name' => 'Explicit VR Big Endian'
+ ),
+ // DICOM Deflated Little Endian (Explicit VR)
+ '1.2.840.10008.1.2.1.99' => array(
+ 'name' => 'DICOM Deflated Little Endian (Explicit VR)'
+ ),
+ // Jpeg Lossy Baseline (1) - 8 bits
+ '1.2.840.10008.1.2.4.50' => array(
+ 'name' => 'Jpeg Lossy Baseline (1) - 8 bits'
+ ),
+ // RLE - Run Length Encoding, Lossless
+ '1.2.840.10008.1.2.5' => array(
+ 'name' => 'RLE - Run Length Encoding, Lossless'
+ ),
+ );
+
+ /**
+ * Public method to set the driver to be used
+ *
+ * @param string name of the driver
+ * @return object the instance to allow chaining
+ */
+ public function set_driver($driver)
+ {
+ self::$driver = $driver;
+ return $this;
+ }
+
+ /**
+ * Public method to get the driver currently set
+ *
+ * @return string the current driver set
+ */
+ public function get_driver()
+ {
+ return self::$driver;
+ }
+
+ /**
+ * Public method to add a jpeg lossy 8 bits image
+ * Still under development.
+ *
+ * @return string the name of the jpeg file
+ */
+ public function add_lossy_jpeg8($filename)
+ {
+ $dataset = array();
+
+ // Get the data blob
+ $blob = file_get_contents($filename);
+
+ // Create first item
+ $value = array(
+ 'len' => 0,
+ 'val' => '',
+ 'vr' => 'IT',
+ '_vr' => 'IT',
+ 'bin' => FALSE,
+ 'off' => 0, // We don't know the offset
+ 'ds' => array(),
+ 'done' => TRUE,
+ );
+
+ $dataset[0xFFFE][0xE000][] = $value;
+
+ // Attach jpeg
+ $value = array(
+ 'len' => sprintf('%u', strlen($blob)),
+ 'val' => $blob,
+ 'vr' => 'IT',
+ '_vr' => 'IT',
+ 'bin' => TRUE,
+ 'off' => 0, // We don't know the offset
+ 'ds' => array(),
+ 'done' => TRUE,
+ );
+
+ $dataset[0xFFFE][0xE000][] = $value;
+
+ // Pixel Data element
+ $value = array(
+ 'len' => -1,
+ 'val' => '',
+ 'vr' => 'OB',
+ '_vr' => 'OB',
+ 'bin' => FALSE,
+ 'off' => 0, // We don't know the offset
+ 'ds' => $dataset,
+ 'done' => TRUE,
+ );
+
+ $this->_dataset[0x7FE0][0x0010][0] = $value;
+
+ // Delimeter
+ $value = array(
+ 'len' => 0,
+ 'val' => '',
+ 'vr' => 'DI',
+ '_vr' => 'DI',
+ 'bin' => FALSE,
+ 'off' => 0, // We don't know the offset
+ 'ds' => array(),
+ 'done' => TRUE,
+ );
+
+ $this->_dataset[0xFFFE][0xE0DD][0] = $value;
+
+ $info = getimagesize($filename);
+
+ // Set the rows (height of image)
+ $this->value(0x0028, 0x0010, (int) $info[1]);
+
+ // Set the columns (width of image)
+ $this->value(0x0028, 0x0011, (int) $info[0]);
+
+ // Set the bits allocated
+ $this->value(0x0028, 0x0100, 8);
+
+ // Set the bits stored
+ $this->value(0x0028, 0x0101, 8);
+
+ // Set the high bit
+ $this->value(0x0028, 0x0102, 7);
+
+ // Set the samples per pixel
+ $this->value(0x0028, 0x0002, 1);
+
+ // Set the Photometric Interpretation
+ $this->value(0x0028, 0x0004, 'MONOCHROME2');
+
+ // TransferSyntaxUID. JPEG Lossy Baseline (1) - 8 bits
+ $this->value(0x0002, 0x0010, '1.2.840.10008.1.2.4.50');
+
+ return $this;
+ }
+
+ /**
+ * Public method to get the images from the dicom object
+ *
+ * @param integer a default window width
+ * @param integer a default window center
+ * @return mixed false if something is missing or not image data found, otherwise an
+ * array of GD objects
+ */
+ public function get_images($width = NULL, $center = NULL)
+ {
+ // Parse the object if not parsed yet
+ $this->parse();
+
+ // Set the profiler
+ $this->profiler['pixel']['start'] = microtime(TRUE);
+
+ $return = $this->_check_driver();
+
+ // If FALSE, driver not found
+ if ( ! $return)
+ return FALSE;
+
+ // Supported transfer syntaxes
+ if ( ! array_key_exists(trim($this->_transfer_syntax), self::$reading_image_transfer_syntaxes))
+ {
+ // Not supported transfer syntax found
+ throw new Nanodicom_Exception('Transfer syntax ":syntax" not supported',
+ array(':syntax' => $this->_transfer_syntax), 300);
+ }
+
+ // Let's read some values from DICOM file
+ $rows = $this->get(0x0028, 0x0010);
+ $cols = $this->get(0x0028, 0x0011);
+
+ if ($rows == NULL OR $cols === NULL)
+ {
+ // There is no rows, no samples per pixel, no pixel data or malformed dicom file
+ throw new Nanodicom_Exception('There is no rows, no samples per pixel, no pixel data or malformed dicom file', NULL, 301);
+ }
+
+ $samples_per_pixel = $this->get(0x0028, 0x0002, 1);
+ $bits_allocated = $this->get(0x0028, 0x0100);
+ $bits_stored = $this->get(0x0028, 0x0101);
+ $high_bit = $this->get(0x0028, 0x0102);
+ $dose_scaling = $this->get(0x3004, 0x000E, 1);
+ $window_width = ($width == NULL) ? $this->get(0x0028,0x1051, 0) : $width;
+ $window_center = ($center == NULL) ? $this->get(0x0028,0x1050, 0) : $center;
+ $rescale_intercept = $this->get(0x0028,0x1052, 0);
+ $rescale_slope = $this->get(0x0028,0x1053, 1);
+ $number_of_frames = (int) $this->get(0x0028,0x0008, 1);
+ $pixel_representation = $this->get(0x0028,0x0103);
+ $photometric_interpretation = trim($this->get(0x0028,0x0004, 'NONE'));
+ $planar_configuration = $this->get(0x0028,0x0006, 0);
+ $transfer_syntax_uid = trim($this->get(0x0002,0x0010));
+ $blob = $this->get(0x7FE0,0x0010);
+
+ // Save some values for internal use
+ // TODO: improve this, probably using $this->pixeler[]?
+ $this->_rows = $rows;
+ $this->_cols = $cols;
+ $this->_dose_scaling = $dose_scaling;
+ $this->_rescale_slope = $rescale_slope;
+ $this->_rescale_intercept = $rescale_intercept;
+ $this->_samples_per_pixel = $samples_per_pixel;
+ $this->_pixel_representation = $pixel_representation;
+
+ // Window Center and Width can have multiple values. By now, just reading the first one.
+ // It assumes the delimiter is the "\"
+ if ( ! (strpos($window_center, "\\") === FALSE))
+ {
+ $temp = explode("\\", $window_center);
+ $window_center = (int) $temp[0];
+ }
+
+ if ( ! (strpos($window_width, "\\") === FALSE))
+ {
+ $temp = explode("\\", $window_width);
+ $window_width = (int) $temp[0];
+ }
+
+ // Setting some values
+ $images = array();
+ $max = array();
+ $min = array();
+
+ $current_position = $starting_position = 0;
+ $current_image = 0;
+ $bytes_to_read = (int) $bits_allocated/8;
+ $image_size = $cols*$rows*$samples_per_pixel*$bytes_to_read;
+ list($vr_mode, $endian) = Nanodicom::decode_transfer_syntax($transfer_syntax_uid);
+ $this->_vr_mode = $vr_mode;
+ $this->_endian = $endian;
+
+ if ($transfer_syntax_uid == '1.2.840.10008.1.2.4.50')
+ {
+ // This is jpeg lossy 8-bits. Just get the data.
+ $images = array();
+ $counter = 0;
+
+ foreach ($blob as $group => $elements)
+ {
+ foreach ($elements as $element => $indexes)
+ {
+ if ($element == Nanodicom::SEQUENCE_DELIMITER)
+ continue;
+
+ foreach ($indexes as $values)
+ {
+ $data = $values;
+
+ if ($counter == 0)
+ {
+ // Read Basic Offset Table
+ }
+ else
+ {
+ // It is a real Item
+
+ if ( ! isset($data['done']))
+ {
+ // Read value if not read yet
+ $this->_read_value_from_blob($data, $group, $element);
+ }
+
+ $images[] = $this->_read_image_blob($data['val']);
+ }
+ $counter++;
+ }
+ }
+ }
+
+ return $images;
+ }
+
+ if ($transfer_syntax_uid == '1.2.840.10008.1.2.5')
+ {
+ // It is "RLE - Run Length Encoding, Lossless"
+ $counter = 0;
+ $temp = array();
+ foreach ($blob as $group => $elements)
+ {
+ foreach ($elements as $element => $indexes)
+ {
+ if ($element == Nanodicom::SEQUENCE_DELIMITER)
+ continue;
+
+ foreach ($indexes as $values)
+ {
+ $data = $values;
+ $data['g'] = $group;
+ $data['e'] = $element;
+
+ if ($counter == 0)
+ {
+ // Read Basic Offset Table
+ }
+ else
+ {
+ // It is a real Item
+ $dir = realpath(dirname($this->_location)).DIRECTORY_SEPARATOR;
+ $file = basename($this->_location);
+
+ if ( ! isset($data['done']))
+ {
+ // Read value if not read yet
+ $this->_read_value_from_blob($data, $group, $element);
+ }
+
+ // This is the item data
+ $item = $data['val'];
+
+ // Save the header
+ $header = array();
+ // 16 Unsigned Long values
+ for ($i = 0; $i <= 16; $i++)
+ {
+ $chunk = substr($item, 4*$i, 4);
+ $header[] = $this->{Nanodicom::$_read_int}(4, Nanodicom::LITTLE_ENDIAN, 4, Nanodicom::UNSIGNED, $chunk);
+ }
+
+ $total_segments = array_shift($header);
+
+ $segment_index = 0;
+
+ foreach ($header as $starting_byte_of_segment)
+ {
+ // This is a segment, do the uncompression
+ if ($starting_byte_of_segment == 0)
+ // Only process if the segment has a positive starting value
+ break;
+
+ $size_of_segment = ($header[$segment_index + 1] == 0)
+ ? strlen($item) - $starting_byte_of_segment
+ : $header[$segment_index + 1] - $starting_byte_of_segment;
+
+ $temp[$counter - 1][$segment_index] = '';
+ $expected_segment_size = $cols*$rows*$bytes_to_read/$total_segments;
+ $bytes_count = $current_segment_size = 0;
+
+ while ($bytes_count < $size_of_segment)
+ {
+ $tmp = $starting_byte_of_segment + $bytes_count;
+ // Read "n"
+ $n = substr($item, $starting_byte_of_segment + $bytes_count, 1);
+ $n = $this->{Nanodicom::$_read_int}(1, Nanodicom::LITTLE_ENDIAN, 1, Nanodicom::SIGNED, $n);
+ // Add 1
+ $bytes_count++;
+
+ if ($n >= 0 AND $n <= 127)
+ {
+ $temp[$counter - 1][$segment_index] .= substr($item, $starting_byte_of_segment + $bytes_count, $n + 1);
+ $bytes_count = $bytes_count + $n + 1;
+ $current_segment_size = $current_segment_size + $n + 1;
+ }
+ elseif ($n <= -1 AND $n >= -127)
+ {
+ $byte = substr($item, $starting_byte_of_segment + $bytes_count, 1);
+ $temp[$counter - 1][$segment_index] .= str_repeat($byte, -$n + 1);
+ $bytes_count++;
+ $current_segment_size = $current_segment_size - $n + 1;
+ }
+ else
+ {
+ // Do nothing
+ }
+ }
+ $segment_index++;
+ }
+ }
+ // Increment counter
+ $counter++;
+ }
+ }
+ }
+ $counter--;
+ $blob = '';
+
+ for ($count = 0; $count < $counter; $count++)
+ {
+ if ($photometric_interpretation == 'RGB')
+ {
+ if ($planar_configuration == 1)
+ {
+ // Color-by-plane: RRR..., GGG..., BBB...
+ $blob .= implode('', $temp[$count]);
+ }
+ else
+ {
+ // Color-by-pixel: RGB, RGB, RGB..
+ }
+ }
+ else
+ {
+ $dimension = $cols*$rows;
+
+ for ($i = 0; $i < $dimension; $i++)
+ {
+ $part = '';
+ foreach ($temp[$count] as $segment)
+ {
+ $part = substr($segment, $i, 1) . $part;
+ }
+ $blob .= $part;
+ }
+ }
+ }
+ }
+
+ // Blob here has "uncompressed" data (from raw or RLE)
+
+ if ($photometric_interpretation == 'PALETTE COLOR')
+ {
+ $this->_samples_per_pixel = 3;
+
+ $palettes = array();
+ $palettes['R'] = array($this->get(0x0028,0x1101), $this->get(0x0028,0x1201));
+ $palettes['G'] = array($this->get(0x0028,0x1102), $this->get(0x0028,0x1202));
+ $palettes['B'] = array($this->get(0x0028,0x1103), $this->get(0x0028,0x1203));
+ $palettes['A'] = array($this->get(0x0028,0x1104), $this->get(0x0028,0x1204));
+
+ $entries = (int) $palettes['R'][0]['val1'];
+ $entries = ($entries == 0) ? pow(2, 16) : $entries;
+ $first = $palettes['R'][0]['val2'];
+ $size = $palettes['R'][0]['val3'];
+
+ $palette_byte_size = (int) $size/8;
+ $offset = 8;
+
+ $current_position = 0;
+ $colors = array('R', 'G', 'B');
+
+ // Now let's create the right values for the images
+ for ($index = 0; $index < $number_of_frames; $index++)
+ {
+ // Create the image object
+ $image = self::create_image($cols, $rows);
+ for($y = 0; $y < $rows; $y++)
+ {
+ for ($x = 0; $x < $cols; $x++)
+ {
+ $rgb = array();
+ $value = $this->_read_gray($blob, $current_position, $bytes_to_read);
+
+ $palette_index = ($value <= $first)
+ ? $first
+ : (($value > $first + $entries) ? $first + $entries - 1 : $value);
+
+ $current_position += $bytes_to_read;
+
+ for ($sample = 0; $sample < 3; $sample++)
+ {
+
+ $tmp = $this->_read_gray($palettes[$colors[$sample]][1]
+ , $palette_byte_size*$palette_index, $palette_byte_size);
+
+ $rgb[$sample] = $tmp >> 8;
+ }
+
+
+ // Set the color
+ $color = $this->_allocate_color_rgb($image, $rgb);
+ $rgb = NULL;
+
+ // Set the pixel value
+ $this->_set_pixel($image, $x, $y, $color);
+ $color = NULL;
+ }
+ }
+
+ // Append the current image
+ $images[] = $image;
+ $image = NULL;
+ }
+
+ return $images;
+ }
+ else
+ {
+ // Do this if no window center and window width are set and when samples per pixel is 1 (gray images).
+ if (($window_center == 0 OR $window_width == 0) AND $samples_per_pixel == 1)
+ {
+ $length = strlen($blob);
+
+ // This is costly performance wise! :(
+ while ($current_position < $starting_position + $length)
+ {
+ if ($current_position == $starting_position + $current_image*$image_size)
+ {
+ // A new image has been found
+ $x = 0;
+ $y = 0;
+
+ $max[$current_image] = -200000; // Small enough so it will be properly calculated
+ $min[$current_image] = 200000; // Large enough so it wil be properly calculated
+
+ $current_image++;
+ }
+
+ $gray = $this->_read_gray($blob, $current_position, $bytes_to_read);
+ $current_position += $bytes_to_read;
+
+ // Getting the max
+ if ($gray > $max[$current_image - 1])
+ {
+ // max
+ $max[$current_image - 1] = $gray;
+ }
+
+ // Getting the min
+ if ($gray < $min[$current_image - 1])
+ {
+ // min
+ $min[$current_image - 1] = $gray;
+ }
+ $y++;
+
+ if ($y == $cols)
+ {
+ // Next row
+ $x++;
+ $y = 0;
+ }
+ }
+ }
+ }
+
+ $current_position = $starting_position = 0;
+
+ // Now let's create the right values for the images
+ for ($index = 0; $index < $number_of_frames; $index++)
+ {
+ if ($samples_per_pixel == 1)
+ {
+ // Real max and min according to window center & width (if set)
+ $maximum = ($window_center != 0 AND $window_width != 0)
+ ? round($window_center + $window_width/2)
+ : $max[$index];
+
+ $minimum = ($window_center != 0 AND $window_width != 0)
+ ? round($window_center - $window_width/2)
+ : $min[$index];
+
+ // Check if window and level are sent
+ $maximum = ( ! empty($window) AND ! empty($level))
+ ? round($level + $window/2)
+ : $maximum;
+ $minimum = ( ! empty($window) AND ! empty($level))
+ ? round($level - $window/2)
+ : $minimum;
+
+ if ($maximum == $minimum)
+ {
+ // Something wrong. Avoid having a zero division
+ throw new Nanodicom_Exception('Division by zero', NULL, 302);
+ }
+ }
+
+ // Create the image object
+ $image = self::create_image($cols, $rows);
+ $pixels = array();
+ for($y = 0; $y < $rows; $y++)
+ {
+ for ($x = 0; $x < $cols; $x++)
+ {
+ switch ($samples_per_pixel)
+ {
+ case 1:
+ $gray = $this->_read_gray($blob, $current_position, $bytes_to_read);
+ $current_position += $bytes_to_read;
+
+ // truncating pixel values over max and below min
+ $gray = ($gray > $maximum) ? $maximum : $gray;
+ $gray = ($gray < $minimum) ? $minimum : $gray;
+
+ // Converting to gray value
+ $gray = ($gray - $minimum)/($maximum - $minimum)*255;
+
+ // For MONOCHROME1 we have to invert the pixel values.
+ if ($photometric_interpretation == 'MONOCHROME1')
+ {
+ $gray = 255 - $gray;
+ }
+ // Set the (gray) color
+ $color = $this->_allocate_color_gray($image, $gray);
+ $gray = NULL;
+ break;
+ case 3:
+ // It has 3 colors
+ $rgb = array();
+ for ($sample = 0; $sample < $samples_per_pixel; $sample++)
+ {
+ $current_position = ($planar_configuration == 0)
+ ? $current_position
+ : $sample * ($rows * $cols) + ($y*$cols + $x);
+ $rgb[$sample] = $this->_read_gray($blob, $current_position, $bytes_to_read);
+ $current_position += $bytes_to_read;
+ }
+
+ // Set the color
+ $color = $this->_allocate_color_rgb($image, $rgb);
+
+ $rgb = NULL;
+ break;
+ default:
+ break;
+ }
+
+ // Set the pixel value
+ $this->_set_pixel($image, $x, $y, $color);
+ $color = NULL;
+ }
+ }
+
+ // Append the current image
+ $images[] = $image;
+ $image = NULL;
+ }
+
+ // Collect the ending time for the profiler
+ $this->profiler['pixel']['end'] = microtime(TRUE);
+ return $images;
+ }
+
+ /**
+ * Public method to write images based on library used and format
+ *
+ * @param resource the image object instance
+ * @param string the format to be saved. defaults to jpeg
+ * @return boolean true on success, false on failure
+ */
+ public function write_image($image, $location, $format = 'jpg')
+ {
+ switch (self::$driver)
+ {
+ case 'gd' :
+ switch ($format)
+ {
+ case 'png': imagepng($image, $location.'.png');
+ break;
+ case 'gif': imagegif($image, $location.'.gif');
+ break;
+ case 'jpg':
+ default:
+ imagejpeg($image, $location.'.jpg');
+ break;
+ }
+ break;
+ case 'gmagick' :
+ case 'imagick' :
+ switch ($format)
+ {
+ case 'png': $format = 'png';
+ break;
+ case 'gif': $format = 'gif';
+ break;
+ default: $format = 'jpg';
+ break;
+ }
+ $image->writeImage($location.'.'.$format);
+ break;
+ }
+
+ return TRUE;
+ }
+
+ /**
+ * Internal method to read image from blob (string)
+ *
+ * @param string the binary data to be read
+ * @return mixed an instance of the image based on library (driver), false on failure
+ */
+ protected function _read_image_blob($string)
+ {
+ switch (self::$driver)
+ {
+ case 'gd' : return imagecreatefromstring($string);
+ case 'gmagick' :
+ case 'imagick' :
+ $image = new imagick();
+ $image->readImageBlob($string);
+ return $image;
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * Internal method to allocate the color for image instance (color)
+ *
+ * @param resource the image object instance
+ * @param integer the color value
+ * @return mixed color value or class, false on failure
+ */
+ protected function _allocate_color_rgb($image, $rgb)
+ {
+ switch (self::$driver)
+ {
+ case 'gd': return imagecolorallocate($image, $rgb[0], $rgb[1], $rgb[2]);
+ case 'gmagick': return new GmagickPixel('rgb('.$rgb[0].','.$rgb[1].','.$rgb[2].')');
+ case 'imagick': return new ImagickPixel('rgb('.$rgb[0].','.$rgb[1].','.$rgb[2].')');
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * Internal method to allocate the color for image instance (gray)
+ *
+ * @param resource the image object instance
+ * @param integer the gray value
+ * @return mixed color value or class, false on failure
+ */
+ protected function _allocate_color_gray($image, $gray)
+ {
+ switch (self::$driver)
+ {
+ case 'gd': return imagecolorallocate($image, $gray, $gray, $gray);
+ case 'gmagick': return new GmagickPixel('rgb('.$gray.','.$gray.','.$gray.')');
+ case 'imagick': return new ImagickPixel('rgb('.$gray.','.$gray.','.$gray.')');
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * Internal method to set a pixel into the existing image object instance
+ *
+ * @param resource the image object instance
+ * @param integer the x position
+ * @param integer the y position
+ * @param integer the color to be set
+ * @return boolean true on success, false on failure
+ */
+ protected function _set_pixel( & $image, $x, $y, $color)
+ {
+ switch (self::$driver)
+ {
+ case 'gd': imagesetpixel($image, $x, $y, $color);
+ return TRUE;
+ case 'gmagick': $draw = new GmagickDraw();
+ $draw->setFillColor($color);
+ $draw->point($x, $y);
+ $image->drawImage($draw);
+ return TRUE;
+ case 'imagick': $draw = new ImagickDraw();
+ $draw->setFillColor($color);
+ $draw->point($x, $y);
+ $image->drawImage($draw);
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * Public static method to create an instance of the image
+ *
+ * @param integer the number of columns
+ * @param integet the number of rows
+ * @return mixed the corresponding object from the set driver or false on failure
+ */
+ public static function create_image($cols, $rows)
+ {
+ switch (self::$driver)
+ {
+ case 'gd': return imagecreatetruecolor($cols, $rows);
+ case 'gmagick': $image = new Gmagick();
+ $image->newImage($cols, $rows, 'none');
+ return $image;
+ case 'imagick': $image = new Imagick();
+ $image->newImage($cols, $rows, 'none');
+ return $image;
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * Internal method to check if drivers are installed
+ *
+ * @return bool true if driver is installed, false otherwise
+ */
+ protected function _check_driver()
+ {
+ switch (self::$driver)
+ {
+ case 'gd': return function_exists('imagecreatetruecolor');
+ case 'gmagick': return class_exists('Gmagick');
+ //case 'imagick': return (class_exists('Imagick') AND method_exists('Imagick', 'importImagePixels'));
+ case 'imagick': return class_exists('Imagick');
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * Internal method to read a 'gray' value.
+ *
+ * @param string the blob that holds the pixel data
+ * @param integer the current position in the string to read
+ * @param integet the number of bytes to read
+ * @return integer the gray or color value at the given location
+ */
+ protected function _read_gray($blob, $current_position, $bytes_to_read)
+ {
+ if ($this->_samples_per_pixel == 1)
+ {
+ $chunk = substr($blob, $current_position, $bytes_to_read);
+ $gray = $this->{Nanodicom::$_read_int}($bytes_to_read, $this->_endian, $bytes_to_read, Nanodicom::UNSIGNED, $chunk);
+ $chunk = NULL;
+
+ // Checking if 2's complement
+ $gray = ($this->_pixel_representation)
+ ? self::complement2($gray, $this->_high_bit)
+ : $gray;
+ // Getting the right value according to slope and intercept
+ $gray = $gray*$this->_rescale_slope + $this->_rescale_intercept;
+ // Multiplying for dose_grid_scaling
+ return $gray*$this->_dose_scaling;
+ }
+ else
+ {
+ // Read current position, it is 3 samples
+ $chunk = substr($blob, $current_position, $bytes_to_read);
+ return $this->{Nanodicom::$_read_int}($bytes_to_read, $this->_endian, $bytes_to_read, Nanodicom::UNSIGNED, $chunk);
+ }
+ }
+
+ /**
+ * Static method to find the complement of 2, returns an integer.
+ *
+ * @param integer the integer number to convert
+ * @param integer the high bit for the value. By default 15 (assumes 2 bytes)
+ * @return integer the number after complement's 2 applied
+ */
+ public static function complement2($number, $high_bit = 15)
+ {
+ $sign = $number >> $high_bit;
+ if ($sign)
+ {
+ // Negative
+ $number = -pow(2, $high_bit + 1) - $number;
+ }
+ return $number;
+ }
+}
diff --git a/lib/Nanodicom/tools/simple.php b/lib/Nanodicom/tools/simple.php
new file mode 100644
index 0000000..cb98588
--- /dev/null
+++ b/lib/Nanodicom/tools/simple.php
@@ -0,0 +1,27 @@
+
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+
+/**
+ * Dicom_Simple class.
+ *
+ * Extends Nanodicom. Does nothing, it is the default tool loaded, basically to just
+ * use the core functionality.
+ * @package Nanodicom
+ * @category Tools
+ * @author Nano Documet
+ * @version 1.3.1
+ * @copyright (c) 2010-2011
+ * @license http://www.opensource.org/licenses/mit-license.php MIT-license
+ */
+class Dicom_Simple extends Nanodicom {
+
+} // End Dicom_Simple
diff --git a/package-lock.json b/package-lock.json
new file mode 100755
index 0000000..233eea8
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,18637 @@
+{
+ "name": "dicomviewer",
+ "version": "2.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "dicomviewer",
+ "version": "2.0.0",
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "@nextcloud/auth": "^2.2.1",
+ "@nextcloud/axios": "^2.4.0",
+ "@nextcloud/dialogs": "^5.0.3",
+ "@nextcloud/logger": "^2.7.0",
+ "@nextcloud/router": "^2.2.0",
+ "cornerstone-core": "^2.2.8",
+ "cornerstone-math": "^0.1.7",
+ "cornerstone-tools": "^2.4.0",
+ "cornerstone-wado-image-loader": "^2.2.3",
+ "dicom-parser": "^1.8.3",
+ "hammerjs": "^2.0.8",
+ "underscore": "^1.13.1"
+ },
+ "devDependencies": {
+ "@nextcloud/babel-config": "^1.0.0",
+ "@nextcloud/browserslist-config": "^3.0.0",
+ "@nextcloud/eslint-config": "^8.3.0",
+ "@nextcloud/stylelint-config": "^2.3.1",
+ "@nextcloud/webpack-vue-config": "^6.0.0",
+ "adm-zip": "^0.5.10",
+ "axios": "^1.6.2",
+ "cli-progress": "^3.12.0",
+ "copy-webpack-plugin": "^11.0.0"
+ },
+ "engines": {
+ "node": "^16.0.0",
+ "npm": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/cli": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz",
+ "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "commander": "^4.0.1",
+ "convert-source-map": "^2.0.0",
+ "fs-readdir-recursive": "^1.1.0",
+ "glob": "^7.2.0",
+ "make-dir": "^2.1.0",
+ "slash": "^2.0.0"
+ },
+ "bin": {
+ "babel": "bin/babel.js",
+ "babel-external-helpers": "bin/babel-external-helpers.js"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "optionalDependencies": {
+ "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3",
+ "chokidar": "^3.4.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/highlight": "^7.23.4",
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
+ "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz",
+ "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==",
+ "peer": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helpers": "^7.23.6",
+ "@babel/parser": "^7.23.6",
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.6",
+ "@babel/types": "^7.23.6",
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz",
+ "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==",
+ "dev": true,
+ "peer": true,
+ "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/generator": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
+ "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.23.6",
+ "@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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
+ "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.23.5",
+ "@babel/helper-validator-option": "^7.23.5",
+ "browserslist": "^4.22.2",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz",
+ "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-member-expression-to-functions": "^7.23.0",
+ "@babel/helper-optimise-call-expression": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.20",
+ "@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==",
+ "peer": true,
+ "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.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz",
+ "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
+ "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
+ "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz",
+ "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.6",
+ "@babel/types": "^7.23.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "peer": true,
+ "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.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
+ "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
+ "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.23.3",
+ "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.23.3.tgz",
+ "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz",
+ "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+ "@babel/plugin-transform-optional-chaining": "^7.23.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz",
+ "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.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.",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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-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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz",
+ "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz",
+ "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz",
+ "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz",
+ "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz",
+ "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==",
+ "peer": true,
+ "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.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz",
+ "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz",
+ "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-remap-async-to-generator": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz",
+ "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==",
+ "peer": true,
+ "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.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz",
+ "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz",
+ "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.15",
+ "@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.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz",
+ "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.15",
+ "@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.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz",
+ "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-optimise-call-expression": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.20",
+ "@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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz",
+ "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/template": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz",
+ "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz",
+ "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.15",
+ "@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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz",
+ "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==",
+ "peer": true,
+ "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.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz",
+ "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz",
+ "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
+ "@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.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz",
+ "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==",
+ "peer": true,
+ "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-for-of": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz",
+ "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==",
+ "peer": true,
+ "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-function-name": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz",
+ "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-function-name": "^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-json-strings": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz",
+ "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz",
+ "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==",
+ "peer": true,
+ "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.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz",
+ "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz",
+ "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==",
+ "peer": true,
+ "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.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz",
+ "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@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.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz",
+ "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@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.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz",
+ "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz",
+ "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@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==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz",
+ "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==",
+ "peer": true,
+ "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.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz",
+ "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==",
+ "peer": true,
+ "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.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz",
+ "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==",
+ "peer": true,
+ "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.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz",
+ "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==",
+ "peer": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.23.3",
+ "@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.23.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz",
+ "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-replace-supers": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz",
+ "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==",
+ "peer": true,
+ "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.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz",
+ "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz",
+ "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz",
+ "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.15",
+ "@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.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz",
+ "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==",
+ "peer": true,
+ "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-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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz",
+ "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==",
+ "peer": true,
+ "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-regenerator": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz",
+ "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz",
+ "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==",
+ "peer": true,
+ "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-shorthand-properties": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz",
+ "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz",
+ "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz",
+ "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz",
+ "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz",
+ "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==",
+ "peer": true,
+ "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.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz",
+ "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-create-class-features-plugin": "^7.23.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-typescript": "^7.23.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz",
+ "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==",
+ "peer": true,
+ "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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz",
+ "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.15",
+ "@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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz",
+ "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.15",
+ "@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.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz",
+ "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.15",
+ "@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.6",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz",
+ "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.23.5",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-validator-option": "^7.23.5",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3",
+ "@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.23.3",
+ "@babel/plugin-syntax-import-attributes": "^7.23.3",
+ "@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.23.3",
+ "@babel/plugin-transform-async-generator-functions": "^7.23.4",
+ "@babel/plugin-transform-async-to-generator": "^7.23.3",
+ "@babel/plugin-transform-block-scoped-functions": "^7.23.3",
+ "@babel/plugin-transform-block-scoping": "^7.23.4",
+ "@babel/plugin-transform-class-properties": "^7.23.3",
+ "@babel/plugin-transform-class-static-block": "^7.23.4",
+ "@babel/plugin-transform-classes": "^7.23.5",
+ "@babel/plugin-transform-computed-properties": "^7.23.3",
+ "@babel/plugin-transform-destructuring": "^7.23.3",
+ "@babel/plugin-transform-dotall-regex": "^7.23.3",
+ "@babel/plugin-transform-duplicate-keys": "^7.23.3",
+ "@babel/plugin-transform-dynamic-import": "^7.23.4",
+ "@babel/plugin-transform-exponentiation-operator": "^7.23.3",
+ "@babel/plugin-transform-export-namespace-from": "^7.23.4",
+ "@babel/plugin-transform-for-of": "^7.23.6",
+ "@babel/plugin-transform-function-name": "^7.23.3",
+ "@babel/plugin-transform-json-strings": "^7.23.4",
+ "@babel/plugin-transform-literals": "^7.23.3",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.23.4",
+ "@babel/plugin-transform-member-expression-literals": "^7.23.3",
+ "@babel/plugin-transform-modules-amd": "^7.23.3",
+ "@babel/plugin-transform-modules-commonjs": "^7.23.3",
+ "@babel/plugin-transform-modules-systemjs": "^7.23.3",
+ "@babel/plugin-transform-modules-umd": "^7.23.3",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
+ "@babel/plugin-transform-new-target": "^7.23.3",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
+ "@babel/plugin-transform-numeric-separator": "^7.23.4",
+ "@babel/plugin-transform-object-rest-spread": "^7.23.4",
+ "@babel/plugin-transform-object-super": "^7.23.3",
+ "@babel/plugin-transform-optional-catch-binding": "^7.23.4",
+ "@babel/plugin-transform-optional-chaining": "^7.23.4",
+ "@babel/plugin-transform-parameters": "^7.23.3",
+ "@babel/plugin-transform-private-methods": "^7.23.3",
+ "@babel/plugin-transform-private-property-in-object": "^7.23.4",
+ "@babel/plugin-transform-property-literals": "^7.23.3",
+ "@babel/plugin-transform-regenerator": "^7.23.3",
+ "@babel/plugin-transform-reserved-words": "^7.23.3",
+ "@babel/plugin-transform-shorthand-properties": "^7.23.3",
+ "@babel/plugin-transform-spread": "^7.23.3",
+ "@babel/plugin-transform-sticky-regex": "^7.23.3",
+ "@babel/plugin-transform-template-literals": "^7.23.3",
+ "@babel/plugin-transform-typeof-symbol": "^7.23.3",
+ "@babel/plugin-transform-unicode-escapes": "^7.23.3",
+ "@babel/plugin-transform-unicode-property-regex": "^7.23.3",
+ "@babel/plugin-transform-unicode-regex": "^7.23.3",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.23.3",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "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==",
+ "peer": true,
+ "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-typescript": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz",
+ "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/helper-validator-option": "^7.22.15",
+ "@babel/plugin-syntax-jsx": "^7.23.3",
+ "@babel/plugin-transform-modules-commonjs": "^7.23.3",
+ "@babel/plugin-transform-typescript": "^7.23.3"
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz",
+ "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==",
+ "peer": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime/node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "peer": true
+ },
+ "node_modules/@babel/template": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+ "peer": true,
+ "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.6",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz",
+ "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@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.6",
+ "@babel/types": "^7.23.6",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz",
+ "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.23.4",
+ "@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==",
+ "peer": true
+ },
+ "node_modules/@buttercup/fetch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@buttercup/fetch/-/fetch-0.1.2.tgz",
+ "integrity": "sha512-mDBtsysQ0Gnrp4FamlRJGpu7HUHwbyLC4uUav1I7QAqThFAa/4d1cdZCxrV5gKvh6zO1fu95bILNJi4Y2hALhQ==",
+ "optionalDependencies": {
+ "node-fetch": "^3.3.0"
+ }
+ },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.4.0.tgz",
+ "integrity": "sha512-/PPLr2g5PAUCKAPEbfyk6/baZA+WJHQtUhPkoCQMpyRE8I0lXrG1QFRN8e5s3ZYxM8d/g5BZc6lH3s8Op7/VEg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^2.2.2"
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.2.tgz",
+ "integrity": "sha512-wCDUe/MAw7npAHFLyW3QjSyLA66S5QFaV1jIXlNQvdJ8RzXDSgALa49eWcUO6P55ARQaz0TsDdAgdRgkXFYY8g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ }
+ },
+ "node_modules/@csstools/media-query-list-parser": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.6.tgz",
+ "integrity": "sha512-R6AKl9vaU0It7D7TR2lQn0pre5aQfdeqHRePlaRCY8rHL3l9eVlNRpsEVDKFi/zAjzv68CxH2M5kqbhPFPKjvw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^2.4.0",
+ "@csstools/css-tokenizer": "^2.2.2"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.1.tgz",
+ "integrity": "sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.0.13"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@es-joy/jsdoccomment": {
+ "version": "0.41.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz",
+ "integrity": "sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "comment-parser": "1.4.1",
+ "esquery": "^1.5.0",
+ "jsdoc-type-pratt-parser": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/eslint-utils/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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+ "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "peer": true,
+ "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/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
+ "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz",
+ "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==",
+ "peer": true,
+ "dependencies": {
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz",
+ "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==",
+ "peer": true,
+ "dependencies": {
+ "@floating-ui/core": "^1.4.2",
+ "@floating-ui/utils": "^0.1.3"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
+ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==",
+ "peer": true
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.13",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
+ "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
+ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/@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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+ "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "peer": true,
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/reporters": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^29.7.0",
+ "jest-config": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-resolve-dependencies": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.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/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/@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==",
+ "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/@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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/core/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "peer": true,
+ "dependencies": {
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "peer": true,
+ "dependencies": {
+ "expect": "^29.7.0",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "jest-get-type": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+ "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+ "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "peer": true,
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.1",
+ "strip-ansi": "^6.0.0",
+ "v8-to-istanbul": "^9.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.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/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/@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==",
+ "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/@jest/reporters/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==",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz",
+ "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@jest/reporters/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==",
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@jest/reporters/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==",
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/reporters/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==",
+ "peer": true,
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+ "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "peer": true,
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+ "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "peer": true,
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^4.0.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/@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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "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/@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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+ "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@mapbox/hast-util-table-cell-style": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.1.tgz",
+ "integrity": "sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==",
+ "peer": true,
+ "dependencies": {
+ "unist-util-visit": "^1.4.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
+ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
+ "peer": true
+ },
+ "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
+ "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
+ "peer": true,
+ "dependencies": {
+ "unist-util-visit-parents": "^2.0.0"
+ }
+ },
+ "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
+ "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
+ "peer": true,
+ "dependencies": {
+ "unist-util-is": "^3.0.0"
+ }
+ },
+ "node_modules/@nextcloud/auth": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@nextcloud/auth/-/auth-2.2.1.tgz",
+ "integrity": "sha512-zYtgrg9NMZfN8kmL5JPCsh5jDhpTCEslhnZWMvbhTiQ7hrOnji/67ok6VMK0CTJ1a92Vr67Ow72lW7YRX69zEA==",
+ "dependencies": {
+ "@nextcloud/event-bus": "^3.1.0"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/axios": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-2.4.0.tgz",
+ "integrity": "sha512-ARGzT9p45L0sjRIV3JZWGPtMbwgxd4eEMcMJNn58NA7UQIsMkTwHb5pXQjL+5elXY9zp/JMz7n/7SHTp0bkuXQ==",
+ "dependencies": {
+ "@nextcloud/auth": "^2.1.0",
+ "@nextcloud/router": "^2.1.2",
+ "axios": "^1.4.0"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/babel-config": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/babel-config/-/babel-config-1.0.0.tgz",
+ "integrity": "sha512-olz7sqPD7xMDP2KcYwODtitH37faR/C5jKX1oxXzdDf+s1FRy6OQTC5ZqZR2LHZA6jTUvmwM/xWBPoEB/HPFRw==",
+ "dev": true,
+ "peerDependencies": {
+ "@babel/core": "^7.13.10",
+ "@babel/plugin-proposal-class-properties": "^7.13.0",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-transform-modules-commonjs": "^7.13.8",
+ "@babel/plugin-transform-shorthand-properties": "^7.12.13",
+ "@babel/preset-env": "^7.13.12"
+ }
+ },
+ "node_modules/@nextcloud/browser-storage": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/browser-storage/-/browser-storage-0.3.0.tgz",
+ "integrity": "sha512-vqc26T4WQ3y9EbFpHh4dl/FN7ahEfEoc0unQmsdJ2YSZNTxTvAXAasWI6HFNcHi10b5rEYxxEYjAwKF34th3Aw==",
+ "peer": true,
+ "dependencies": {
+ "core-js": "3.33.0"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/browser-storage/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,
+ "peer": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/@nextcloud/browserslist-config": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/browserslist-config/-/browserslist-config-3.0.0.tgz",
+ "integrity": "sha512-daCnyNBVsWdWjJ5HcaE6jtiDAqaJAGbiWyaTtj/64ztnBget9qEwHC55uA1JNbJOBgNf2lyoQo5rgfatn9sUTw==",
+ "dev": true,
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/calendar-js": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/calendar-js/-/calendar-js-6.1.0.tgz",
+ "integrity": "sha512-thVS6Bz+TV7rUB+LO5yFbOhdm65zICDRKcHDUquaZiWL9r6TyV9hCYDcP7cDRV+62wZJh8QPmf1E+d7ZFUOVeA==",
+ "peer": true,
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ },
+ "peerDependencies": {
+ "ical.js": "^1.5.0",
+ "uuid": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/capabilities": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/capabilities/-/capabilities-1.1.0.tgz",
+ "integrity": "sha512-BccveP5M5eKym1gtTYVI2huk75nzYuxqJ+JXkqF3C+gZVdJk8AE3pySKhBtRmngM6vy8BzDVQk5Q/LplHCKPgw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/cli": "^7.18.10",
+ "@babel/core": "^7.18.10",
+ "@babel/preset-env": "^7.18.10",
+ "@babel/preset-typescript": "^7.18.6",
+ "@nextcloud/browserslist-config": "^2.2.0",
+ "@nextcloud/initial-state": "^2.0.0",
+ "babel-jest": "^29.5.0",
+ "babel-plugin-transform-class-properties": "^6.24.1",
+ "core-js": "^3.24.1",
+ "jest": "^29.5.0",
+ "typedoc": "^0.24.1",
+ "typescript": "^4.7.4"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/capabilities/node_modules/@nextcloud/browserslist-config": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/browserslist-config/-/browserslist-config-2.2.0.tgz",
+ "integrity": "sha512-kC42RQW5rZjZZsRaEjVlIQpp6aW/yxm+zZdETnrRQnUzcPwBgF4wO4makfGT63Ckd+LkgUW+geesPiPRqxFVew==",
+ "peer": true
+ },
+ "node_modules/@nextcloud/capabilities/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==",
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@nextcloud/capabilities/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@nextcloud/capabilities/node_modules/typedoc": {
+ "version": "0.24.8",
+ "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz",
+ "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==",
+ "peer": true,
+ "dependencies": {
+ "lunr": "^2.3.9",
+ "marked": "^4.3.0",
+ "minimatch": "^9.0.0",
+ "shiki": "^0.14.1"
+ },
+ "bin": {
+ "typedoc": "bin/typedoc"
+ },
+ "engines": {
+ "node": ">= 14.14"
+ },
+ "peerDependencies": {
+ "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x"
+ }
+ },
+ "node_modules/@nextcloud/capabilities/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/@nextcloud/dialogs": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-5.0.3.tgz",
+ "integrity": "sha512-eF0wIJ9p+kij6U357jAxYZ6eRVpdMLrbfMwVoUC5nGcJcsFTpiGn3/F4kK/045jTdMaPW6YyyiEVXyiM7lVfGA==",
+ "dependencies": {
+ "@nextcloud/axios": "^2.4.0",
+ "@nextcloud/event-bus": "^3.1.0",
+ "@nextcloud/files": "^3.0.0",
+ "@nextcloud/initial-state": "^2.1.0",
+ "@nextcloud/l10n": "^2.2.0",
+ "@nextcloud/router": "^2.2.0",
+ "@nextcloud/typings": "^1.7.0",
+ "@types/toastify-js": "^1.12.3",
+ "@vueuse/core": "^10.6.1",
+ "toastify-js": "^1.12.0",
+ "vue-frag": "^1.4.3",
+ "webdav": "^5.3.0"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ },
+ "peerDependencies": {
+ "@nextcloud/vue": "^8.2.0",
+ "vue": "^2.7.15"
+ }
+ },
+ "node_modules/@nextcloud/eslint-config": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/eslint-config/-/eslint-config-8.3.0.tgz",
+ "integrity": "sha512-Jsv34fwmZThCC25eClMFj5R44TjYAi22glLG7XWfoBI795oKBuNTfIbTf91YrbACsoOHrUrtMzsQYbsrJMgQPw==",
+ "dev": true,
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.22.20",
+ "@babel/eslint-parser": "^7.16.5",
+ "@nextcloud/eslint-plugin": "^2.1.0",
+ "@vue/eslint-config-typescript": "^12.0.0",
+ "eslint": "^8.27.0",
+ "eslint-config-standard": "^17.1.0",
+ "eslint-import-resolver-exports": "^1.0.0-beta.5",
+ "eslint-import-resolver-typescript": "^3.6.1",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-jsdoc": "^46.2.6",
+ "eslint-plugin-n": "^16.0.0",
+ "eslint-plugin-promise": "^6.1.1",
+ "eslint-plugin-vue": "^9.7.0",
+ "typescript": "^5.0.2"
+ }
+ },
+ "node_modules/@nextcloud/eslint-plugin": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/eslint-plugin/-/eslint-plugin-2.1.0.tgz",
+ "integrity": "sha512-PtudCw6Ks4pUNrmQ+0IqevCj2NaspfvisbAitYZX6mAL2yAI1+4a6uDa38EBUWellvbR7+9rGDQMiHdwmY9skw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "jest": "^29.6.0",
+ "requireindex": "^1.2.0"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/@nextcloud/event-bus": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/event-bus/-/event-bus-3.1.0.tgz",
+ "integrity": "sha512-purXQsXbhbmpcDsbDuR0i7vwUgOsqnIUa7QAD3lV/UZUkUT94SmxBM5LgQ8iV8TQBWWleEwQHy5kYfHeTGF9wg==",
+ "dependencies": {
+ "semver": "^7.5.1"
+ },
+ "engines": {
+ "node": "^16.0.0",
+ "npm": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@nextcloud/event-bus/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/@nextcloud/event-bus/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/@nextcloud/event-bus/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/@nextcloud/files": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.0.0.tgz",
+ "integrity": "sha512-zk5oIuVDyk2gWBKCJ+0B1HE3VjhuGnz2iLNbTcbRuTjMYb6aYCAEn1LY0dXbUQG93ehndYJCOdaYri/TaGrlXw==",
+ "dependencies": {
+ "@nextcloud/auth": "^2.2.1",
+ "@nextcloud/l10n": "^2.2.0",
+ "@nextcloud/logger": "^2.7.0",
+ "@nextcloud/paths": "^2.1.0",
+ "@nextcloud/router": "^2.2.0",
+ "is-svg": "^5.0.0",
+ "webdav": "^5.3.0"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/initial-state": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/initial-state/-/initial-state-2.1.0.tgz",
+ "integrity": "sha512-b92X/GvUPGQJpUQwauyG3D3dHsWowViVLnTtFPSMUc0rXtvYR5CvhkqJRfPC7O7W4VC7+V3q+FWeA+mQWMxN2Q==",
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/l10n": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/l10n/-/l10n-2.2.0.tgz",
+ "integrity": "sha512-UAM2NJcl/NR46MANSF7Gr7q8/Up672zRyGrxLpN3k4URNmWQM9upkbRME+1K3T29wPrUyOIbQu710ZjvZafqFA==",
+ "dependencies": {
+ "@nextcloud/router": "^2.1.2",
+ "@nextcloud/typings": "^1.7.0",
+ "dompurify": "^3.0.3",
+ "escape-html": "^1.0.3",
+ "node-gettext": "^3.0.0"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/logger": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/logger/-/logger-2.7.0.tgz",
+ "integrity": "sha512-DSJg9H1jT2zfr7uoP4tL5hKncyY+LOuxJzLauj0M/f6gnpoXU5WG1Zw8EFPOrRWjkC0ZE+NCqrMnITgdRRpXJQ==",
+ "dependencies": {
+ "@nextcloud/auth": "^2.0.0",
+ "core-js": "^3.6.4"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/paths": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/paths/-/paths-2.1.0.tgz",
+ "integrity": "sha512-8wX0gqwez0bTuAS8A0OEiqbbp0ZsqLr07zSErmS6OYhh9KZcSt/kO6lQV5tnrFqIqJVsxwz4kHUjtZXh6DSf9Q==",
+ "dependencies": {
+ "core-js": "^3.6.4"
+ }
+ },
+ "node_modules/@nextcloud/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-M4AVGnB5tt3MYO5RpH/R2jq7z/nW05AmRhk4Lh68krVwRIYGo8pgNikKrPGogHd2Q3UgzF5Py1drHz3uuV99bQ==",
+ "dependencies": {
+ "@nextcloud/typings": "^1.7.0",
+ "core-js": "^3.6.4"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/stylelint-config": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@nextcloud/stylelint-config/-/stylelint-config-2.3.1.tgz",
+ "integrity": "sha512-Bhz0xIC2SWS2ihzRFCkKuEc7M1WeHeImu7JvmBZfdxlcM7FuFwV8L8JIIsnzKED1xd6ZtmAlPYWstE8hMKwOxQ==",
+ "dev": true,
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ },
+ "peerDependencies": {
+ "stylelint": "^15.6.0",
+ "stylelint-config-recommended-scss": "^12.0.0",
+ "stylelint-config-recommended-vue": "^1.1.0"
+ }
+ },
+ "node_modules/@nextcloud/typings": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.7.0.tgz",
+ "integrity": "sha512-fK1i09FYTfSUBdXswyiCr8ng5MwdWjEWOF7hRvNvq5i+XFUSmGjSsRmpQZFM2AONroHqGGQBkvQqpONUshFBJQ==",
+ "dependencies": {
+ "@types/jquery": "3.5.16",
+ "vue": "^2.7.14",
+ "vue-router": "<4"
+ },
+ "engines": {
+ "node": "^16.0.0",
+ "npm": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@nextcloud/vue": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.3.0.tgz",
+ "integrity": "sha512-2duDJflaeHMmtV+l6MXyhKY2t1TUB5GjkDvSL0KZ9i1QHXLVhhWObhI7cclO/qqu7/yoEdrBLY/Ga7uBPBmr7g==",
+ "peer": true,
+ "dependencies": {
+ "@floating-ui/dom": "^1.1.0",
+ "@nextcloud/auth": "^2.0.0",
+ "@nextcloud/axios": "^2.0.0",
+ "@nextcloud/browser-storage": "^0.3.0",
+ "@nextcloud/calendar-js": "^6.0.0",
+ "@nextcloud/capabilities": "^1.0.4",
+ "@nextcloud/event-bus": "^3.0.0",
+ "@nextcloud/initial-state": "^2.0.0",
+ "@nextcloud/l10n": "^2.0.1",
+ "@nextcloud/logger": "^2.2.1",
+ "@nextcloud/router": "^2.0.0",
+ "@nextcloud/vue-select": "^3.24.0",
+ "@vueuse/components": "^10.0.2",
+ "@vueuse/core": "^10.1.2",
+ "clone": "^2.1.2",
+ "debounce": "2.0.0",
+ "dompurify": "^3.0.5",
+ "emoji-mart-vue-fast": "^15.0.0",
+ "escape-html": "^1.0.3",
+ "floating-vue": "^1.0.0-beta.19",
+ "focus-trap": "^7.4.3",
+ "linkify-string": "^4.0.0",
+ "md5": "^2.3.0",
+ "node-polyfill-webpack-plugin": "^2.0.1",
+ "rehype-external-links": "^3.0.0",
+ "rehype-react": "^7.1.2",
+ "remark-breaks": "^4.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "splitpanes": "^2.4.1",
+ "string-length": "^5.0.1",
+ "striptags": "^3.2.0",
+ "tributejs": "^5.1.3",
+ "unified": "^11.0.1",
+ "unist-builder": "^4.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vue": "^2.7.14",
+ "vue-color": "^2.8.1",
+ "vue-frag": "^1.4.3",
+ "vue2-datepicker": "^3.11.0"
+ },
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ }
+ },
+ "node_modules/@nextcloud/vue-select": {
+ "version": "3.24.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/vue-select/-/vue-select-3.24.0.tgz",
+ "integrity": "sha512-+TQYaqB57OcwG3XSKpUtVcbUZIkX8KHzjTCWRFAiRqwryXTuBvY/JHzB5i31BFHJ6CK+l8WyBu8LgmtQW8ktrw==",
+ "peer": true,
+ "peerDependencies": {
+ "vue": "2.x"
+ }
+ },
+ "node_modules/@nextcloud/webpack-vue-config": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@nextcloud/webpack-vue-config/-/webpack-vue-config-6.0.0.tgz",
+ "integrity": "sha512-CLI1D5eFn/NSy2dq7U8I3R2YnE9yvHA01c49ukZmKiOEkDVFHRSkyBMQDfX0G77hHvPiIQuJdJ3ozN1esZu9kg==",
+ "dev": true,
+ "engines": {
+ "node": "^20.0.0",
+ "npm": "^9.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.22.9",
+ "babel-loader": "^9.1.3",
+ "css-loader": "^6.8.1",
+ "node-polyfill-webpack-plugin": "2.0.1",
+ "sass": "^1.64.2",
+ "sass-loader": "^13.3.2",
+ "style-loader": "^3.3.3",
+ "ts-loader": "^9.4.4",
+ "vue": "^2.7.14",
+ "vue-loader": "^15.10.1",
+ "vue-template-compiler": "^2.7.14",
+ "webpack": "^5.88.2",
+ "webpack-cli": "^5.1.4",
+ "webpack-dev-server": "^4.15.1"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/chokidar-2": {
+ "version": "2.1.8-no-fsevents.3",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
+ "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==",
+ "optional": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+ "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
+ "peer": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "peer": true,
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "peer": true,
+ "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.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz",
+ "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.5",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
+ "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
+ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
+ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.0.tgz",
+ "integrity": "sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg==",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "peer": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "peer": true
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "dev": true,
+ "peer": true,
+ "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.41",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz",
+ "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz",
+ "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
+ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.14",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz",
+ "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "peer": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jquery": {
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz",
+ "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==",
+ "dependencies": {
+ "@types/sizzle": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
+ "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/ms": {
+ "version": "0.7.34",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
+ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==",
+ "peer": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.10.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz",
+ "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==",
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/node-forge": {
+ "version": "1.3.10",
+ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz",
+ "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.11",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
+ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==",
+ "peer": true
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.10",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz",
+ "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.45",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz",
+ "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==",
+ "peer": true,
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
+ "peer": true
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
+ "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
+ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
+ "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.5",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz",
+ "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/mime": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/sizzle": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz",
+ "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg=="
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
+ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "peer": true
+ },
+ "node_modules/@types/toastify-js": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/@types/toastify-js/-/toastify-js-1.12.3.tgz",
+ "integrity": "sha512-9RjLlbAHMSaae/KZNHGv19VG4gcLIm3YjvacCXBtfMfYn26h76YP5oxXI8k26q4iKXCB9LNfv18lsoS0JnFPTg=="
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+ "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==",
+ "peer": true
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
+ "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.10",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
+ "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.32",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
+ "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
+ "peer": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "peer": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz",
+ "integrity": "sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.15.0",
+ "@typescript-eslint/type-utils": "6.15.0",
+ "@typescript-eslint/utils": "6.15.0",
+ "@typescript-eslint/visitor-keys": "6.15.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz",
+ "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.15.0",
+ "@typescript-eslint/types": "6.15.0",
+ "@typescript-eslint/typescript-estree": "6.15.0",
+ "@typescript-eslint/visitor-keys": "6.15.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz",
+ "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.15.0",
+ "@typescript-eslint/visitor-keys": "6.15.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz",
+ "integrity": "sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.15.0",
+ "@typescript-eslint/utils": "6.15.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz",
+ "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz",
+ "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.15.0",
+ "@typescript-eslint/visitor-keys": "6.15.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.15.0.tgz",
+ "integrity": "sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.15.0",
+ "@typescript-eslint/types": "6.15.0",
+ "@typescript-eslint/typescript-estree": "6.15.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz",
+ "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.15.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "peer": true
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "2.7.15",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.15.tgz",
+ "integrity": "sha512-FCvIEevPmgCgqFBH7wD+3B97y7u7oj/Wr69zADBf403Tui377bThTjBvekaZvlRr4IwUAu3M6hYZeULZFJbdYg==",
+ "dependencies": {
+ "@babel/parser": "^7.18.4",
+ "postcss": "^8.4.14",
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz",
+ "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "consolidate": "^0.15.1",
+ "hash-sum": "^1.0.2",
+ "lru-cache": "^4.1.2",
+ "merge-source-map": "^1.1.0",
+ "postcss": "^7.0.36",
+ "postcss-selector-parser": "^6.0.2",
+ "source-map": "~0.6.1",
+ "vue-template-es2015-compiler": "^1.9.0"
+ },
+ "optionalDependencies": {
+ "prettier": "^1.18.2 || ^2.0.0"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/@vue/component-compiler-utils/node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@vue/eslint-config-typescript": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz",
+ "integrity": "sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "^6.7.0",
+ "@typescript-eslint/parser": "^6.7.0",
+ "vue-eslint-parser": "^9.3.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0",
+ "eslint-plugin-vue": "^9.0.0",
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/components": {
+ "version": "10.7.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.7.0.tgz",
+ "integrity": "sha512-ycyF+fZtipP/8WVWZ5y6Cb9twJ0EeVHIqcqkCcTpmAJdheRjorT8v6cHk3h144HHTMgIfBWC6TaSukDG7QFmsw==",
+ "peer": true,
+ "dependencies": {
+ "@vueuse/core": "10.7.0",
+ "@vueuse/shared": "10.7.0",
+ "vue-demi": ">=0.14.6"
+ }
+ },
+ "node_modules/@vueuse/components/node_modules/vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "hasInstallScript": true,
+ "peer": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/core": {
+ "version": "10.7.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.7.0.tgz",
+ "integrity": "sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.20",
+ "@vueuse/metadata": "10.7.0",
+ "@vueuse/shared": "10.7.0",
+ "vue-demi": ">=0.14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/core/node_modules/vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "10.7.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.7.0.tgz",
+ "integrity": "sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA==",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "10.7.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.7.0.tgz",
+ "integrity": "sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==",
+ "dependencies": {
+ "vue-demi": ">=0.14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared/node_modules/vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webpack-cli/configtest": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
+ "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/info": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
+ "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/serve": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
+ "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "peer": true,
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
+ "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/adm-zip": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz",
+ "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "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==",
+ "peer": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "peer": true,
+ "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-sequence-parser": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz",
+ "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/are-docs-informative": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
+ "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "peer": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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-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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/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==",
+ "dev": true,
+ "peer": true,
+ "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/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "peer": true,
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/asn1.js/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "peer": true
+ },
+ "node_modules/assert": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz",
+ "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==",
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-nan": "^1.3.2",
+ "object-is": "^1.1.5",
+ "object.assign": "^4.1.4",
+ "util": "^0.12.5"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/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==",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz",
+ "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==",
+ "peer": true,
+ "dependencies": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==",
+ "peer": true
+ },
+ "node_modules/babel-code-frame/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==",
+ "peer": true,
+ "dependencies": {
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==",
+ "peer": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "peer": true,
+ "dependencies": {
+ "@jest/transform": "^29.7.0",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^29.6.3",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-jest/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz",
+ "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "find-cache-dir": "^4.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0",
+ "webpack": ">=5"
+ }
+ },
+ "node_modules/babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==",
+ "peer": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.1.14",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz",
+ "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.4.4",
+ "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.7",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz",
+ "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.4.4",
+ "core-js-compat": "^3.33.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz",
+ "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.4.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-syntax-class-properties": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
+ "integrity": "sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==",
+ "peer": true
+ },
+ "node_modules/babel-plugin-transform-class-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
+ "integrity": "sha512-n4jtBA3OYBdvG5PRMKsMXJXHfLYw/ZOmtxCLOOwz6Ro5XlrColkStLnz1AS1L2yfPA9BKJ1ZNlmVCLjAL9DSIg==",
+ "peer": true,
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-plugin-syntax-class-properties": "^6.8.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "peer": true,
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+ "peer": true,
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "node_modules/babel-runtime/node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "hasInstallScript": true,
+ "peer": true
+ },
+ "node_modules/babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==",
+ "peer": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==",
+ "peer": true,
+ "dependencies": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-traverse/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "peer": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/babel-traverse/node_modules/globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-traverse/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "peer": true
+ },
+ "node_modules/babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==",
+ "peer": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "node_modules/babel-types/node_modules/to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "peer": true,
+ "bin": {
+ "babylon": "bin/babylon.js"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "peer": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "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/base-64": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz",
+ "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "devOptional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "peer": true
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "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.1",
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/body-parser/node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "peer": true
+ },
+ "node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "peer": true,
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "peer": true,
+ "dependencies": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "node_modules/browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "peer": true,
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+ "peer": true,
+ "dependencies": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "node_modules/browserify-sign": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz",
+ "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==",
+ "peer": true,
+ "dependencies": {
+ "bn.js": "^5.2.1",
+ "browserify-rsa": "^4.1.0",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.4",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.6",
+ "readable-stream": "^3.6.2",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/browserify-sign/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==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "peer": true,
+ "dependencies": {
+ "pako": "~1.0.5"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.22.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
+ "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+ "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"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001565",
+ "electron-to-chromium": "^1.4.601",
+ "node-releases": "^2.0.14",
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
+ "peer": true
+ },
+ "node_modules/builtins": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
+ "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "semver": "^7.0.0"
+ }
+ },
+ "node_modules/builtins/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/builtins/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/builtins/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz",
+ "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q=="
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "peer": true,
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
+ "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "camelcase": "^6.3.0",
+ "map-obj": "^4.1.0",
+ "quick-lru": "^5.1.1",
+ "type-fest": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001570",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
+ "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+ "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"
+ }
+ ],
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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": "2.0.1",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz",
+ "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==",
+ "peer": true,
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "peer": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "peer": true,
+ "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/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==",
+ "peer": true,
+ "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"
+ }
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/clamp": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz",
+ "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==",
+ "peer": true
+ },
+ "node_modules/cli-progress": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz",
+ "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.3"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "peer": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clone-deep/node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true,
+ "peer": true
+ },
+ "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/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "peer": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/comment-parser": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+ "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "peer": true
+ },
+ "node_modules/consolidate": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
+ "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+ "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "bluebird": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/copy-webpack-plugin": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz",
+ "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==",
+ "dev": true,
+ "dependencies": {
+ "fast-glob": "^3.2.11",
+ "glob-parent": "^6.0.1",
+ "globby": "^13.1.1",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/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==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/globby": {
+ "version": "13.2.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz",
+ "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==",
+ "dev": true,
+ "dependencies": {
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.3.0",
+ "ignore": "^5.2.4",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "3.34.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.34.0.tgz",
+ "integrity": "sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.34.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz",
+ "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.22.2"
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/cornerstone-core": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/cornerstone-core/-/cornerstone-core-2.6.1.tgz",
+ "integrity": "sha512-LAXjXwNnK2W65ZxpE7phVLjbijkYUrAQIGv5xqKjK8+dmIGlBxqvPHnyGwEqVDyKOWVrpXP6ymUPwrGGRwzgMg=="
+ },
+ "node_modules/cornerstone-math": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/cornerstone-math/-/cornerstone-math-0.1.10.tgz",
+ "integrity": "sha512-23XSAyP7t70ANvhFyqwvva+zFd1bQ2d5GL7tg9qKE932WmImjA2Y9tiy5n0iTtnf51W/78Png8Lia2o4dCdJaQ=="
+ },
+ "node_modules/cornerstone-tools": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/cornerstone-tools/-/cornerstone-tools-2.6.0.tgz",
+ "integrity": "sha512-6B6MMiQgyPkNjKYHM5aRVmEIruUDm628b9j9tqRlI5P8dS8/kltY3UjUR50RW/PEY5W0IDD09pYNMTqP2oANtw==",
+ "dependencies": {
+ "cornerstone-math": "^0.1.6"
+ }
+ },
+ "node_modules/cornerstone-wado-image-loader": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-2.2.4.tgz",
+ "integrity": "sha512-LHMvJylC4N1r7IAatAfU/bhUgJnQUXVimXmWkNdUW7zTRrmz+eA9PJ7Gk0xsNC1teUvA8G66aRe0Pt5M+WYXvA==",
+ "dependencies": {
+ "dicom-parser": "^1.8.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/cosmiconfig/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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/cosmiconfig/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "peer": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
+ "node_modules/create-ecdh/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "peer": true
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "peer": true,
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "peer": true,
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/create-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "prompts": "^2.0.1"
+ },
+ "bin": {
+ "create-jest": "bin/create-jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/create-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==",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/create-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==",
+ "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/create-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==",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/create-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==",
+ "peer": true
+ },
+ "node_modules/create-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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/create-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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "peer": true,
+ "dependencies": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/css-functions-list": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz",
+ "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12 || >=16"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/date-format-parse": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/date-format-parse/-/date-format-parse-0.2.7.tgz",
+ "integrity": "sha512-/+lyMUKoRogMuTeOVii6lUwjbVlesN9YRYLzZT/g3TEZ3uD9QnpjResujeEqUW+OSNbT7T1+SYdyEkTcRv+KDQ==",
+ "peer": true
+ },
+ "node_modules/de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/debounce": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.0.0.tgz",
+ "integrity": "sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "peer": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
+ "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+ "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
+ "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
+ "peer": true,
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dedent": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz",
+ "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==",
+ "peer": true,
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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/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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/des.js": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz",
+ "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "peer": true,
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dicom-parser": {
+ "version": "1.8.21",
+ "resolved": "https://registry.npmjs.org/dicom-parser/-/dicom-parser-1.8.21.tgz",
+ "integrity": "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w=="
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "peer": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "peer": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "node_modules/diffie-hellman/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/domain-browser": {
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz",
+ "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/dompurify": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.6.tgz",
+ "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w=="
+ },
+ "node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dev": true,
+ "peer": true,
+ "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/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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.615",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
+ "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
+ "peer": true
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "peer": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "peer": true
+ },
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-mart-vue-fast": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-15.0.0.tgz",
+ "integrity": "sha512-3BzkDrs60JyT00dLHMAxWKbpFhbyaW9C+q1AjtqGovSxTu8TC2mYAGsvTmXNYKm39IRRAS56v92TihOcB98IsQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.18.6",
+ "core-js": "^3.23.5"
+ },
+ "peerDependencies": {
+ "vue": ">2.0.0"
+ }
+ },
+ "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/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/envinfo": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
+ "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
+ "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.2",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.5",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.2",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0",
+ "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.13.1",
+ "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.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
+ "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
+ "peer": true
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
+ "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "has-tostringtag": "^1.0.0",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
+ "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.56.0",
+ "@humanwhocodes/config-array": "^0.11.13",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "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-compat-utils": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
+ "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-config-standard": {
+ "version": "17.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz",
+ "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.1",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-n": "^15.0.0 || ^16.0.0 ",
+ "eslint-plugin-promise": "^6.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-exports": {
+ "version": "1.0.0-beta.5",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-exports/-/eslint-import-resolver-exports-1.0.0-beta.5.tgz",
+ "integrity": "sha512-o6t0w7muUpXr7MkUVzD5igQoDfAQvTmcPp8HEAJdNF8eOuAO+yn6I/TTyMxz9ecCwzX7e02vzlkHURoScUuidg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "resolve.exports": "^2.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz",
+ "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "enhanced-resolve": "^5.12.0",
+ "eslint-module-utils": "^2.7.4",
+ "fast-glob": "^3.3.1",
+ "get-tsconfig": "^4.5.0",
+ "is-core-module": "^2.11.0",
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-es-x": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz",
+ "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.1.2",
+ "@eslint-community/regexpp": "^4.6.0",
+ "eslint-compat-utils": "^0.1.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "eslint": ">=8"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.29.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
+ "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "array-includes": "^3.1.7",
+ "array.prototype.findlastindex": "^1.2.3",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.8.0",
+ "hasown": "^2.0.0",
+ "is-core-module": "^2.13.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.7",
+ "object.groupby": "^1.0.1",
+ "object.values": "^1.1.7",
+ "semver": "^6.3.1",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc": {
+ "version": "46.9.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.9.1.tgz",
+ "integrity": "sha512-11Ox5LCl2wY7gGkp9UOyew70o9qvii1daAH+h/MFobRVRNcy7sVlH+jm0HQdgcvcru6285GvpjpUyoa051j03Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@es-joy/jsdoccomment": "~0.41.0",
+ "are-docs-informative": "^0.0.2",
+ "comment-parser": "1.4.1",
+ "debug": "^4.3.4",
+ "escape-string-regexp": "^4.0.0",
+ "esquery": "^1.5.0",
+ "is-builtin-module": "^3.2.1",
+ "semver": "^7.5.4",
+ "spdx-expression-parse": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/eslint-plugin-n": {
+ "version": "16.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.4.0.tgz",
+ "integrity": "sha512-IkqJjGoWYGskVaJA7WQuN8PINIxc0N/Pk/jLeYT4ees6Fo5lAhpwGsYek6gS9tCUxgDC4zJ+OwY2bY/6/9OMKQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "builtins": "^5.0.1",
+ "eslint-plugin-es-x": "^7.5.0",
+ "get-tsconfig": "^4.7.0",
+ "ignore": "^5.2.4",
+ "is-builtin-module": "^3.2.1",
+ "is-core-module": "^2.12.1",
+ "minimatch": "^3.1.2",
+ "resolve": "^1.22.2",
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-n/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-n/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-n/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/eslint-plugin-promise": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz",
+ "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "9.19.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
+ "integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.1.1",
+ "postcss-selector-parser": "^6.0.13",
+ "semver": "^7.5.4",
+ "vue-eslint-parser": "^9.3.1",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-vue/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-vue/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "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/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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "dev": true,
+ "peer": true,
+ "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/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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "peer": true,
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.1",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/express/node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "peer": true
+ },
+ "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.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "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-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==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/fast-xml-parser": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz",
+ "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ }
+ ],
+ "dependencies": {
+ "strnum": "^1.0.5"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
+ "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "optional": true,
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/filter-obj": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz",
+ "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/find-cache-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
+ "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "common-path-prefix": "^3.0.0",
+ "pkg-dir": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/floating-vue": {
+ "version": "1.0.0-beta.19",
+ "resolved": "https://registry.npmjs.org/floating-vue/-/floating-vue-1.0.0-beta.19.tgz",
+ "integrity": "sha512-OcM7z5Ua4XAykqolmvPj3l1s+KqUKj6Xz2t66eqjgaWfNBjtuifmxO5+4rRXakIch/Crt8IH+vKdKcR3jOUaoQ==",
+ "peer": true,
+ "dependencies": {
+ "@floating-ui/dom": "^0.1.10",
+ "vue-resize": "^1.0.0"
+ },
+ "peerDependencies": {
+ "vue": "^2.6.10"
+ }
+ },
+ "node_modules/floating-vue/node_modules/@floating-ui/core": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.3.1.tgz",
+ "integrity": "sha512-ensKY7Ub59u16qsVIFEo2hwTCqZ/r9oZZFh51ivcLGHfUwTn8l1Xzng8RJUe91H/UP8PeqeBronAGx0qmzwk2g==",
+ "peer": true
+ },
+ "node_modules/floating-vue/node_modules/@floating-ui/dom": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.1.10.tgz",
+ "integrity": "sha512-4kAVoogvQm2N0XE0G6APQJuCNuErjOfPW8Ux7DFxh8+AfugWflwVJ5LDlHOwrwut7z/30NUvdtHzQ3zSip4EzQ==",
+ "peer": true,
+ "dependencies": {
+ "@floating-ui/core": "^0.3.0"
+ }
+ },
+ "node_modules/focus-trap": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz",
+ "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==",
+ "peer": true,
+ "dependencies": {
+ "tabbable": "^6.2.0"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.3",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
+ "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "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/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "optional": true,
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/fs-readdir-recursive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "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"
+ ],
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "peer": true,
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
+ "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "peer": true,
+ "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": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "devOptional": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/globby/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/globjoin": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/hammerjs": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz",
+ "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-ansi/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "peer": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.2"
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash-base/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==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "peer": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-to-hyperscript": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-10.0.3.tgz",
+ "integrity": "sha512-NuBoUStp4fRwmvlfbidlEiRSTk0gSHm+97q4Xn9CJ10HO+Py7nlTuDi6RhM1qLOureukGrCXLG7AAxaGqqyslQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "property-information": "^6.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-object": "^0.4.1",
+ "web-namespaces": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-to-hyperscript/node_modules/@types/unist": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
+ "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+ "peer": true
+ },
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "peer": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz",
+ "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==",
+ "peer": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "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/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "peer": true,
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hosted-git-info/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/hot-patcher": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/hot-patcher/-/hot-patcher-2.0.1.tgz",
+ "integrity": "sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q=="
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/hpack.js/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==",
+ "dev": true,
+ "peer": true,
+ "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/hpack.js/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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/hpack.js/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz",
+ "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/ical.js": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-1.5.0.tgz",
+ "integrity": "sha512-7ZxMkogUkkaCx810yp0ZGKvq1ZpRgJeornPttpoxe6nYZ3NLesZe1wWMXDdwTkj/b5NtXT+Y16Aakph/ao98ZQ==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "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"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/ignore": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
+ "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-lazy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "peer": true,
+ "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/import-local/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==",
+ "peer": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
+ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==",
+ "peer": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
+ "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
+ "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-absolute-url": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz",
+ "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==",
+ "peer": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "devOptional": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "node_modules/is-builtin-module": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
+ "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "builtin-modules": "^3.3.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "peer": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "devOptional": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "devOptional": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-nan": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
+ "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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-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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-svg": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-5.0.0.tgz",
+ "integrity": "sha512-sRl7J0oX9yUNamSdc8cwgzh9KBLnQXNzGmW0RVHwg/jEYjGNYHC6UvnYD8+hAeut9WwxRvhG9biK7g/wDGxcMw==",
+ "dependencies": {
+ "fast-xml-parser": "^4.1.3"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "peer": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
+ "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
+ "peer": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "peer": true,
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "import-local": "^3.0.2",
+ "jest-cli": "^29.7.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.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": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+ "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "peer": true,
+ "dependencies": {
+ "execa": "^5.0.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^1.0.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^29.7.0",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "^29.7.0",
+ "pure-rand": "^6.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-circus/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+ "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "peer": true,
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "create-jest": "^29.7.0",
+ "exit": "^0.1.2",
+ "import-local": "^3.0.2",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "yargs": "^17.3.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.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/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/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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-config/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+ "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "peer": true,
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+ "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/graceful-fs": "^4.1.3",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+ "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
+ "peer": true,
+ "dependencies": {
+ "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": {
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "peer": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+ "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
+ "peer": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^2.0.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+ "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "peer": true,
+ "dependencies": {
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-resolve/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "peer": true,
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/environment": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-leak-detector": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-resolve": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+ "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/globals": "^29.7.0",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+ "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-jsx": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/types": "^7.3.3",
+ "@jest/expect-utils": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^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",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^29.7.0",
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "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/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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+ "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "peer": true,
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "jest-util": "^29.7.0",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "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/jest-watcher/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==",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdoc-type-pratt-parser": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
+ "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "peer": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/known-css-properties": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
+ "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.8.1"
+ }
+ },
+ "node_modules/layerr": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/layerr/-/layerr-2.0.1.tgz",
+ "integrity": "sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg=="
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/linkify-string": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/linkify-string/-/linkify-string-4.1.3.tgz",
+ "integrity": "sha512-6dAgx4MiTcvEX87OS5aNpAioO7cSELUXp61k7azOvMYOLSmREx0w4yM1Uf0+O3JLC08YdkUyZhAX+YkasRt/mw==",
+ "peer": true,
+ "peerDependencies": {
+ "linkifyjs": "^4.0.0"
+ }
+ },
+ "node_modules/linkifyjs": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz",
+ "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/loader-utils/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/lodash.throttle": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
+ "peer": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lunr": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
+ "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
+ "peer": true
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "peer": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "peer": true,
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/marked": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+ "peer": true,
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/material-colors": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
+ "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==",
+ "peer": true
+ },
+ "node_modules/mathml-tag-names": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/md5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
+ "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+ "dependencies": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "~1.1.6"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "peer": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz",
+ "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==",
+ "peer": true,
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
+ "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+ "peer": true,
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-newline-to-break": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz",
+ "integrity": "sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==",
+ "peer": true,
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-find-and-replace": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz",
+ "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==",
+ "peer": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "peer": true,
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "fs-monkey": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/meow": {
+ "version": "10.1.5",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
+ "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/minimist": "^1.2.2",
+ "camelcase-keys": "^7.0.0",
+ "decamelize": "^5.0.0",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.2",
+ "read-pkg-up": "^8.0.0",
+ "redent": "^4.0.0",
+ "trim-newlines": "^4.0.2",
+ "type-fest": "^1.2.2",
+ "yargs-parser": "^20.2.9"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/meow/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/merge-source-map": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
+ "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz",
+ "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz",
+ "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz",
+ "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
+ "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz",
+ "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz",
+ "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
+ "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz",
+ "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz",
+ "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz",
+ "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz",
+ "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz",
+ "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz",
+ "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz",
+ "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz",
+ "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz",
+ "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz",
+ "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz",
+ "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
+ "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz",
+ "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "peer": true
+ },
+ "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/miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "peer": true,
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
+ }
+ },
+ "node_modules/miller-rabin/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "peer": true
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "peer": true
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "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/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/nested-property": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nested-property/-/nested-property-4.0.0.tgz",
+ "integrity": "sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA=="
+ },
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "optional": true,
+ "engines": {
+ "node": ">=10.5.0"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "optional": true,
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-gettext": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/node-gettext/-/node-gettext-3.0.0.tgz",
+ "integrity": "sha512-/VRYibXmVoN6tnSAY2JWhNRhWYJ8Cd844jrZU/DwLVoI4vBI6ceYbd8i42sYZ9uOgDH3S7vslIKOWV/ZrT2YBA==",
+ "dependencies": {
+ "lodash.get": "^4.4.2"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/node-polyfill-webpack-plugin": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz",
+ "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==",
+ "peer": true,
+ "dependencies": {
+ "assert": "^2.0.0",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^6.0.3",
+ "console-browserify": "^1.2.0",
+ "constants-browserify": "^1.0.0",
+ "crypto-browserify": "^3.12.0",
+ "domain-browser": "^4.22.0",
+ "events": "^3.3.0",
+ "filter-obj": "^2.0.2",
+ "https-browserify": "^1.0.0",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "^1.0.1",
+ "process": "^0.11.10",
+ "punycode": "^2.1.1",
+ "querystring-es3": "^0.2.1",
+ "readable-stream": "^4.0.0",
+ "stream-browserify": "^3.0.0",
+ "stream-http": "^3.2.0",
+ "string_decoder": "^1.3.0",
+ "timers-browserify": "^2.0.12",
+ "tty-browserify": "^0.0.1",
+ "type-fest": "^2.14.0",
+ "url": "^0.11.0",
+ "util": "^0.12.4",
+ "vm-browserify": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "webpack": ">=5"
+ }
+ },
+ "node_modules/node-polyfill-webpack-plugin/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "peer": true,
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+ "peer": true
+ },
+ "node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-package-data/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-package-data/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "peer": true
+ },
+ "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/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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-locate/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==",
+ "peer": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "peer": true,
+ "dependencies": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/path-posix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz",
+ "integrity": "sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA=="
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "peer": true,
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "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": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
+ "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "find-up": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+ "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "locate-path": "^7.1.0",
+ "path-exists": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "p-locate": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/yocto-queue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+ "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.32",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
+ "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+ "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.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-html": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.5.0.tgz",
+ "integrity": "sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "htmlparser2": "^8.0.0",
+ "js-tokens": "^8.0.0",
+ "postcss": "^8.4.0",
+ "postcss-safe-parser": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12 || >=14"
+ }
+ },
+ "node_modules/postcss-html/node_modules/js-tokens": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.2.tgz",
+ "integrity": "sha512-Olnt+V7xYdvGze9YTbGFZIfQXuGV4R3nQwwl8BrtgaPE/wq8UFpUHWuTNc05saowhSr1ZO6tx+V6RjE9D5YQog==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/postcss-media-query-parser": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+ "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-resolve-nested-selector": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
+ "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/postcss-safe-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
+ }
+ },
+ "node_modules/postcss-scss": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz",
+ "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-scss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.29"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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/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==",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz",
+ "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==",
+ "peer": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "peer": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/public-encrypt/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "peer": true
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pure-rand": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz",
+ "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/qs": {
+ "version": "6.11.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
+ "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
+ "peer": true,
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "peer": true,
+ "dependencies": {
+ "randombytes": "^2.0.5",
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/read-pkg": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
+ "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^3.0.2",
+ "parse-json": "^5.2.0",
+ "type-fest": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
+ "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "find-up": "^5.0.0",
+ "read-pkg": "^6.0.0",
+ "type-fest": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.1.tgz",
+ "integrity": "sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw==",
+ "peer": true,
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "devOptional": true,
+ "peer": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+ "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "resolve": "^1.20.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/redent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz",
+ "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "indent-string": "^5.0.0",
+ "strip-indent": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "peer": true
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/rehype-external-links": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz",
+ "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==",
+ "peer": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "is-absolute-url": "^4.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-react": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-7.2.0.tgz",
+ "integrity": "sha512-MHYyCHka+3TtzBMKtcuvVOBAbI1HrfoYA+XH9m7/rlrQQATCPwtJnPdkxKKcIGF8vc9mxqQja9r9f+FHItQeWg==",
+ "peer": true,
+ "dependencies": {
+ "@mapbox/hast-util-table-cell-style": "^0.2.0",
+ "@types/hast": "^2.0.0",
+ "hast-to-hyperscript": "^10.0.0",
+ "hast-util-whitespace": "^2.0.0",
+ "unified": "^10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=17"
+ }
+ },
+ "node_modules/rehype-react/node_modules/@types/hast": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz",
+ "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^2"
+ }
+ },
+ "node_modules/rehype-react/node_modules/@types/unist": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
+ "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==",
+ "peer": true
+ },
+ "node_modules/rehype-react/node_modules/is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rehype-react/node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/rehype-react/node_modules/unified": {
+ "version": "10.1.2",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
+ "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "bail": "^2.0.0",
+ "extend": "^3.0.0",
+ "is-buffer": "^2.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-react/node_modules/unist-util-stringify-position": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
+ "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-react/node_modules/vfile": {
+ "version": "5.3.7",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
+ "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "is-buffer": "^2.0.0",
+ "unist-util-stringify-position": "^3.0.0",
+ "vfile-message": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-react/node_modules/vfile-message": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
+ "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "unist-util-stringify-position": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-breaks": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz",
+ "integrity": "sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-newline-to-break": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "peer": true,
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz",
+ "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==",
+ "peer": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.5"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
+ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "peer": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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/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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/sass": {
+ "version": "1.69.5",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz",
+ "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==",
+ "dev": true,
+ "peer": true,
+ "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": "13.3.2",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz",
+ "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 14.15.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 || ^8.0.0 || ^9.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/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==",
+ "dev": true,
+ "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/schema-utils/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "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/schema-utils/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==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/schema-utils/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==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/selfsigned": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
+ "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node-forge": "^1.3.0",
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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-length": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
+ "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "peer": true,
+ "dependencies": {
+ "define-data-property": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+ "peer": true
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/shiki": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz",
+ "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==",
+ "peer": true,
+ "dependencies": {
+ "ansi-sequence-parser": "^1.1.0",
+ "jsonc-parser": "^3.2.0",
+ "vscode-oniguruma": "^1.7.0",
+ "vscode-textmate": "^8.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "peer": true
+ },
+ "node_modules/slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/slice-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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/slice-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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/sockjs/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==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "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/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-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "peer": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+ "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
+ "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/splitpanes": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-2.4.1.tgz",
+ "integrity": "sha512-kpEo1WuMXuc6QfdQdO2V/fl/trONlkUKp+pputsLTiW9RMtwEvjb4/aYGm2m3+KAzjmb+zLwr4A4SYZu74+pgQ==",
+ "peer": true
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/stream-browserify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
+ "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "~2.0.4",
+ "readable-stream": "^3.5.0"
+ }
+ },
+ "node_modules/stream-browserify/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==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/stream-http": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
+ "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
+ "peer": true,
+ "dependencies": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "xtend": "^4.0.2"
+ }
+ },
+ "node_modules/stream-http/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==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "char-regex": "^2.0.0",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-length/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==",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/string-length/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==",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "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.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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
+ "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "min-indent": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/striptags": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz",
+ "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==",
+ "peer": true
+ },
+ "node_modules/strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/style-search": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+ "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/style-to-object": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz",
+ "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==",
+ "peer": true,
+ "dependencies": {
+ "inline-style-parser": "0.1.1"
+ }
+ },
+ "node_modules/stylelint": {
+ "version": "15.11.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz",
+ "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^2.3.1",
+ "@csstools/css-tokenizer": "^2.2.0",
+ "@csstools/media-query-list-parser": "^2.1.4",
+ "@csstools/selector-specificity": "^3.0.0",
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.3",
+ "cosmiconfig": "^8.2.0",
+ "css-functions-list": "^3.2.1",
+ "css-tree": "^2.3.1",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.1",
+ "fastest-levenshtein": "^1.0.16",
+ "file-entry-cache": "^7.0.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.1.0",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.3.1",
+ "ignore": "^5.2.4",
+ "import-lazy": "^4.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.29.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^10.1.5",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.28",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.13",
+ "postcss-value-parser": "^4.2.0",
+ "resolve-from": "^5.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "style-search": "^0.1.0",
+ "supports-hyperlinks": "^3.0.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.8.1",
+ "write-file-atomic": "^5.0.1"
+ },
+ "bin": {
+ "stylelint": "bin/stylelint.mjs"
+ },
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ }
+ },
+ "node_modules/stylelint-config-html": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-html/-/stylelint-config-html-1.1.0.tgz",
+ "integrity": "sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12 || >=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "postcss-html": "^1.0.0",
+ "stylelint": ">=14.0.0"
+ }
+ },
+ "node_modules/stylelint-config-recommended": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-12.0.0.tgz",
+ "integrity": "sha512-x6x8QNARrGO2sG6iURkzqL+Dp+4bJorPMMRNPScdvaUK8PsynriOcMW7AFDKqkWAS5wbue/u8fUT/4ynzcmqdQ==",
+ "dev": true,
+ "peer": true,
+ "peerDependencies": {
+ "stylelint": "^15.5.0"
+ }
+ },
+ "node_modules/stylelint-config-recommended-scss": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-12.0.0.tgz",
+ "integrity": "sha512-5Bb2mlGy6WLa30oNeKpZvavv2lowJUsUJO25+OA68GFTemlwd1zbFsL7q0bReKipOSU3sG47hKneZ6Nd+ctrFA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "postcss-scss": "^4.0.6",
+ "stylelint-config-recommended": "^12.0.0",
+ "stylelint-scss": "^5.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3",
+ "stylelint": "^15.5.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/stylelint-config-recommended-vue": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.5.0.tgz",
+ "integrity": "sha512-65TAK/clUqkNtkZLcuytoxU0URQYlml+30Nhop7sRkCZ/mtWdXt7T+spPSB3KMKlb+82aEVJ4OrcstyDBdbosg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "semver": "^7.3.5",
+ "stylelint-config-html": ">=1.0.0",
+ "stylelint-config-recommended": ">=6.0.0"
+ },
+ "engines": {
+ "node": "^12 || >=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ota-meshi"
+ },
+ "peerDependencies": {
+ "postcss-html": "^1.0.0",
+ "stylelint": ">=14.0.0"
+ }
+ },
+ "node_modules/stylelint-config-recommended-vue/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stylelint-config-recommended-vue/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stylelint-config-recommended-vue/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/stylelint-scss": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.3.2.tgz",
+ "integrity": "sha512-4LzLaayFhFyneJwLo0IUa8knuIvj+zF0vBFueQs4e3tEaAMIQX8q5th8ziKkgOavr6y/y9yoBe+RXN/edwLzsQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "known-css-properties": "^0.29.0",
+ "postcss-media-query-parser": "^0.2.3",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-selector-parser": "^6.0.13",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "peerDependencies": {
+ "stylelint": "^14.5.1 || ^15.0.0"
+ }
+ },
+ "node_modules/stylelint/node_modules/balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/stylelint/node_modules/file-entry-cache": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz",
+ "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "flat-cache": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/stylelint/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/stylelint/node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz",
+ "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.18"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+ "peer": true
+ },
+ "node_modules/table": {
+ "version": "6.8.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
+ "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "peer": true,
+ "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/table/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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz",
+ "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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-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==",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/terser-webpack-plugin/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==",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/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==",
+ "peer": true,
+ "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/terser-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==",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/terser/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==",
+ "peer": true
+ },
+ "node_modules/terser/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==",
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/timers-browserify": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+ "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+ "peer": true,
+ "dependencies": {
+ "setimmediate": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/toastify-js": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz",
+ "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ=="
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tributejs": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/tributejs/-/tributejs-5.1.3.tgz",
+ "integrity": "sha512-B5CXihaVzXw+1UHhNFyAwUTMDk1EfoLP5Tj1VhD9yybZ1I8DZJEv8tZ1l0RJo0t0tk9ZhR8eG5tEsaCvRigmdQ==",
+ "peer": true
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "peer": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trim-newlines": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz",
+ "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz",
+ "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==",
+ "peer": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
+ "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/ts-loader": {
+ "version": "9.5.1",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz",
+ "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "enhanced-resolve": "^5.0.0",
+ "micromatch": "^4.0.0",
+ "semver": "^7.3.4",
+ "source-map": "^0.7.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "typescript": "*",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/ts-loader/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/ts-loader/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "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/ts-loader/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/ts-loader/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==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/ts-loader/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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ts-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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ts-loader/node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/ts-loader/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-loader/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tty-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/typescript": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
+ "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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/underscore": {
+ "version": "1.13.6",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unified": {
+ "version": "11.0.4",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz",
+ "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unified/node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unist-builder": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz",
+ "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "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": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz",
+ "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==",
+ "peer": true,
+ "dependencies": {
+ "punycode": "^1.4.1",
+ "qs": "^6.11.2"
+ }
+ },
+ "node_modules/url-join": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz",
+ "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.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/url/node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "peer": true
+ },
+ "node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "peer": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz",
+ "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz",
+ "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "peer": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+ "peer": true
+ },
+ "node_modules/vscode-oniguruma": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
+ "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
+ "peer": true
+ },
+ "node_modules/vscode-textmate": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz",
+ "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==",
+ "peer": true
+ },
+ "node_modules/vue": {
+ "version": "2.7.15",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.15.tgz",
+ "integrity": "sha512-a29fsXd2G0KMRqIFTpRgpSbWaNBK3lpCTOLuGLEDnlHWdjB8fwl6zyYZ8xCrqkJdatwZb4mGHiEfJjnw0Q6AwQ==",
+ "dependencies": {
+ "@vue/compiler-sfc": "2.7.15",
+ "csstype": "^3.1.0"
+ }
+ },
+ "node_modules/vue-color": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/vue-color/-/vue-color-2.8.1.tgz",
+ "integrity": "sha512-BoLCEHisXi2QgwlhZBg9UepvzZZmi4176vbr+31Shen5WWZwSLVgdScEPcB+yrAtuHAz42309C0A4+WiL9lNBw==",
+ "peer": true,
+ "dependencies": {
+ "clamp": "^1.0.1",
+ "lodash.throttle": "^4.0.0",
+ "material-colors": "^1.0.0",
+ "tinycolor2": "^1.1.2"
+ }
+ },
+ "node_modules/vue-eslint-parser": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
+ "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.6"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/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==",
+ "dev": true,
+ "peer": true,
+ "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/vue-eslint-parser/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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/vue-eslint-parser/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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/vue-frag": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/vue-frag/-/vue-frag-1.4.3.tgz",
+ "integrity": "sha512-pQZj03f/j9LRhzz9vKaXTCXUHVYHuAXicshFv76VFqwz4MG3bcb+sPZMAbd0wmw7THjkrTPuoM0EG9TbG8CgMQ==",
+ "funding": {
+ "url": "https://github.com/privatenumber/vue-frag?sponsor=1"
+ },
+ "peerDependencies": {
+ "vue": "^2.6.0"
+ }
+ },
+ "node_modules/vue-hot-reload-api": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
+ "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/vue-loader": {
+ "version": "15.11.1",
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz",
+ "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@vue/component-compiler-utils": "^3.1.0",
+ "hash-sum": "^1.0.2",
+ "loader-utils": "^1.1.0",
+ "vue-hot-reload-api": "^2.3.0",
+ "vue-style-loader": "^4.1.0"
+ },
+ "peerDependencies": {
+ "css-loader": "*",
+ "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "cache-loader": {
+ "optional": true
+ },
+ "prettier": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-resize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz",
+ "integrity": "sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.13.10"
+ },
+ "peerDependencies": {
+ "vue": "^2.6.0"
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz",
+ "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ=="
+ },
+ "node_modules/vue-style-loader": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
+ "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "hash-sum": "^1.0.2",
+ "loader-utils": "^1.0.2"
+ }
+ },
+ "node_modules/vue-template-compiler": {
+ "version": "2.7.15",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz",
+ "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "de-indent": "^1.0.2",
+ "he": "^1.2.0"
+ }
+ },
+ "node_modules/vue-template-es2015-compiler": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
+ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/vue2-datepicker": {
+ "version": "3.11.1",
+ "resolved": "https://registry.npmjs.org/vue2-datepicker/-/vue2-datepicker-3.11.1.tgz",
+ "integrity": "sha512-6PU/+pnp2mgZAfnSXmbdwj9516XsEvTiw61Q5SNrvvdy8W/FCxk1GAe9UZn/m9YfS5A47yK6XkcjMHbp7aFApA==",
+ "peer": true,
+ "dependencies": {
+ "date-format-parse": "^0.2.7"
+ },
+ "peerDependencies": {
+ "vue": "^2.5.0"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "peer": true,
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/web-namespaces": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
+ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
+ "peer": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/web-streams-polyfill": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
+ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
+ "optional": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/webdav": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/webdav/-/webdav-5.3.1.tgz",
+ "integrity": "sha512-wzZdTHtMuSIXqHGBznc8FM2L94Mc/17Tbn9ppoMybRO0bjWOSIeScdVXWX5qqHsg00EjfiOcwMqGFx6ghIhccQ==",
+ "dependencies": {
+ "@buttercup/fetch": "^0.1.1",
+ "base-64": "^1.0.0",
+ "byte-length": "^1.0.2",
+ "fast-xml-parser": "^4.2.4",
+ "he": "^1.2.0",
+ "hot-patcher": "^2.0.0",
+ "layerr": "^2.0.1",
+ "md5": "^2.3.0",
+ "minimatch": "^7.4.6",
+ "nested-property": "^4.0.0",
+ "path-posix": "^1.0.0",
+ "url-join": "^5.0.0",
+ "url-parse": "^1.5.10"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/webdav/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/webdav/node_modules/minimatch": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz",
+ "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.89.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
+ "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
+ "peer": true,
+ "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-cli": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
+ "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@discoveryjs/json-ext": "^0.5.0",
+ "@webpack-cli/configtest": "^2.1.1",
+ "@webpack-cli/info": "^2.0.2",
+ "@webpack-cli/serve": "^2.0.5",
+ "colorette": "^2.0.14",
+ "commander": "^10.0.1",
+ "cross-spawn": "^7.0.3",
+ "envinfo": "^7.7.3",
+ "fastest-levenshtein": "^1.0.12",
+ "import-local": "^3.0.2",
+ "interpret": "^3.1.1",
+ "rechoir": "^0.8.0",
+ "webpack-merge": "^5.7.3"
+ },
+ "bin": {
+ "webpack-cli": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@webpack-cli/generators": {
+ "optional": true
+ },
+ "webpack-bundle-analyzer": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
+ "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
+ "dev": true,
+ "peer": true,
+ "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-server": {
+ "version": "4.15.1",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz",
+ "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==",
+ "dev": true,
+ "peer": true,
+ "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-merge": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+ "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.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==",
+ "peer": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/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==",
+ "peer": true,
+ "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/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "peer": true,
+ "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==",
+ "dev": true,
+ "peer": true,
+ "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-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
+ "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
+ "peer": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.4",
+ "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/wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true,
+ "peer": true
+ },
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "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==",
+ "peer": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "peer": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.15.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz",
+ "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==",
+ "dev": true,
+ "peer": true,
+ "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/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "peer": true,
+ "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==",
+ "peer": true,
+ "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==",
+ "peer": true
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "peer": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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==",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100755
index 0000000..9814baa
--- /dev/null
+++ b/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "dicomviewer",
+ "version": "2.0.0",
+ "description": "Place this app in **nextcloud/apps/**",
+ "scripts": {
+ "prebuild": "rm -rf js && npm run build:viewer",
+ "build:viewer": "cd acanio-viewer && yarn install && yarn build:nextcloud",
+ "build": "webpack --node-env production --progress",
+ "dev": "webpack --node-env development --progress",
+ "watch": "webpack --node-env development --progress --watch",
+ "lint": "eslint --ext .js,.vue src",
+ "lint:fix": "eslint --ext .js,.vue src --fix",
+ "stylelint": "stylelint src css",
+ "stylelint:fix": "stylelint src css --fix"
+ },
+ "author": "Aysel Afsar",
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "@nextcloud/auth": "^2.2.1",
+ "@nextcloud/axios": "^2.4.0",
+ "@nextcloud/dialogs": "^5.0.3",
+ "@nextcloud/logger": "^2.7.0",
+ "@nextcloud/router": "^2.2.0",
+ "cornerstone-core": "^2.2.8",
+ "cornerstone-math": "^0.1.7",
+ "cornerstone-tools": "^2.4.0",
+ "cornerstone-wado-image-loader": "^2.2.3",
+ "dicom-parser": "^1.8.3",
+ "hammerjs": "^2.0.8",
+ "underscore": "^1.13.1"
+ },
+ "browserslist": [
+ "extends @nextcloud/browserslist-config"
+ ],
+ "engines": {
+ "node": "^16.0.0",
+ "npm": "^7.0.0 || ^8.0.0"
+ },
+ "devDependencies": {
+ "@nextcloud/babel-config": "^1.0.0",
+ "@nextcloud/browserslist-config": "^3.0.0",
+ "@nextcloud/eslint-config": "^8.3.0",
+ "@nextcloud/stylelint-config": "^2.3.1",
+ "@nextcloud/webpack-vue-config": "^6.0.0",
+ "adm-zip": "^0.5.10",
+ "axios": "^1.6.2",
+ "cli-progress": "^3.12.0",
+ "copy-webpack-plugin": "^11.0.0"
+ }
+}
diff --git a/screenshots/dump1-small.png b/screenshots/dump1-small.png
index 1ed743c..c090bd1 100644
Binary files a/screenshots/dump1-small.png and b/screenshots/dump1-small.png differ
diff --git a/screenshots/dump1.png b/screenshots/dump1.png
index 4fcf77f..3e78761 100644
Binary files a/screenshots/dump1.png and b/screenshots/dump1.png differ
diff --git a/screenshots/dump2-small.png b/screenshots/dump2-small.png
index 867cf84..f7a9fb2 100644
Binary files a/screenshots/dump2-small.png and b/screenshots/dump2-small.png differ
diff --git a/screenshots/dump2.png b/screenshots/dump2.png
index 61faac3..45a39aa 100644
Binary files a/screenshots/dump2.png and b/screenshots/dump2.png differ
diff --git a/screenshots/open-dicom-file.png b/screenshots/open-dicom-file.png
deleted file mode 100644
index 6322344..0000000
Binary files a/screenshots/open-dicom-file.png and /dev/null differ
diff --git a/screenshots/open-dicom-folder.png b/screenshots/open-dicom-folder.png
deleted file mode 100644
index 3d14017..0000000
Binary files a/screenshots/open-dicom-folder.png and /dev/null differ
diff --git a/screenshots/viewer1-small.png b/screenshots/viewer1-small.png
index 2f47fcd..965a49d 100644
Binary files a/screenshots/viewer1-small.png and b/screenshots/viewer1-small.png differ
diff --git a/screenshots/viewer1.png b/screenshots/viewer1.png
index fe8517b..e394167 100644
Binary files a/screenshots/viewer1.png and b/screenshots/viewer1.png differ
diff --git a/screenshots/viewer2-small.png b/screenshots/viewer2-small.png
index cdb2ed1..e46b97a 100644
Binary files a/screenshots/viewer2-small.png and b/screenshots/viewer2-small.png differ
diff --git a/screenshots/viewer2.png b/screenshots/viewer2.png
index 32c3687..2a6bf7a 100644
Binary files a/screenshots/viewer2.png and b/screenshots/viewer2.png differ
diff --git a/screenshots/viewer3-small.png b/screenshots/viewer3-small.png
index a98799a..00830ae 100644
Binary files a/screenshots/viewer3-small.png and b/screenshots/viewer3-small.png differ
diff --git a/screenshots/viewer3.png b/screenshots/viewer3.png
index 8b807e7..3f403e6 100644
Binary files a/screenshots/viewer3.png and b/screenshots/viewer3.png differ
diff --git a/screenshots/viewer4-small.png b/screenshots/viewer4-small.png
index 4b504c0..bc8fbc7 100644
Binary files a/screenshots/viewer4-small.png and b/screenshots/viewer4-small.png differ
diff --git a/screenshots/viewer4.png b/screenshots/viewer4.png
index 95bb499..7ee52a6 100644
Binary files a/screenshots/viewer4.png and b/screenshots/viewer4.png differ
diff --git a/src/.babelrc b/src/.babelrc
deleted file mode 100644
index b0495f7..0000000
--- a/src/.babelrc
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "presets": [
- [
- "es2015",
- {
- "modules": false
- }
- ]
- ],
- "ignore": [
- "external/cornerstoneWADO/cornerstoneWADOImageLoaderCodecs.js",
- "external/cornerstoneWADO/cornerstoneWADOImageLoaderWebWorker.js"
- ]
-}
diff --git a/src/.eslintignore b/src/.eslintignore
deleted file mode 100644
index eaf72f4..0000000
--- a/src/.eslintignore
+++ /dev/null
@@ -1,4 +0,0 @@
-external/*
-public/*
-dist/*
-node_modules/*
\ No newline at end of file
diff --git a/src/.eslintrc.js b/src/.eslintrc.js
deleted file mode 100644
index d175edd..0000000
--- a/src/.eslintrc.js
+++ /dev/null
@@ -1,36 +0,0 @@
-module.exports = {
- "extends": "airbnb-base",
- "rules": {
- "indent": ["error", 4],
- "comma-dangle": 0,
- "no-underscore-dangle": 0,
- "no-param-reassign": 0,
- "no-continue": 0,
- "no-console": 0,
- "class-methods-use-this": 0,
- "no-control-regex": 0,
- "valid-typeof": 0,
- "no-prototype-builtins": 0,
- "no-restricted-globals": 0,
- "import/prefer-default-export": 0,
- "consistent-return": 0,
- "no-plusplus": 0,
- "no-bitwise": 0,
- "func-names": 0,
- "max-len": [2, 200, 4],
- "prefer-destructuring": ["error", {"array": false, "object": true}]
- },
- "globals": {
- "t": true,
- "n": true,
- "OC": true,
- "OCA": true,
- "Files": true,
- "FileList": true,
- "XMLHttpRequest": true,
- "window": true,
- "navigator": true,
- "document": true,
- "history": true
- }
-};
\ No newline at end of file
diff --git a/src/components/dicomViewer/classes/DicomViewer.js b/src/components/dicomViewer/classes/DicomViewer.js
deleted file mode 100644
index 13dec73..0000000
--- a/src/components/dicomViewer/classes/DicomViewer.js
+++ /dev/null
@@ -1,189 +0,0 @@
-import $ from 'jquery';
-import { DCMViewer } from '../../../lib/viewerMain';
-import initializeViewerMain from '../initializeViewerMain';
-import configureCodecs from '../configureCodecs';
-import ImageLoader from './ImageLoader';
-import { DCMViewerError } from '../../../lib/DCMViewerError';
-import AppDicomViewer from '../../templates/AppDicomViewer.html';
-
-// Min device width to close series panel by default
-const MIN_DEVICE_WIDTH = 992;
-
-class DicomViewer {
- constructor() {
- this.mimeType = 'application/dicom';
- this.isViewerMainShown = false;
-
- configureCodecs();
- }
-
- /**
- * Initialize DICOMViewerPlugin actions
- * @param fileList
- */
- attach(fileList) {
- this._registerFileActions(fileList.fileActions);
- }
-
- /**
- * Hide viewer
- */
- hide() {
- // Destroy the active image loader
- if (this.activeImageLoader) {
- this.activeImageLoader.destroy();
- this.activeImageLoader = null;
- }
-
- $('#AppDicomViewer').remove();
- $('#app-content-files').css({ display: 'block' });
-
- // Show footer on public template
- if ($('#isPublic').val()) {
- $('#content').removeClass('full-height');
- $('footer').removeClass('hidden');
- $('#app-content').removeClass('hidden');
- }
-
- this.isViewerMainShown = false;
-
- if (history && history.replaceState) {
- const stateData = {
- dir: FileList.getCurrentDirectory()
- };
- history.replaceState(stateData, '', '#');
- }
-
- FileList.setViewerMode(false);
- }
-
- /**
- * Show viewer
- * @param imageLoadPromise
- * @param seriesPanelOpen
- */
- show(imageLoadPromise, seriesPanelOpen = true) {
- // Hide footer on public template
- if ($('#isPublic').val()) {
- $('#content').addClass('full-height');
- $('footer').addClass('hidden');
- $('#app-content').addClass('hidden');
- }
-
- $('#app-content-files').css({ display: 'none' });
-
- // Close series panel on small screens
- const bodyWidth = $('body').width();
- const isSmallScreen = parseInt(bodyWidth, 10) < MIN_DEVICE_WIDTH;
- if (isSmallScreen && seriesPanelOpen) {
- seriesPanelOpen = false;
- }
-
- const $appContent = $('#content');
- $appContent.append(AppDicomViewer({ seriesPanelOpen }));
-
- // Go back on ESC
- $(document).keyup((e) => {
- if (this.isViewerMainShown && e.keyCode === 27) {
- this.hide();
- }
- });
-
- if (history && history.pushState) {
- history.pushState({}, '', '#dcmviewer');
-
- $(window).one('popstate', () => {
- this.hide();
- });
- }
-
- FileList.setViewerMode(true);
-
- this.isViewerMainShown = true;
-
- // Close viewer
- DCMViewer.ui.closeViewer = this.hide;
-
- imageLoadPromise.then((viewerData) => {
- initializeViewerMain(viewerData);
- }).catch(() => new DCMViewerError('Failed to load images'));
- }
-
- /**
- * Register file actions for dicom files
- * @param fileActions
- * @private
- */
- _registerFileActions(fileActions) {
- const self = this;
-
- // Register file actions for folders containing dicom files
- fileActions.registerAction({
- name: 'viewDicomFolder',
- displayName: t('dicomviewer', 'Open with DICOM Viewer'),
- mime: 'httpd/unix-directory',
- permissions: OC.PERMISSION_READ,
- order: -10000,
- templateName: 'AppDicomViewer',
- iconClass: 'icon-dicomviewer-dark',
- actionHandler: (fileName, context) => {
- // Destroy the active image loader if exists
- if (self.activeImageLoader) {
- self.activeImageLoader.destroy();
- }
-
- self.activeImageLoader = new ImageLoader(context, fileName, self.mimeType, self.hide);
-
- const imageLoadPromise = self.activeImageLoader.loadMultipleDICOMInstances();
- self.show(imageLoadPromise);
- }
- });
-
- // Register file actions for single dicom files
- fileActions.registerAction({
- name: 'viewDicomFile',
- displayName: t('dicomviewer', 'Open with DICOM Viewer'),
- mime: this.mimeType,
- permissions: OC.PERMISSION_READ,
- order: -10000,
- templateName: 'AppDicomViewer',
- iconClass: 'icon-dicomviewer-dark',
- actionHandler: (fileName, context) => {
- // Destroy the active image loader if exists
- if (self.activeImageLoader) {
- self.activeImageLoader.destroy();
- }
-
- self.activeImageLoader = new ImageLoader(context, fileName, self.mimeType, self.hide);
-
- const imageLoadPromise = self.activeImageLoader.loadSingleDICOMInstance();
- self.show(imageLoadPromise, false);
- }
- });
- fileActions.registerAction({
- name: 'viewAllDicomFiles',
- displayName: t('dicomviewer', 'Open All with DICOM Viewer'),
- mime: this.mimeType,
- permissions: OC.PERMISSION_READ,
- order: -10000,
- templateName: 'AppDicomViewer',
- iconClass: 'icon-dicomviewer-dark',
- actionHandler: (fileName, context) => {
- // Destroy the active image loader if exists
- if (self.activeImageLoader) {
- self.activeImageLoader.destroy();
- }
-
- self.activeImageLoader = new ImageLoader(context, '', self.mimeType, self.hide);
-
- const imageLoadPromise = self.activeImageLoader.loadMultipleDICOMInstances({ jumpToFileName: fileName });
- self.show(imageLoadPromise);
- }
- });
-
- // TODO: Add default action viewDicomFile or viewAllDicomFiles based on user settings
- fileActions.setDefault(self.mimeType, 'viewAllDicomFiles');
- }
-}
-
-export default DicomViewer;
diff --git a/src/components/dicomViewer/classes/ImageLoader.js b/src/components/dicomViewer/classes/ImageLoader.js
deleted file mode 100644
index 030ed9d..0000000
--- a/src/components/dicomViewer/classes/ImageLoader.js
+++ /dev/null
@@ -1,367 +0,0 @@
-import $ from 'jquery';
-import { cornerstone, cornerstoneWADOImageLoader } from '../../../lib/cornerstonejs';
-import generateFullUrl from '../../../lib/generateFullUrl';
-import createMetadata from '../lib/createMetadata';
-
-const STUDY_INSTANCE_UID = 'x0020000d';
-const SERIES_INSTANCE_UID = 'x0020000e';
-const SOP_INSTANCE_UID = 'x00080018';
-
-class ImageLoader {
- constructor(context, fileName, mimeType, hide) {
- this.context = context;
- this.fileName = fileName;
- this.mimeType = mimeType;
- this.hide = hide;
- this.destroyed = false;
- }
-
- destroy() {
- this.destroyed = true;
-
- // Stop listening to update loading progress
- cornerstone.events.removeEventListener('cornerstoneimageloadprogress', this.imageLoadProgressHandler);
- }
-
- handleError(error) {
- // Skip if it is canceled/destroyed
- if (!error) {
- return;
- }
-
- console.error('Failed to load image', error);
- }
-
- /**
- * Update loading percentage of single DICOM instance
- * @param event
- */
- imageLoadProgressHandler(event) {
- // Update load progress
- const eventData = event.detail;
- const $loadingPercentage = $('#loadingPercentage');
- $loadingPercentage.text(eventData.percentComplete);
- }
-
- /**
- * Show warning if there is no available dicom file
- */
- noAvailableDicomFileWarning() {
- const self = this;
-
- setTimeout(() => {
- const $loadingViewerMain = $('.loadingViewerMain');
-
- // Clear previous text
- $loadingViewerMain.text('');
-
- // Create Close button to hide loading view
- const icon = document.createElement('i');
- icon.className = 'fa fa-times fa-lg';
-
- const link = document.createElement('a');
- link.className = 'button-close js-close-viewer';
-
- $(link).append(icon);
- $loadingViewerMain.append(link);
- $(link).click(() => {
- self.hide();
- });
-
- const content = '' +
- `${t('dicomviewer', 'There is no available DICOM image to display')}` +
- '
';
- $loadingViewerMain.append(content);
- }, 500);
- }
-
- /**
- * Load single DICOM instance
- */
- loadSingleDICOMInstance() {
- const self = this;
- const { context, fileName } = this;
- const fileDownloadUrl = context.fileList.getDownloadUrl(fileName, context.dir);
- if (!fileDownloadUrl || fileDownloadUrl === '#') {
- return;
- }
-
- // Listen to update loading progress
- cornerstone.events.addEventListener('cornerstoneimageloadprogress', this.imageLoadProgressHandler);
-
- return new Promise((resolve, reject) => {
- const { dataSetCacheManager } = cornerstoneWADOImageLoader.wadouri;
- const viewerData = {
- studies: []
- };
-
- const fullUrl = generateFullUrl(fileDownloadUrl);
- const wadouri = `wadouri:${fullUrl}`;
-
- const isLoaded = dataSetCacheManager.isLoaded(fullUrl);
- if (isLoaded) {
- const dataSet = dataSetCacheManager.get(fullUrl);
- createMetadata(wadouri, dataSet, viewerData.studies);
- resolve(viewerData);
- } else {
- const dataSetPromise = dataSetCacheManager.load(fullUrl);
- dataSetPromise.then((dataSet) => {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- reject();
- return;
- }
-
- createMetadata(wadouri, dataSet, viewerData.studies);
- resolve(viewerData);
- }).catch(self.handleError);
- }
- });
- }
-
- /**
- * Get all files and folders in the given folder path
- * @param folderPath
- */
- async getFolderContents(folderPath) {
- const self = this;
- const { context } = this;
-
- return new Promise((resolve, reject) => {
- const filePromise = context.fileList.filesClient.getFolderContents(folderPath);
- filePromise.then((status, files) => {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- reject();
- return;
- }
-
- resolve(files);
- });
- });
- }
-
- /**
- * Get all DICOM files in all levels of the folder in parallel
- * @param files
- */
- getAllDicomFiles(files) {
- const self = this;
- const noExtension = 'application/octet-stream';
-
- return new Promise((resolve, reject) => {
- let allDicomFiles = files.filter(file => file.mimetype === self.mimeType || file.mimetype === noExtension);
-
- const folderMimeType = 'httpd/unix-directory';
- const folders = files.filter(file => file.mimetype === folderMimeType);
-
- const filePromises = [];
-
- for (let i = 0; i < folders.length; i++) {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- reject();
- return;
- }
-
- const folder = folders[i];
- const folderPath = `${folder.path}/${folder.name}`;
-
- const filePromise = new Promise((fileResolve, fileReject) => {
- const folderPromise = self.getFolderContents(folderPath);
- folderPromise.then((subFiles) => {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- fileReject();
- return;
- }
-
- const subDicomFilesPromise = self.getAllDicomFiles(subFiles);
- subDicomFilesPromise.then((subDicomFiles) => {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- fileReject();
- return;
- }
-
- fileResolve(subDicomFiles);
- }).catch(self.handleError);
- }).catch(self.handleError);
- });
- filePromises.push(filePromise);
- }
-
- if (filePromises.length < 1) {
- resolve(allDicomFiles);
- } else {
- // Wait for all files to read in parallel
- Promise.all(filePromises).then((subDicomFiles) => {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- reject();
- return;
- }
-
- allDicomFiles = allDicomFiles.concat(...subDicomFiles);
- resolve(allDicomFiles);
- }).catch(self.handleError);
- }
- });
- }
-
- /**
- * Read all DICOM files and wait for all to be read
- */
- async readAllDicomFiles() {
- const folderPath = `${this.context.dir}/${this.fileName}`;
- const files = await this.getFolderContents(folderPath);
- const allDicomFiles = await this.getAllDicomFiles(files);
- return allDicomFiles;
- }
-
- /**
- * Load multiple instances
- */
- loadMultipleDICOMInstances(options) {
- const { context } = this;
- const self = this;
-
- return new Promise((resolve, reject) => {
- this.readAllDicomFiles().then((allDicomFiles) => {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- reject();
- return;
- }
-
- // Warn if no DICOM file is available
- if (!allDicomFiles || !allDicomFiles.length) {
- self.noAvailableDicomFileWarning();
- return;
- }
-
- const allImagePromises = [];
- const imagesData = [];
- let loadedImageCount = 0;
-
- const updateLoadingPercentage = () => {
- loadedImageCount += 1;
- const percentage = Math.floor((loadedImageCount / allDicomFiles.length) * 100);
- const $loadingPercentage = $('#loadingPercentage');
- $loadingPercentage.text(percentage);
- };
-
- for (let i = 0; i < allDicomFiles.length; i++) {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- reject();
- return;
- }
-
- const file = allDicomFiles[i];
- const fileUrl = context.fileList.getDownloadUrl(file.name, file.path);
- const fullUrl = generateFullUrl(fileUrl);
- const wadouri = `wadouri:${fullUrl}`;
- const isFileToJump = options && options.jumpToFileName === file.name;
-
- const { dataSetCacheManager } = cornerstoneWADOImageLoader.wadouri;
- const isLoaded = dataSetCacheManager.isLoaded(fullUrl);
-
- if (isLoaded) {
- const dataSet = dataSetCacheManager.get(fullUrl);
-
- const imageData = {
- dataSet,
- wadouri,
- };
-
- if (isFileToJump) {
- imageData.imageToJump = {
- studyInstanceUid: dataSet.string(STUDY_INSTANCE_UID),
- seriesInstanceUid: dataSet.string(SERIES_INSTANCE_UID),
- sopInstanceUid: dataSet.string(SOP_INSTANCE_UID)
- };
- }
-
- imagesData.push(imageData);
-
- updateLoadingPercentage();
-
- // Resolve immediately because it is in cache
- allImagePromises.push(Promise.resolve());
- } else {
- const imagePromise = new Promise((imageResolve, imageReject) => {
- const dataSetPromise = dataSetCacheManager.load(fullUrl);
- dataSetPromise.then((dataSet) => {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- imageReject();
- return;
- }
-
- const imageData = {
- dataSet,
- wadouri,
- };
-
- if (isFileToJump) {
- imageData.imageToJump = {
- studyInstanceUid: dataSet.string(STUDY_INSTANCE_UID),
- seriesInstanceUid: dataSet.string(SERIES_INSTANCE_UID),
- sopInstanceUid: dataSet.string(SOP_INSTANCE_UID)
- };
- }
-
- imagesData.push(imageData);
-
- updateLoadingPercentage();
-
- imageResolve();
- }).catch(() => imageReject());
- });
-
- // Resolve when image is loaded
- allImagePromises.push(imagePromise);
- }
- }
-
- // Handle when all images are loaded
- Promise.all(Array.from(allImagePromises.map(p => p.catch(() => null)))).then(() => {
- // Reject if it is canceled/destroyed
- if (self.destroyed) {
- reject();
- return;
- }
-
- // Stop if there is no available image data
- if (!imagesData.length) {
- self.noAvailableDicomFileWarning();
- return;
- }
-
- const viewerData = {
- studies: []
- };
-
- // Create metadata and set into viewerData
- imagesData.forEach((imageData) => {
- if (imageData.imageToJump) {
- viewerData.imageToJump = imageData.imageToJump;
- }
- createMetadata(imageData.wadouri, imageData.dataSet, viewerData.studies);
- });
-
- // Sort series in viewerData
- viewerData.studies.forEach((study) => {
- study.seriesList.sort((a, b) => parseInt(a.seriesNumber, 10) - parseInt(b.seriesNumber, 10));
- });
-
- // Resolve when all images are loaded and ready to display
- resolve(viewerData);
- }).catch(self.handleError);
- }).catch(self.handleError);
- });
- }
-}
-
-export default ImageLoader;
diff --git a/src/components/dicomViewer/index.js b/src/components/dicomViewer/index.js
deleted file mode 100644
index 15c0417..0000000
--- a/src/components/dicomViewer/index.js
+++ /dev/null
@@ -1 +0,0 @@
-import './registerDicomViewer';
diff --git a/src/components/dicomViewer/initializeViewerMain.js b/src/components/dicomViewer/initializeViewerMain.js
deleted file mode 100644
index 6e90c71..0000000
--- a/src/components/dicomViewer/initializeViewerMain.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import $ from 'jquery';
-import { cornerstone } from '../../lib/cornerstonejs';
-import { DCMViewer } from '../../lib/viewerMain/index';
-import { DCMViewerLog } from '../../lib/DCMViewerLog';
-
-export default function initializeViewerMain(viewerData) {
- // Hide loading view
- $('.loadingViewerMain').css({ display: 'none' });
-
- DCMViewer.ui.hasMultipleInstances = false;
-
- // Manage resizing of viewport
- window.ResizeViewportManager = window.ResizeViewportManager || new DCMViewer.viewerbase.ResizeViewportManager();
-
- window.addEventListener('resize', window.ResizeViewportManager.getResizeHandler());
-
- // Reload previous series data
- if (DCMViewer.viewer.data && DCMViewer.viewer.data.loadedSeriesData) {
- DCMViewerLog.info('Reloading previous loadedSeriesData');
- DCMViewer.viewer.loadedSeriesData = DCMViewer.viewer.data.loadedSeriesData;
- } else {
- DCMViewerLog.info('Setting default viewer data');
- DCMViewer.viewer.loadedSeriesData = {};
- DCMViewer.viewer.data = {};
- DCMViewer.viewer.data.loadedSeriesData = DCMViewer.viewer.loadedSeriesData;
-
- // Update the viewer data object
- DCMViewer.viewer.data.viewportColumns = 1;
- DCMViewer.viewer.data.viewportRows = 1;
- DCMViewer.viewer.data.activeViewport = 0;
- DCMViewer.viewer.data.viewportIndex = 0;
- }
-
- // Update Studies
- DCMViewer.viewer.studies = [];
- DCMViewer.viewer.StudyMetadataList = [];
-
- DCMViewer.viewer.data.studyInstanceUids = [];
- viewerData.studies.forEach((study) => {
- const studyMetadata = new DCMViewer.metadata.StudyMetadata(study, study.studyInstanceUid);
- let { displaySets } = study;
-
- if (!study.displaySets) {
- displaySets = DCMViewer.viewerbase.sortingManager.getDisplaySets(studyMetadata);
- study.displaySets = displaySets;
- }
-
- // Sort display sets
- studyMetadata.setDisplaySets(displaySets);
- studyMetadata.sortSeriesByDisplaySets();
-
- study.selected = true;
- DCMViewer.viewer.Studies.push(study);
- DCMViewer.viewer.StudyMetadataList.push(studyMetadata);
- DCMViewer.viewer.data.studyInstanceUids.push(study.studyInstanceUid);
-
- const hasMultipleInstances = study.seriesList.filter(series => series.instances.length > 1);
-
- if (hasMultipleInstances.length && !DCMViewer.ui.hasMultipleInstances) {
- DCMViewer.ui.hasMultipleInstances = true;
- }
- });
-
- DCMViewer.viewerbase.data = viewerData;
-
- DCMViewer.viewer.metadataProvider = new DCMViewer.cornerstone.MetadataProvider();
- const metaDataProvider = DCMViewer.viewer.metadataProvider;
- cornerstone.metaData.addProvider(metaDataProvider.provider.bind(metaDataProvider));
-
- // Render all content
- DCMViewer.ui.renderViewer();
-}
diff --git a/src/components/dicomViewer/lib/createMetadata.js b/src/components/dicomViewer/lib/createMetadata.js
deleted file mode 100644
index 5ba8237..0000000
--- a/src/components/dicomViewer/lib/createMetadata.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Get required metadata of studies, series and instances
- * @param wadouri
- * @param dataSet
- * @param studies
- */
-export default function createMetadata(wadouri, dataSet, studies) {
- const patientName = dataSet.string('x00100010');
- const patientId = dataSet.string('x00100020');
- if (!patientId) {
- return;
- }
-
- const studyInstanceUid = dataSet.string('x0020000d');
- if (!studyInstanceUid) {
- return;
- }
- const studyDate = dataSet.string('x00080020');
- const studyTime = dataSet.string('x00080030');
- const studyDescription = dataSet.string('x00081030');
-
- const seriesInstanceUid = dataSet.string('x0020000e');
- const seriesDescription = dataSet.string('x0008103e');
- const seriesNumber = dataSet.string('x00200011');
- const modality = dataSet.string('x00080060');
-
- const sopInstanceUid = dataSet.string('x00080018');
- const rows = dataSet.uint16('x00280010');
- const instanceNumber = dataSet.string('x00200013');
-
- const targetInstance = {
- sopInstanceUid,
- rows,
- instanceNumber,
- url: wadouri
- };
-
- const targetSeries = {
- seriesInstanceUid,
- seriesDescription,
- seriesNumber,
- modality,
- instances: [targetInstance]
- };
-
- const targetStudy = {
- patientId,
- patientName,
- studyInstanceUid,
- studyDate,
- studyTime,
- studyDescription,
- seriesList: [targetSeries],
- };
-
- const study = studies.find(entry => entry.patientId === patientId && entry.studyInstanceUid === studyInstanceUid);
- if (study) {
- study.seriesList = study.seriesList || [];
- const series = study.seriesList.find(entry => entry.seriesInstanceUid === seriesInstanceUid);
- if (series) {
- series.instances = series.instances || [];
- const instance = series.instances.find(entry => entry.sopInstanceUid === sopInstanceUid);
- if (!instance) {
- series.instances.push(targetInstance);
- }
- } else {
- study.seriesList.push(targetSeries);
- }
- } else {
- studies.push(targetStudy);
- }
-}
diff --git a/src/components/dicomViewer/registerDicomViewer.js b/src/components/dicomViewer/registerDicomViewer.js
deleted file mode 100644
index f153f5f..0000000
--- a/src/components/dicomViewer/registerDicomViewer.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import DicomViewer from './classes/DicomViewer';
-import generateFullUrl from '../../lib/generateFullUrl';
-
-// Add MimeType Icon
-OC.MimeType._mimeTypeIcons['application/dicom'] = `${generateFullUrl(OC.filePath('dicomviewer', 'img', 'app-dark.svg'))}`;
-
-// Register DICOM Viewer
-OC.Plugins.register('OCA.Files.FileList', new DicomViewer());
diff --git a/src/components/helpers/index.js b/src/components/helpers/index.js
deleted file mode 100644
index e907a9b..0000000
--- a/src/components/helpers/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import './logical';
-import './thumbnail';
-import './toolbar';
-import './translation';
-import './viewport';
diff --git a/src/components/helpers/logical.js b/src/components/helpers/logical.js
deleted file mode 100644
index 8cb5a4e..0000000
--- a/src/components/helpers/logical.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/* eslint import/no-extraneous-dependencies:0 */
-
-import Handlebars from 'handlebars';
-import _ from 'underscore';
-
-// Convert any value into a boolean value
-Handlebars.registerHelper('bool', value => !!value);
-
-// Check if two values are identical
-Handlebars.registerHelper('eq', (a, b) => a === b);
-
-// Check if two values are different
-Handlebars.registerHelper('ne', (a, b) => a !== b);
-
-// Check if the first value is greater than the second one
-Handlebars.registerHelper('gt', (a, b) => a > b);
-
-// Check if the first value is lesser than the second one
-Handlebars.registerHelper('lt', (a, b) => a < b);
-
-// Check if the first value is greater than or equals the second one
-Handlebars.registerHelper('gte', (a, b) => a >= b);
-
-// Check if the first value is lesser than or equals the second one
-Handlebars.registerHelper('lte', (a, b) => a <= b);
-
-// Get the boolean negation for the given value
-Handlebars.registerHelper('not', value => !value);
-
-// Check if all the given values are true
-Handlebars.registerHelper('and', (...values) => {
- let result = true;
- _.each(_.initial(values, 1), (value) => {
- if (!value) result = false;
- });
- return result;
-});
-
-// Check if one of the given values is true
-Handlebars.registerHelper('or', (...values) => {
- let result = false;
- _.each(_.initial(values, 1), (value) => {
- if (value) result = true;
- });
- return result;
-});
-
-// Return the second parameter if the first is true or the third if it's false
-Handlebars.registerHelper('valueIf', (condition, valueIfTrue, valueIfFalse) => {
- if (condition) {
- return valueIfTrue;
- }
-
- return valueIfFalse;
-});
diff --git a/src/components/helpers/thumbnail.js b/src/components/helpers/thumbnail.js
deleted file mode 100644
index 2e624f7..0000000
--- a/src/components/helpers/thumbnail.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/* eslint import/no-extraneous-dependencies:0 */
-
-import $ from 'jquery';
-import _ from 'underscore';
-import Handlebars from 'handlebars';
-import { cornerstone } from '../../lib/cornerstonejs';
-import { DCMViewer } from '../../lib/viewerMain';
-
-/**
- * Create data for thumbnails
- *
- */
-Handlebars.registerHelper('studyThumbnails', (study) => {
- if (!study) {
- return;
- }
-
- // Find the study's stacks
- const stacks = study.displaySets;
-
- // Defines the resulting thumbnails list
- const thumbnails = [];
-
- // Iterate over the stacks and add one by one with its index
- _.each(stacks, (stack, thumbnailIndex) => {
- thumbnails.push({
- thumbnailIndex,
- stack
- });
- });
-
- return thumbnails;
-});
-
-
-function getThumbnailImageId(stack) {
- const useMiddleFrame = true;
- const lastIndex = (stack.numImageFrames || stack.images.length || 1) - 1;
- let imageIndex = useMiddleFrame ? Math.floor(lastIndex / 2) : 0;
- let imageInstance;
-
- if (stack.isMultiFrame) {
- imageInstance = stack.images[0];
- } else {
- imageInstance = stack.images[imageIndex];
- imageIndex = undefined;
- }
-
- return imageInstance.getImageId(imageIndex, true);
-}
-
-
-/**
- * Render each thumbnail image
- *
- */
-Handlebars.registerHelper('imageThumbnailCanvas', function () {
- setTimeout(() => {
- const { stack } = this;
- const { isActiveStudy } = this;
- const activeThumbnail = (this.thumbnailIndex === 0);
- const thumbnailCanvasId = `imageThumbnailCanvas${stack.seriesNumber}_${stack.displaySetInstanceUid}`;
- const imageId = getThumbnailImageId(stack);
- const $element = $(`#${thumbnailCanvasId}`);
- const element = $element.get(0);
- const { imageToJump } = DCMViewer.viewerbase.data;
- const isActiveSeries = imageToJump && imageToJump.seriesInstanceUid && imageToJump.seriesInstanceUid === stack.seriesInstanceUid;
-
- // Highlight active thumbnail
- if (isActiveSeries || (isActiveStudy && activeThumbnail)) {
- $('.imageThumbnail').removeClass('active');
- $element.parent('.imageThumbnail').addClass('active');
- }
-
- // Enable element
- cornerstone.enable(element);
-
- // Display image in thumbnail
- cornerstone.loadAndCacheImage(imageId).then((image) => {
- cornerstone.displayImage(element, image);
- });
-
- // Activate series if clicked
- $element.click(() => {
- DCMViewer.layoutManager.rerenderViewportWithNewDisplaySet(0, stack);
-
- // Highlight active series
- $('.imageThumbnail').removeClass('active');
- $element.parent('.imageThumbnail').addClass('active');
- });
- }, 300);
-});
-
-/**
- * List all modalities inside a study
- *
- */
-Handlebars.registerHelper('modalitiesList', (study) => {
- if (!study) {
- return;
- }
-
- const { seriesList } = study;
-
- if (!seriesList) {
- return;
- }
-
- const modalities = _.uniq(seriesList.map(series => series.modality));
-
- if (modalities.length > 1) {
- return `${modalities[0]}…`;
- }
-
- return modalities[0];
-});
diff --git a/src/components/helpers/toolbar.js b/src/components/helpers/toolbar.js
deleted file mode 100644
index 314cda5..0000000
--- a/src/components/helpers/toolbar.js
+++ /dev/null
@@ -1,118 +0,0 @@
-/* eslint import/no-extraneous-dependencies:0 */
-
-import Handlebars from 'handlebars';
-import { DCMViewer } from '../../lib/viewerMain';
-
-const tools = [{
- id: 'stackScroll',
- title: t('dicomviewer', 'Stack Scroll'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-bars fa-lg',
-}, {
- id: 'wwwc',
- title: t('dicomviewer', 'Levels'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-sun-o fa-lg',
-}, {
- id: 'wwwcRegion',
- title: t('dicomviewer', 'Levels ROI'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-square fa-lg',
-}, {
- id: 'zoom',
- title: t('dicomviewer', 'Zoom'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-search fa-lg',
-}, {
- id: 'pan',
- title: t('dicomviewer', 'Pan'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-arrows fa-lg',
-}, {
- id: 'invert',
- title: t('dicomviewer', 'Invert'),
- classes: 'imageViewerCommand',
- iconClasses: 'fa fa-adjust fa-lg',
-}, {
- id: 'flipH',
- title: t('dicomviewer', 'Flip H'),
- classes: 'imageViewerCommand',
- iconClasses: 'fa fa-ellipsis-h fa-lg',
-}, {
- id: 'flipV',
- title: t('dicomviewer', 'Flip V'),
- classes: 'imageViewerCommand',
- iconClasses: 'fa fa-ellipsis-v fa-lg',
-}, {
- id: 'rotateL',
- title: t('dicomviewer', 'Rotate L'),
- classes: 'imageViewerCommand',
- svgClasses: 'svgContent rotate-left',
-}, {
- id: 'rotateR',
- title: t('dicomviewer', 'Rotate R'),
- classes: 'imageViewerCommand',
- svgClasses: 'svgContent rotate-right'
-}, {
- id: 'magnify',
- title: t('dicomviewer', 'Magnify'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-circle'
-}, {
- id: 'length',
- title: t('dicomviewer', 'Length'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-arrows-v fa-lg',
-}, {
- id: 'angle',
- title: t('dicomviewer', 'Angle'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-angle-left fa-lg',
-}, {
- id: 'dragProbe',
- title: t('dicomviewer', 'Probe'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-dot-circle-o fa-lg',
-}, {
- id: 'ellipticalRoi',
- title: t('dicomviewer', 'Elliptical ROI'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-circle-o fa-lg',
-}, {
- id: 'rectangleRoi',
- title: t('dicomviewer', 'Rectangle ROI'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-square-o fa-lg',
-}, {
- id: 'annotate',
- title: t('dicomviewer', 'Annotate'),
- classes: 'imageViewerTool',
- iconClasses: 'fa fa-long-arrow-down fa-lg',
-}, {
- id: 'clearTools',
- title: t('dicomviewer', 'Clear'),
- classes: 'imageViewerCommand',
- iconClasses: 'fa fa-trash fa-lg',
-}, {
- id: 'reset',
- title: t('dicomviewer', 'Reset'),
- classes: 'imageViewerCommand',
- iconClasses: 'fa fa-undo fa-lg',
-}, {
- id: 'toggleCaptureImageDialog',
- title: t('dicomviewer', 'Capture'),
- classes: 'imageViewerCommand',
- iconClasses: 'fa fa-camera fa-lg',
-}];
-
-
-Handlebars.registerHelper('toolbarButtons', () => {
- const activeTool = DCMViewer.tools.toolManager.getActiveTool();
-
- // Highlight active tool
- tools.forEach((tool) => {
- tool.toolActive = (tool.id === activeTool);
- });
-
- return tools;
-});
diff --git a/src/components/helpers/translation.js b/src/components/helpers/translation.js
deleted file mode 100644
index 79743b5..0000000
--- a/src/components/helpers/translation.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/* eslint import/no-extraneous-dependencies:0 */
-
-import Handlebars from 'handlebars';
-
-// AnnotationDialogs.html
-Handlebars.registerHelper('EnterAnnotationText', t('dicomviewer', 'Enter your annotation'));
-Handlebars.registerHelper('NewLabelText', t('dicomviewer', 'New label'));
-Handlebars.registerHelper('EditAnnotationText', t('dicomviewer', 'Edit your annotation'));
-Handlebars.registerHelper('OKText', t('dicomviewer', 'OK'));
-Handlebars.registerHelper('RemoveMarkerText', t('dicomviewer', 'Remove Marker'));
-
-// CaptureImageDialog.html
-Handlebars.registerHelper('CaptureImageTitleText', t('dicomviewer', 'Capture High Quality Image'));
-Handlebars.registerHelper('CaptureImageDescText', t('dicomviewer', 'Please specify the dimensions, and desired type for the output image.'));
-Handlebars.registerHelper('WidthText', t('dicomviewer', 'Width (px)'));
-Handlebars.registerHelper('HeightText', t('dicomviewer', 'Height (px)'));
-Handlebars.registerHelper('FileNameText', t('dicomviewer', 'File Name'));
-Handlebars.registerHelper('FileTypeText', t('dicomviewer', 'File Type'));
-Handlebars.registerHelper('ShowAnnotationsText', t('dicomviewer', 'Show Annotations'));
-Handlebars.registerHelper('ImageQualityText', t('dicomviewer', 'Image Quality (%)'));
-Handlebars.registerHelper('ImagePreviewText', t('dicomviewer', 'Image Preview'));
-Handlebars.registerHelper('CloseText', t('dicomviewer', 'Close'));
-Handlebars.registerHelper('DownloadText', t('dicomviewer', 'Download'));
-
-// Toolbar.html
-Handlebars.registerHelper('ToggleSeriesPanelText', t('dicomviewer', 'Toggle Series Panel'));
-Handlebars.registerHelper('SeriesText', t('dicomviewer', 'Series'));
-Handlebars.registerHelper('MoreText', t('dicomviewer', 'More'));
-Handlebars.registerHelper('CloseViewerText', t('dicomviewer', 'Close Viewer'));
-
-// ViewerMain.html
-Handlebars.registerHelper('LoadingText', t('dicomviewer', 'Loading…'));
-
-// ViewportOverlay.html
-Handlebars.registerHelper('SerText', t('dicomviewer', 'Ser:'));
-Handlebars.registerHelper('ImgText', t('dicomviewer', 'Img:'));
diff --git a/src/components/helpers/viewport.js b/src/components/helpers/viewport.js
deleted file mode 100644
index 8aad5e7..0000000
--- a/src/components/helpers/viewport.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* eslint import/no-extraneous-dependencies:0 */
-
-import Handlebars from 'handlebars';
-import moment from 'moment/min/moment-with-locales';
-
-const momentLocale = OC.getLocale().replace('_', '-').toLowerCase().split('-')[0];
-
-Handlebars.registerHelper('formatPN', (context) => {
- if (!context) {
- return;
- }
-
- return context.replace('^', ', ');
-});
-
-Handlebars.registerHelper('formatDA', (context, format, options) => {
- if (!context) {
- return undefined;
- }
- const dateAsMoment = moment(context, 'YYYYMMDD').locale(momentLocale);
- let strFormat = 'MMM D, YYYY';
- if (options) {
- strFormat = format;
- }
- return dateAsMoment.format(strFormat);
-});
-
-Handlebars.registerHelper('formatTM', (context, options) => {
- if (!context) {
- return;
- }
- // DICOM Time is stored as HHmmss.SSS, where:
- // HH 24 hour time:
- // m mm 0..59 Minutes
- // s ss 0..59 Seconds
- // S SS SSS 0..999 Fractional seconds
- //
- // See MomentJS: http://momentjs.com/docs/#/parsing/string-format/
- const dateTime = moment(context, 'HHmmss.SSS').locale(momentLocale);
-
- let format = 'HH:mm:ss';
- if (options && options.format) {
- ({ format } = options);
- }
-
- return dateTime.format(format);
-});
diff --git a/src/components/index.js b/src/components/index.js
deleted file mode 100644
index 8229f33..0000000
--- a/src/components/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import './helpers';
-import './sidebar';
-import './dicomViewer';
diff --git a/src/components/templates/AnnotationDialogs.html b/src/components/templates/AnnotationDialogs.html
deleted file mode 100644
index 30692f9..0000000
--- a/src/components/templates/AnnotationDialogs.html
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
- {{EnterAnnotationText}}
-
- {{NewLabelText}}
-
-
- {{OKText}}
-
-
-
- {{EditAnnotationText}}
-
- {{NewLabelText}}
-
-
-
- {{OKText}}
- {{RemoveMarkerText}}
-
-
-
\ No newline at end of file
diff --git a/src/components/templates/AppDicomViewer.html b/src/components/templates/AppDicomViewer.html
deleted file mode 100644
index 339f606..0000000
--- a/src/components/templates/AppDicomViewer.html
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- {{> AnnotationDialogs }}
-
- {{> ViewerMain }}
-
diff --git a/src/components/templates/CaptureImageDialog.html b/src/components/templates/CaptureImageDialog.html
deleted file mode 100644
index 20ce326..0000000
--- a/src/components/templates/CaptureImageDialog.html
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
-
-
-
{{CaptureImageDescText}}
-
-
-
-
-
-
-
{{ImagePreviewText}}
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/components/templates/ImageControls.html b/src/components/templates/ImageControls.html
deleted file mode 100644
index c47aafc..0000000
--- a/src/components/templates/ImageControls.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
- {{#if (gt numImages 1)}}
-
-
-
-
-
-
-
- {{/if}}
-
\ No newline at end of file
diff --git a/src/components/templates/ImageThumbnail.html b/src/components/templates/ImageThumbnail.html
deleted file mode 100644
index 49b65d7..0000000
--- a/src/components/templates/ImageThumbnail.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {{imageThumbnailCanvas}}
-
-
-
-
{{stack.seriesDescription}}
-
-
-
\ No newline at end of file
diff --git a/src/components/templates/StudyBrowser.html b/src/components/templates/StudyBrowser.html
deleted file mode 100644
index c466e29..0000000
--- a/src/components/templates/StudyBrowser.html
+++ /dev/null
@@ -1,49 +0,0 @@
-
\ No newline at end of file
diff --git a/src/components/templates/Toolbar.html b/src/components/templates/Toolbar.html
deleted file mode 100644
index 5d0514f..0000000
--- a/src/components/templates/Toolbar.html
+++ /dev/null
@@ -1,42 +0,0 @@
-
\ No newline at end of file
diff --git a/src/components/templates/ViewerMain.html b/src/components/templates/ViewerMain.html
deleted file mode 100644
index f249836..0000000
--- a/src/components/templates/ViewerMain.html
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
- {{> Toolbar}}
-
-
-
-
-
-
-
-
-
- {{> ImageControls}}
- {{> ViewportOrientationMarkers}}
-
-
-
-
-
-
-
-
- {{LoadingText}} 0 %
-
-
\ No newline at end of file
diff --git a/src/components/templates/ViewportOrientationMarkers.html b/src/components/templates/ViewportOrientationMarkers.html
deleted file mode 100644
index cf4f3a7..0000000
--- a/src/components/templates/ViewportOrientationMarkers.html
+++ /dev/null
@@ -1,6 +0,0 @@
-
\ No newline at end of file
diff --git a/src/components/templates/ViewportOverlay.html b/src/components/templates/ViewportOverlay.html
deleted file mode 100644
index 961d631..0000000
--- a/src/components/templates/ViewportOverlay.html
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
{{formatPN this.patientName}}
-
{{patientId}}
-
-
-
-
{{studyDescription}}
-
{{formatDA this.studyDate}} {{formatTM this.studyTime}}
-
-
-
-
-
-
{{SerText}} {{seriesNumber}}
-
{{ImgText}} {{instanceNumber}} {{#if numImages}}({{imageIndex}}/{{numImages}}){{/if}}
-
{{dimensions}}
-
{{seriesDescription}}
-
-
-
-
{{zoomLevel}}
-
{{compression}}
-
{{windowLevel}}
-
-
\ No newline at end of file
diff --git a/src/external/jquery.slimscroll.js b/src/external/jquery.slimscroll.js
deleted file mode 100644
index 1a9e324..0000000
--- a/src/external/jquery.slimscroll.js
+++ /dev/null
@@ -1,474 +0,0 @@
-/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
- * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
- * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
- *
- * Version: 1.3.8-rc1
- *
- */
-(function($) {
-
- $.fn.extend({
- slimScroll: function(options) {
-
- var defaults = {
-
- // width in pixels of the visible scroll area
- width : 'auto',
-
- // height in pixels of the visible scroll area
- height : '250px',
-
- // width in pixels of the scrollbar and rail
- size : '7px',
-
- // scrollbar color, accepts any hex/color value
- color: '#000',
-
- // scrollbar position - left/right
- position : 'right',
-
- // distance in pixels between the side edge and the scrollbar
- distance : '1px',
-
- // default scroll position on load - top / bottom / $('selector')
- start : 'top',
-
- // sets scrollbar opacity
- opacity : .4,
-
- // enables always-on mode for the scrollbar
- alwaysVisible : false,
-
- // check if we should hide the scrollbar when user is hovering over
- disableFadeOut : false,
-
- // sets visibility of the rail
- railVisible : false,
-
- // sets rail color
- railColor : '#333',
-
- // sets rail opacity
- railOpacity : .2,
-
- // whether we should use jQuery UI Draggable to enable bar dragging
- railDraggable : true,
-
- // defautlt CSS class of the slimscroll rail
- railClass : 'slimScrollRail',
-
- // defautlt CSS class of the slimscroll bar
- barClass : 'slimScrollBar',
-
- // defautlt CSS class of the slimscroll wrapper
- wrapperClass : 'slimScrollDiv',
-
- // check if mousewheel should scroll the window if we reach top/bottom
- allowPageScroll : false,
-
- // scroll amount applied to each mouse wheel step
- wheelStep : 20,
-
- // scroll amount applied when user is using gestures
- touchScrollStep : 200,
-
- // sets border radius
- borderRadius: '7px',
-
- // sets border radius of the rail
- railBorderRadius : '7px'
- };
-
- var o = $.extend(defaults, options);
-
- // do it for every element that matches selector
- this.each(function(){
-
- var isOverPanel, isOverBar, isDragg, queueHide, touchDif,
- barHeight, percentScroll, lastScroll,
- divS = '
',
- minBarHeight = 30,
- releaseScroll = false;
-
- // used in event handlers and for better minification
- var me = $(this);
-
- // ensure we are not binding it again
- if (me.parent().hasClass(o.wrapperClass))
- {
- // start from last bar position
- var offset = me.scrollTop();
-
- // find bar and rail
- bar = me.siblings('.' + o.barClass);
- rail = me.siblings('.' + o.railClass);
-
- getBarHeight();
-
- // check if we should scroll existing instance
- if ($.isPlainObject(options))
- {
- // Pass height: auto to an existing slimscroll object to force a resize after contents have changed
- if ( 'height' in options && options.height == 'auto' ) {
- me.parent().css('height', 'auto');
- me.css('height', 'auto');
- var height = me.parent().parent().height();
- me.parent().css('height', height);
- me.css('height', height);
- } else if ('height' in options) {
- var h = options.height;
- me.parent().css('height', h);
- me.css('height', h);
- }
-
- if ('scrollTo' in options)
- {
- // jump to a static point
- offset = parseInt(o.scrollTo);
- }
- else if ('scrollBy' in options)
- {
- // jump by value pixels
- offset += parseInt(o.scrollBy);
- }
- else if ('destroy' in options)
- {
- // remove slimscroll elements
- bar.remove();
- rail.remove();
- me.unwrap();
- return;
- }
-
- // scroll content by the given offset
- scrollContent(offset, false, true);
- }
-
- return;
- }
- else if ($.isPlainObject(options))
- {
- if ('destroy' in options)
- {
- return;
- }
- }
-
- // optionally set height to the parent's height
- o.height = (o.height == 'auto') ? me.parent().height() : o.height;
-
- // wrap content
- var wrapper = $(divS)
- .addClass(o.wrapperClass)
- .css({
- position: 'relative',
- overflow: 'hidden',
- width: o.width,
- height: o.height
- });
-
- // update style for the div
- me.css({
- overflow: 'hidden',
- width: o.width,
- height: o.height
- });
-
- // create scrollbar rail
- var rail = $(divS)
- .addClass(o.railClass)
- .css({
- width: o.size,
- height: '100%',
- position: 'absolute',
- top: 0,
- display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',
- 'border-radius': o.railBorderRadius,
- background: o.railColor,
- opacity: o.railOpacity,
- zIndex: 90
- });
-
- // create scrollbar
- var bar = $(divS)
- .addClass(o.barClass)
- .css({
- background: o.color,
- width: o.size,
- position: 'absolute',
- top: 0,
- opacity: o.opacity,
- display: o.alwaysVisible ? 'block' : 'none',
- 'border-radius' : o.borderRadius,
- BorderRadius: o.borderRadius,
- MozBorderRadius: o.borderRadius,
- WebkitBorderRadius: o.borderRadius,
- zIndex: 99
- });
-
- // set position
- var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance };
- rail.css(posCss);
- bar.css(posCss);
-
- // wrap it
- me.wrap(wrapper);
-
- // append to parent div
- me.parent().append(bar);
- me.parent().append(rail);
-
- // make it draggable and no longer dependent on the jqueryUI
- if (o.railDraggable){
- bar.bind("mousedown", function(e) {
- var $doc = $(document);
- isDragg = true;
- var t = parseFloat(bar.css('top'));
- var pageY = e.pageY;
-
- $doc.bind("mousemove.slimscroll", function(e){
- var currTop = t + e.pageY - pageY;
- bar.css('top', currTop);
- scrollContent(0, bar.position().top, false);// scroll content
- });
-
- $doc.bind("mouseup.slimscroll", function(e) {
- isDragg = false;hideBar();
- $doc.unbind('.slimscroll');
- });
- return false;
- }).bind("selectstart.slimscroll", function(e){
- e.stopPropagation();
- e.preventDefault();
- return false;
- });
- }
-
- // on rail over
- rail.hover(function(){
- showBar();
- }, function(){
- hideBar();
- });
-
- // on bar over
- bar.hover(function(){
- isOverBar = true;
- }, function(){
- isOverBar = false;
- });
-
- // show on parent mouseover
- me.hover(function(){
- isOverPanel = true;
- showBar();
- hideBar();
- }, function(){
- isOverPanel = false;
- hideBar();
- });
-
- // support for mobile
- me.bind('touchstart', function(e,b){
- if (e.originalEvent.touches.length)
- {
- // record where touch started
- touchDif = e.originalEvent.touches[0].pageY;
- }
- });
-
- me.bind('touchmove', function(e){
- // prevent scrolling the page if necessary
- if(!releaseScroll)
- {
- e.originalEvent.preventDefault();
- }
- if (e.originalEvent.touches.length)
- {
- // see how far user swiped
- var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;
- // scroll content
- scrollContent(diff, true);
- touchDif = e.originalEvent.touches[0].pageY;
- }
- });
-
- // set up initial height
- getBarHeight();
-
- // check start position
- if (o.start === 'bottom')
- {
- // scroll content to bottom
- bar.css({ top: me.outerHeight() - bar.outerHeight() });
- scrollContent(0, true);
- }
- else if (o.start !== 'top')
- {
- // assume jQuery selector
- scrollContent($(o.start).position().top, null, true);
-
- // make sure bar stays hidden
- if (!o.alwaysVisible) { bar.hide(); }
- }
-
- // attach scroll events
- attachWheel(this);
-
- function _onWheel(e)
- {
- // use mouse wheel only when mouse is over
- if (!isOverPanel) { return; }
-
- var e = e || window.event;
-
- var delta = 0;
- if (e.wheelDelta) { delta = -e.wheelDelta/120; }
- if (e.detail) { delta = e.detail / 3; }
-
- var target = e.target || e.srcTarget || e.srcElement;
- if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {
- // scroll content
- scrollContent(delta, true);
- }
-
- // stop window scroll
- if (e.preventDefault && !releaseScroll) { e.preventDefault(); }
- if (!releaseScroll) { e.returnValue = false; }
- }
-
- function scrollContent(y, isWheel, isJump)
- {
- releaseScroll = false;
- var delta = y;
- var maxTop = me.outerHeight() - bar.outerHeight();
-
- if (isWheel)
- {
- // move bar with mouse wheel
- delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();
-
- // move bar, make sure it doesn't go out
- delta = Math.min(Math.max(delta, 0), maxTop);
-
- // if scrolling down, make sure a fractional change to the
- // scroll position isn't rounded away when the scrollbar's CSS is set
- // this flooring of delta would happened automatically when
- // bar.css is set below, but we floor here for clarity
- delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);
-
- // scroll the scrollbar
- bar.css({ top: delta + 'px' });
- }
-
- // calculate actual scroll amount
- percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());
- delta = percentScroll * (me[0].scrollHeight - me.outerHeight());
-
- if (isJump)
- {
- delta = y;
- var offsetTop = delta / me[0].scrollHeight * me.outerHeight();
- offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);
- bar.css({ top: offsetTop + 'px' });
- }
-
- // scroll content
- me.scrollTop(delta);
-
- // fire scrolling event
- me.trigger('slimscrolling', ~~delta);
-
- // ensure bar is visible
- showBar();
-
- // trigger hide when scroll is stopped
- hideBar();
- }
-
- function attachWheel(target)
- {
- if (window.addEventListener)
- {
- target.addEventListener('DOMMouseScroll', _onWheel, false );
- target.addEventListener('mousewheel', _onWheel, false );
- }
- else
- {
- document.attachEvent("onmousewheel", _onWheel)
- }
- }
-
- function getBarHeight()
- {
- // calculate scrollbar height and make sure it is not too small
- barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
- bar.css({ height: barHeight + 'px' });
-
- // hide scrollbar if content is not long enough
- var display = barHeight == me.outerHeight() ? 'none' : 'block';
- bar.css({ display: display });
- }
-
- function showBar()
- {
- // recalculate bar height
- getBarHeight();
- clearTimeout(queueHide);
-
- // when bar reached top or bottom
- if (percentScroll == ~~percentScroll)
- {
- //release wheel
- releaseScroll = o.allowPageScroll;
-
- // publish approporiate event
- if (lastScroll != percentScroll)
- {
- var msg = (~~percentScroll == 0) ? 'top' : 'bottom';
- me.trigger('slimscroll', msg);
- }
- }
- else
- {
- releaseScroll = false;
- }
- lastScroll = percentScroll;
-
- // show only when required
- if(barHeight >= me.outerHeight()) {
- //allow window scroll
- releaseScroll = true;
- return;
- }
- bar.stop(true,true).fadeIn('fast');
- if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); }
- }
-
- function hideBar()
- {
- // only hide when options allow it
- if (!o.alwaysVisible)
- {
- queueHide = setTimeout(function(){
- if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)
- {
- bar.fadeOut('slow');
- rail.fadeOut('slow');
- }
- }, 1000);
- }
- }
-
- });
-
- // maintain chainability
- return this;
- }
- });
-
- $.fn.extend({
- slimscroll: $.fn.slimScroll
- });
-
-})(jQuery);
diff --git a/src/index.js b/src/index.js
deleted file mode 100644
index 57ef0ee..0000000
--- a/src/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import 'bootstrap';
-import './components';
diff --git a/src/lib/DCMViewerError.js b/src/lib/DCMViewerError.js
deleted file mode 100644
index a747b80..0000000
--- a/src/lib/DCMViewerError.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Objects to be used to throw errors.
- */
-export class DCMViewerError extends Error {
- constructor(message) {
- super();
- this.message = message;
- this.stack = (new Error()).stack;
- this.name = this.constructor.name;
- }
-}
diff --git a/src/lib/DCMViewerLog.js b/src/lib/DCMViewerLog.js
deleted file mode 100644
index e9ccb33..0000000
--- a/src/lib/DCMViewerLog.js
+++ /dev/null
@@ -1,6 +0,0 @@
-const DCMViewerLog = {
- info: message => console.info(message),
- warn: message => console.warn(message)
-};
-
-export { DCMViewerLog };
diff --git a/src/lib/DCMViewerManager.js b/src/lib/DCMViewerManager.js
deleted file mode 100644
index 9c2a7f2..0000000
--- a/src/lib/DCMViewerManager.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { StackImagePositionOffsetSynchronizer } from './viewerbase/classes/StackImagePositionOffsetSynchronizer';
-
-/**
- * Manages all global variables, sessions and collections
- */
-const DCMViewerManager = {
- stackImagePositionOffsetSynchronizer: new StackImagePositionOffsetSynchronizer(),
- sessions: {}
-};
-
-export { DCMViewerManager };
diff --git a/src/lib/viewerMain/index.js b/src/lib/viewerMain/index.js
deleted file mode 100644
index 5b13fe2..0000000
--- a/src/lib/viewerMain/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import viewerbase from './viewerbase/index';
-import { tools } from './tools';
-import { ui } from './ui';
-import { Viewerbase } from '../viewerbase';
-
-const DCMViewer = {
- cornerstone: {
- MetadataProvider: Viewerbase.MetadataProvider,
- },
- viewerbase,
- metadata: {
- InstanceMetadata: Viewerbase.metadata.InstanceMetadata,
- SeriesMetadata: Viewerbase.metadata.SeriesMetadata,
- StudyMetadata: Viewerbase.metadata.StudyMetadata
- },
- viewer: {
- Studies: [],
- StudyMetadataList: []
- },
- tools,
- ui: {
- renderViewer: ui.renderViewer,
- },
-
-};
-
-export { DCMViewer };
diff --git a/src/lib/viewerMain/tools/classes/CommandsManager.js b/src/lib/viewerMain/tools/classes/CommandsManager.js
deleted file mode 100644
index f14b9ba..0000000
--- a/src/lib/viewerMain/tools/classes/CommandsManager.js
+++ /dev/null
@@ -1,62 +0,0 @@
-class CommandsManager {
- constructor() {
- this.context = {};
- }
-
- set(definitions, extend = false) {
- if (typeof definitions !== 'object') return;
-
- if (!extend) {
- this.context = {};
- }
-
- Object.keys(definitions).forEach((command) => {
- this.context[command] = definitions[command];
- });
- }
-
- register(command, definition) {
- if (typeof definition !== 'object') return;
- this.context[command] = definition;
- }
-
- setDisabledFunction(command, func) {
- if (!command || typeof func !== 'function') return;
- const definition = this.context[command];
- if (!definition) {
- console.warn(`Trying to set a disabled function to a command "${command}" that was not yet defined`);
- }
-
- definition.disabled = func;
- }
-
- getDefinition(command) {
- return this.context[command];
- }
-
- isDisabled(command) {
- const definition = this.getDefinition(command);
- if (!definition) return false;
- const { disabled } = definition;
- if ((typeof disabled === 'function') && disabled()) return true;
- if ((typeof disabled !== 'function') && disabled) return true;
- return false;
- }
-
- run(command) {
- const definition = this.getDefinition(command);
- if (!definition) {
- return console.warn(`Command "${command}" not found in current context`);
- }
-
- const { action, params } = definition;
- if (this.isDisabled(command)) return undefined;
- if (typeof action !== 'function') {
- return console.warn(`No action was defined for command "${command}"`);
- }
-
- return action(params);
- }
-}
-
-export default CommandsManager;
diff --git a/src/lib/viewerMain/tools/createToolbar.js b/src/lib/viewerMain/tools/createToolbar.js
deleted file mode 100644
index 060b188..0000000
--- a/src/lib/viewerMain/tools/createToolbar.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import $ from 'jquery';
-
-/**
- * Create tool buttons and add to the toolbar
- * @param commandManager
- */
-export default function (commandManager) {
- const toolbarSectionButtonHandler = () => {
- const $toolbarSectionButton = $('.toolbarSectionButton').not('.toggleSeriesPanelButton, .notTool');
- $toolbarSectionButton.click((e) => {
- const button = e.currentTarget;
- const $button = $(button);
- const id = $(button).attr('id');
-
- if ($button.hasClass('imageViewerTool')) {
- // Deactivate all tools
- $toolbarSectionButton.removeClass('active');
-
- // Activate selected tool
- $button.addClass('active');
- } else if ($button.hasClass('imageViewerCommand')) {
- const flashButton = ($element) => {
- $element.addClass('active');
- setTimeout(() => {
- $element.removeClass('active');
- }, 100);
- };
-
- flashButton($button);
- }
-
- commandManager.run(id);
- });
- };
-
- // Handle click event of tool button
- toolbarSectionButtonHandler();
-}
diff --git a/src/lib/viewerMain/tools/index.js b/src/lib/viewerMain/tools/index.js
deleted file mode 100644
index f201fd7..0000000
--- a/src/lib/viewerMain/tools/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import createToolbar from './createToolbar';
-import registerTools from './registerTools';
-import { toolManager } from './toolManager';
-
-const tools = {
- createToolbar,
- registerTools,
- toolManager,
-};
-
-export { tools };
diff --git a/src/lib/viewerMain/tools/registerTools.js b/src/lib/viewerMain/tools/registerTools.js
deleted file mode 100644
index f001251..0000000
--- a/src/lib/viewerMain/tools/registerTools.js
+++ /dev/null
@@ -1,88 +0,0 @@
-import CommandsManager from './classes/CommandsManager';
-import { toolManager } from './toolManager';
-import viewerbase from '../viewerbase';
-
-const { viewportUtils } = viewerbase;
-
-export default function () {
- const tools = [{
- id: 'stackScroll',
- name: 'Stack Scroll',
- }, {
- id: 'wwwc',
- name: 'W/L',
- }, {
- id: 'zoom',
- name: 'Zoom',
- }, {
- id: 'angle',
- name: 'Angle',
- }, {
- id: 'dragProbe',
- name: 'Probe',
- }, {
- id: 'ellipticalRoi',
- name: 'Elliptical ROI',
- }, {
- id: 'rectangleRoi',
- name: 'Rectangle ROI',
- }, {
- id: 'magnify',
- name: 'Magnify',
- }, {
- id: 'annotate',
- name: 'Annotate',
- }, {
- id: 'pan',
- name: 'Pan',
- }, {
- id: 'length',
- name: 'Length',
- }, {
- id: 'wwwcRegion',
- name: 'W/L by Region',
- }, {
- id: 'invert',
- name: 'Invert',
- action: viewportUtils.invert,
- }, {
- id: 'flipH',
- name: 'Flip H',
- action: viewportUtils.flipH,
- }, {
- id: 'flipV',
- name: 'Flip V',
- action: viewportUtils.flipV,
- }, {
- id: 'rotateL',
- name: 'Rotate L',
- action: viewportUtils.rotateL,
- }, {
- id: 'rotateR',
- name: 'Rotate R',
- action: viewportUtils.rotateR,
- }, {
- id: 'reset',
- name: 'Reset',
- action: viewportUtils.resetViewport,
- }, {
- id: 'clearTools',
- name: 'Clear',
- action: viewportUtils.clearTools,
- }, {
- id: 'toggleCaptureImageDialog',
- name: 'Download',
- action: viewportUtils.toggleCaptureImageDialog,
- }];
-
- const commandsManager = new CommandsManager();
-
- tools.forEach((tool) => {
- commandsManager.register(tool.id, {
- name: tool.name,
- action: tool.action || (() => toolManager.setActiveTool(tool.id)),
- });
- });
-
- return commandsManager;
-}
diff --git a/src/lib/viewerMain/tools/toolManager.js b/src/lib/viewerMain/tools/toolManager.js
deleted file mode 100644
index dd5f170..0000000
--- a/src/lib/viewerMain/tools/toolManager.js
+++ /dev/null
@@ -1,452 +0,0 @@
-import $ from 'jquery';
-import { cornerstone, cornerstoneTools } from '../../../lib/cornerstonejs';
-import { annotateTextUtils } from '../../viewerbase/annotateTextUtils';
-
-const defaultTool = {
- left: 'wwwc',
- right: 'zoom',
- middle: 'pan',
-};
-let activeTool;
-
-const tools = {};
-
-const gestures = {
- zoomTouchPinch: {
- enabled: true,
- },
- panMultiTouch: {
- enabled: true,
- },
- stackScrollMultiTouch: {
- enabled: true,
- },
- doubleTapZoom: {
- enabled: true,
- },
-};
-
-let toolDefaultStates = {
- activate: [],
- deactivate: ['length', 'angle', 'annotate', 'ellipticalRoi', 'rectangleRoi'],
- enable: [],
- disable: [],
- disabledToolButtons: [],
- shadowConfig: {
- shadow: false,
- shadowColor: '#000000',
- shadowOffsetX: 0,
- shadowOffsetY: 0,
- },
- textBoxConfig: {
- centering: {
- x: true,
- y: true,
- },
- },
-};
-
-let initialized = false;
-
-/**
- * Exported "toolManager" Singleton
- */
-const toolManager = {
- init() {
- toolManager.addTool('stackScroll', {
- mouse: cornerstoneTools.stackScroll,
- touch: cornerstoneTools.stackScrollTouchDrag,
- multiTouch: cornerstoneTools.stackScrollMultiTouch
- });
- toolManager.addTool('wwwc', {
- mouse: cornerstoneTools.wwwc,
- touch: cornerstoneTools.wwwcTouchDrag,
- });
- toolManager.addTool('zoom', {
- mouse: cornerstoneTools.zoom,
- touch: cornerstoneTools.zoomTouchDrag,
- });
- toolManager.addTool('wwwcRegion', {
- mouse: cornerstoneTools.wwwcRegion,
- touch: cornerstoneTools.wwwcRegionTouch,
- });
- toolManager.addTool('dragProbe', {
- mouse: cornerstoneTools.dragProbe,
- touch: cornerstoneTools.dragProbeTouch,
- });
- toolManager.addTool('pan', {
- mouse: cornerstoneTools.pan,
- touch: cornerstoneTools.panTouchDrag,
- });
- toolManager.addTool('length', {
- mouse: cornerstoneTools.length,
- touch: cornerstoneTools.lengthTouch,
- });
- toolManager.addTool('angle', {
- mouse: cornerstoneTools.simpleAngle,
- touch: cornerstoneTools.simpleAngleTouch,
- });
- toolManager.addTool('magnify', {
- mouse: cornerstoneTools.magnify,
- touch: cornerstoneTools.magnifyTouchDrag,
- });
- toolManager.addTool('ellipticalRoi', {
- mouse: cornerstoneTools.ellipticalRoi,
- touch: cornerstoneTools.ellipticalRoiTouch,
- });
- toolManager.addTool('rectangleRoi', {
- mouse: cornerstoneTools.rectangleRoi,
- touch: cornerstoneTools.rectangleRoiTouch,
- });
- toolManager.addTool('annotate', {
- mouse: cornerstoneTools.arrowAnnotate,
- touch: cornerstoneTools.arrowAnnotateTouch,
- });
-
- toolManager.addTool('rotate', {
- mouse: cornerstoneTools.rotate,
- touch: cornerstoneTools.rotateTouchDrag,
- });
-
- this.configureTools();
- initialized = true;
- },
-
- configureTools() {
- // Get Cornerstone Tools
- const {
- panMultiTouch, textStyle, toolStyle, toolColors,
- length, arrowAnnotate, zoom, ellipticalRoi, rectangleRoi, magnify
- } = cornerstoneTools;
-
- // Set the configuration for the multitouch pan tool
- const multiTouchPanConfig = {
- testPointers: eventData => eventData.numPointers >= 3,
- };
- panMultiTouch.setConfiguration(multiTouchPanConfig);
-
- // Set text box background color
- textStyle.setBackgroundColor('transparent');
-
- // Set the tool font and font size
- // context.font = "[style] [variant] [weight] [size]/[line height] [font family]";
- const fontFamily = 'Roboto, OpenSans, HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif';
- textStyle.setFont(`15px ${fontFamily}`);
-
- // Set the tool width
- toolStyle.setToolWidth(2);
-
- // Set color for inactive tools
- toolColors.setToolColor('rgb(255, 255, 0)');
-
- // Set color for active tools
- toolColors.setActiveColor('rgb(0, 255, 0)');
-
- // Set shadow configuration
- const { shadowConfig } = toolManager.getToolDefaultStates();
-
- // Get some tools config to not override them
- const lengthConfig = length.getConfiguration();
- const ellipticalRoiConfig = ellipticalRoi.getConfiguration();
- const rectangleRoiConfig = rectangleRoi.getConfiguration();
- const handlesOnHover = { drawHandlesOnHover: true };
-
- // Add shadow to length tool
- length.setConfiguration(Object.assign({}, lengthConfig, shadowConfig, handlesOnHover));
-
- // Add shadow to ellipticalRoi tool
- ellipticalRoi.setConfiguration(Object.assign({}, ellipticalRoiConfig, shadowConfig, handlesOnHover));
-
- // Add shadow to rectangleRoi tool
- rectangleRoi.setConfiguration(Object.assign({}, rectangleRoiConfig, shadowConfig, handlesOnHover));
-
- // Set the configuration values for the text annotation (Arrow) tool
- const annotateConfig = {
- getTextCallback: annotateTextUtils.getTextCallback,
- changeTextCallback: annotateTextUtils.changeTextCallback,
- drawHandles: false,
- arrowFirst: true
- };
- arrowAnnotate.setConfiguration(annotateConfig);
-
- const zoomConfig = {
- minScale: 0.05,
- maxScale: 10
- };
- zoom.setConfiguration(zoomConfig);
-
- const magnifyConfig = {
- magnifySize: 300,
- magnificationLevel: 3
- };
- magnify.setConfiguration(magnifyConfig);
- },
-
- /**
- * This function searches an object to return the keys that contain a specific value
- *
- * @param object {object} The object to be searched
- * @param value The value to be found
- *
- * @returns {array} The keys for which the object has the specified value
- */
- getKeysByValue(object, value) {
- // http://stackoverflow.com/questions/9907419/javascript-object-get-key-by-value
- return Object.keys(object).filter(key => object[key] === value);
- },
-
- addTool(name, base) {
- tools[name] = base;
- },
-
- getTools() {
- return tools;
- },
-
- setToolDefaultStates(states) {
- toolDefaultStates = states;
- },
-
- getToolDefaultStates() {
- return toolDefaultStates;
- },
-
- setActiveToolForElement(toolId, element, button) {
- const canvases = $(element).find('canvas');
- if (element.classList.contains('empty') || !canvases.length) {
- return;
- }
-
- // If button is not defined, we should consider it left
- if (!button) {
- button = 'left';
- }
-
- // First, deactivate the current active tool
- tools[activeTool.left].mouse.deactivate(element, 1); // 1 means left mouse button
- tools[activeTool.middle].mouse.deactivate(element, 2); // 2 means middle mouse button
- tools[activeTool.right].mouse.deactivate(element, 4); // 3 means right mouse button
-
- if (tools[activeTool.left].touch) {
- tools[activeTool.left].touch.deactivate(element);
- }
-
- // Enable tools based on their default states
- Object.keys(toolDefaultStates).forEach((action) => {
- const relevantTools = toolDefaultStates[action];
- if (!relevantTools || !relevantTools.length || action === 'disabledToolButtons') return;
- relevantTools.forEach((toolType) => {
- // the currently active tool has already been deactivated and can be skipped
- if (action === 'deactivate' &&
- (toolType === activeTool.left ||
- toolType === activeTool.middle ||
- toolType === activeTool.right)) {
- return;
- }
-
- tools[toolType].mouse[action](
- element,
- (action === 'activate' || action === 'deactivate' ? 1 : undefined)
- );
- tools[toolType].touch[action](element);
- });
- });
-
- // Get the mouse button tools
- let newToolIdLeft = activeTool.left;
- if (button === 'left') {
- newToolIdLeft = toolId;
- }
-
- // left mouse tool is used for touch as well
- const newCornerstoneToolLeft = tools[newToolIdLeft];
-
- let newToolIdMiddle = activeTool.middle;
- if (button === 'middle') {
- newToolIdMiddle = toolId;
- }
- const newCornerstoneToolMiddle = cornerstoneTools[newToolIdMiddle];
-
- let newToolIdRight = activeTool.right;
- if (button === 'right') {
- newToolIdRight = toolId;
- }
- const newCornerstoneToolRight = cornerstoneTools[newToolIdRight];
-
- // Deactivate scroll wheel tools
- cornerstoneTools.zoomWheel.deactivate(element);
- cornerstoneTools.panMultiTouch.disable(element);
- cornerstoneTools.zoomTouchPinch.disable(element);
- cornerstoneTools.doubleTapZoom.disable(element);
-
- const multiTouchPanConfig = {
- testPointers(eventData) {
- return (eventData.numPointers >= 2);
- }
- };
- cornerstoneTools.panMultiTouch.setConfiguration(multiTouchPanConfig);
-
- // This block ensures that all mouse button tools keep working
- if (newToolIdLeft === newToolIdMiddle && newToolIdMiddle === newToolIdRight) {
- // 7 means left mouse button, right mouse button and middle mouse button
- newCornerstoneToolRight.activate(element, 7);
- } else if (newToolIdLeft === newToolIdMiddle) {
- // 3 means left mouse button and middle mouse button
- newCornerstoneToolMiddle.activate(element, 3);
- // 4 means right mouse button
- newCornerstoneToolRight.activate(element, 4);
- } else if (newToolIdMiddle === newToolIdRight) {
- // 6 means right mouse button and middle mouse button
- newCornerstoneToolRight.activate(element, 6);
- // 1 means left mouse button
- newCornerstoneToolLeft.mouse.activate(element, 1);
- } else if (newToolIdLeft === newToolIdRight) {
- // 2 means middle mouse button
- newCornerstoneToolMiddle.activate(element, 2);
- // 5 means left mouse button and right mouse button
- newCornerstoneToolRight.activate(element, 5);
- } else {
- // 1 means left mouse button
- newCornerstoneToolLeft.mouse.activate(element, 1);
- // 2 means middle mouse button
- newCornerstoneToolMiddle.activate(element, 2);
- // 4 means right mouse button
- newCornerstoneToolRight.activate(element, 4);
- }
-
- if (newCornerstoneToolLeft.touch) {
- newCornerstoneToolLeft.touch.activate(element);
- }
-
- if (gestures.zoomTouchPinch.enabled === true) {
- // Two finger pinch
- cornerstoneTools.zoomTouchPinch.activate(element);
- }
-
- if (gestures.panMultiTouch.enabled === true) {
- // Two or >= Two finger pan
- cornerstoneTools.panMultiTouch.activate(element);
- }
-
- if (gestures.doubleTapZoom.enabled === true) {
- cornerstoneTools.doubleTapZoom.activate(element);
- }
- },
-
- setActiveTool(toolId, elements, button) {
- if (!initialized) {
- toolManager.init();
- }
-
- let $elements;
- if (!elements || !elements.length) {
- $elements = $('.imageViewerViewport');
- } else {
- $elements = $(elements);
- }
-
- const checkElementEnabled = (allElementsEnabled, element) => {
- try {
- cornerstone.getEnabledElement(element);
- return allElementsEnabled;
- } catch (error) {
- return true;
- }
- };
-
- if ($elements.toArray().reduce(checkElementEnabled, false)) {
- // if at least one element is not enabled, we do not activate tool.
- console.info(`Could not activate tool ${toolId} due to a viewport not being enabled. Try again later.`);
- return;
- }
-
- if (!activeTool) {
- activeTool = defaultTool;
- }
-
- // If button is not defined, we should consider it left
- if (!button) {
- button = 'left';
- }
-
- if (!toolId) {
- toolId = defaultTool[button];
- }
-
- // Otherwise, set the active tool for all viewport elements
- $elements.each((index, element) => {
- toolManager.setActiveToolForElement(toolId, element, button);
- });
-
- activeTool[button] = toolId;
-
- // TODO: Fire an event to update the active tool in toolbar
- },
-
- getNearbyToolData(element, coords, toolTypes) {
- const allTools = this.getTools();
- const touchDevice = toolManager.isTouchDevice();
- const nearbyTool = {};
- let pointNearTool = false;
-
- toolTypes.forEach((toolType) => {
- const toolData = cornerstoneTools.getToolState(element, toolType);
- if (!toolData) {
- return;
- }
-
- toolData.data.forEach((data, index) => {
- let toolInterfaceName = toolType;
- let toolInterface;
-
- // Edge cases where the tool is not the same as the typeName
- if (toolType === 'simpleAngle') {
- toolInterfaceName = 'angle';
- } else if (toolType === 'arrowAnnotate') {
- toolInterfaceName = 'annotate';
- }
-
- if (touchDevice) {
- toolInterface = allTools[toolInterfaceName].touch;
- } else {
- toolInterface = allTools[toolInterfaceName].mouse;
- }
-
- if (toolInterface.pointNearTool(element, data, coords)) {
- pointNearTool = true;
- nearbyTool.tool = data;
- nearbyTool.index = index;
- nearbyTool.toolType = toolType;
- }
- });
- });
-
- return pointNearTool ? nearbyTool : undefined;
- },
-
- getActiveTool(button) {
- if (!initialized) {
- toolManager.init();
- }
-
- // If activeTool is not defined, we should set as defaultTool
- if (!activeTool) {
- activeTool = defaultTool;
- }
-
- // If button is not defined, we should consider it left
- if (!button) {
- button = 'left';
- }
-
- return activeTool[button];
- },
-
- isTouchDevice() {
- return (('ontouchstart' in window) ||
- (navigator.MaxTouchPoints > 0) ||
- (navigator.msMaxTouchPoints > 0));
- }
-};
-
-export { toolManager };
diff --git a/src/lib/viewerMain/ui/index.js b/src/lib/viewerMain/ui/index.js
deleted file mode 100644
index f3163c8..0000000
--- a/src/lib/viewerMain/ui/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import renderViewer from './renderViewer';
-
-const ui = {
- renderViewer
-};
-
-export { ui };
diff --git a/src/lib/viewerMain/ui/renderDialogs.js b/src/lib/viewerMain/ui/renderDialogs.js
deleted file mode 100644
index 9a38cfd..0000000
--- a/src/lib/viewerMain/ui/renderDialogs.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import $ from 'jquery';
-import dialogPolyfill from 'dialog-polyfill';
-
-/**
- * Renders dialogs
- */
-export default function renderDialogs() {
- // Wait until all DOM is rendered
- setTimeout(() => {
- const dialogIds = [
- 'annotationDialog',
- 'relabelAnnotationDialog'
- ];
-
- dialogIds.forEach((id) => {
- const dialog = $(`#${id}`);
- dialogPolyfill.registerDialog(dialog.get(0));
- });
- }, 300);
-}
diff --git a/src/lib/viewerMain/ui/renderStudyBrowser.js b/src/lib/viewerMain/ui/renderStudyBrowser.js
deleted file mode 100644
index d53610f..0000000
--- a/src/lib/viewerMain/ui/renderStudyBrowser.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import $ from 'jquery';
-import _ from 'underscore';
-import { DCMViewer } from '../index';
-import StudyBrowser from '../../../components/templates/StudyBrowser.html';
-import '../../../external/jquery.slimscroll';
-
-// Enable scrollbar for study browser section when page is resized
-const handleStudyBrowserScrollbar = _.throttle(() => {
- const $studyBrowser = $('#studyBrowser');
- let parentHeight = $studyBrowser.height();
- parentHeight = `${parentHeight}px`;
-
- $('.scrollableStudyThumbnails').slimscroll({
- height: parentHeight,
- size: '14px',
- color: '#163239',
- alwaysVisible: true,
- distance: '5px',
- opacity: 1,
- allowPageScroll: false,
- disableFadeOut: false
- });
-
- // Add style to scrollbar when it is active
- const $slimScrollBar = $('.slimScrollBar');
- $slimScrollBar.on('mousedown', function () {
- $(this).addClass('slimScrollBarActive');
- });
-
- $(document).on('mouseup', () => {
- if (!$slimScrollBar.hasClass('slimScrollBarActive')) {
- return;
- }
-
- $slimScrollBar.removeClass('slimScrollBarActive');
- });
-}, 300);
-
-/**
- * Renders study browser with studies
- */
-export default function renderStudyBrowser() {
- const { studies } = DCMViewer.viewerbase.data;
- const $sidebarMenu = $('.sidebarMenu');
-
- // Add study index
- studies.forEach((study, studyIndex) => {
- study.studyIndex = studyIndex;
- });
-
- const templateContent = StudyBrowser({
- studies
- });
-
- $sidebarMenu.html(templateContent);
-
- // Show scrollbar if needed
- handleStudyBrowserScrollbar();
-
- $(window).on('resize', handleStudyBrowserScrollbar);
-}
diff --git a/src/lib/viewerMain/ui/renderToolbar.js b/src/lib/viewerMain/ui/renderToolbar.js
deleted file mode 100644
index 3a90262..0000000
--- a/src/lib/viewerMain/ui/renderToolbar.js
+++ /dev/null
@@ -1,80 +0,0 @@
-import $ from 'jquery';
-import { DCMViewer } from '../index';
-import { tools } from '../tools/';
-
-function toggleSeriesPanel() {
- const $toggleSeriesPanel = $('.toggleSeriesPanel');
- const $toggleSeriesPanelButton = $('.toggleSeriesPanelButton');
-
- $toggleSeriesPanel.click(() => {
- const $sidebarMenu = $('.sidebarMenu');
- const $mainContent = $('.mainContent');
-
- if ($sidebarMenu.hasClass('sidebar-open')) {
- $sidebarMenu.removeClass('sidebar-open');
- $toggleSeriesPanelButton.removeClass('active');
- $mainContent.addClass('content-full');
- } else {
- $sidebarMenu.addClass('sidebar-open');
- $toggleSeriesPanelButton.addClass('active');
- $mainContent.removeClass('content-full');
- }
-
- // Resize viewport
- setTimeout(() => {
- const viewportElement = $('.imageViewerViewport').get(0);
- window.ResizeViewportManager.resizeViewportElement(viewportElement);
- }, 300);
- });
-}
-
-/**
- * Renders toolbar and actions
- */
-export default function renderToolbar() {
- // Wait until all DOM is rendered
- setTimeout(() => {
- // Enable to toggle series panel
- toggleSeriesPanel();
-
- // Handle toolbar actions
- const commandsManager = tools.registerTools();
- tools.createToolbar(commandsManager);
-
- // Close viewer if close icon is clicked
- $('.js-close-viewer').click(() => {
- DCMViewer.ui.closeViewer();
- });
-
- // Expand toolbar
- const $moreTools = $('.js-more-tools');
- $moreTools.click(() => {
- const $toolbarSectionTools = $('.toolbarSectionTools');
- const className = 'expandedToolbar';
-
- if ($toolbarSectionTools.hasClass(className)) {
- $toolbarSectionTools.removeClass(className);
- } else {
- $toolbarSectionTools.addClass(className);
- }
-
- // Rotate arrow icon
- const $moreIcon = $moreTools.find('.svgContainer');
- const $moreText = $moreTools.find('span');
-
- if ($moreIcon.hasClass('rotate-180')) {
- $moreIcon.removeClass('rotate-180');
- $moreText.text(t('dicomviewer', 'More'));
- } else {
- $moreIcon.addClass('rotate-180');
- $moreText.text(t('dicomviewer', 'Less'));
- }
-
- // Resize viewport
- setTimeout(() => {
- const viewportElement = $('.imageViewerViewport').get(0);
- window.ResizeViewportManager.resizeViewportElement(viewportElement);
- }, 300);
- });
- }, 300);
-}
diff --git a/src/lib/viewerMain/ui/renderViewer.js b/src/lib/viewerMain/ui/renderViewer.js
deleted file mode 100644
index 83ab1d5..0000000
--- a/src/lib/viewerMain/ui/renderViewer.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import renderStudyBrowser from './renderStudyBrowser';
-import renderToolbar from './renderToolbar';
-import renderViewport from './renderViewport';
-import renderDialogs from './renderDialogs';
-
-/**
- * Renders toolbar and actions
- */
-export default function renderViewer() {
- renderStudyBrowser();
- renderToolbar();
- renderViewport();
- renderDialogs();
-}
diff --git a/src/lib/viewerMain/ui/renderViewport.js b/src/lib/viewerMain/ui/renderViewport.js
deleted file mode 100644
index f836b35..0000000
--- a/src/lib/viewerMain/ui/renderViewport.js
+++ /dev/null
@@ -1,449 +0,0 @@
-import $ from 'jquery';
-import _ from 'underscore';
-import { cornerstone, cornerstoneTools } from '../../cornerstonejs';
-import { DCMViewer } from '../index';
-import { Viewerbase } from '../../viewerbase';
-import { DCMViewerError } from '../../DCMViewerError';
-import { DCMViewerLog } from '../../DCMViewerLog';
-import ImageControls from '../../../components/templates/ImageControls.html';
-import ViewportOverlay from '../../../components/templates/ViewportOverlay.html';
-import ViewportOrientationMarkers from '../../../components/templates/ViewportOrientationMarkers.html';
-
-// Get compression information of image
-function getCompression() {
- const { element } = DCMViewer.instance.viewportData;
- const viewportIndex = DCMViewer.ui.$imageViewerViewport.index(element);
- const viewportData = DCMViewer.layoutManager.viewportData[viewportIndex];
-
- if (!viewportData.imageId) {
- return false;
- }
-
- const instance = cornerstone.metaData.get('instance', viewportData.imageId);
- if (!instance) {
- return '';
- }
-
- if (instance.lossyImageCompression === '01' &&
- instance.lossyImageCompressionRatio !== '') {
- const compressionMethod = instance.lossyImageCompressionMethod || t('dicomviewer', 'Lossy: ');
- const compressionRatio = parseFloat(instance.lossyImageCompressionRatio).toFixed(2);
- return `${compressionMethod}${compressionRatio} : 1`;
- }
-
- return t('dicomviewer', 'Lossless/Uncompressed');
-}
-
-// Update overlay information which shows study and series information briefly on viewport
-function updateOverlay() {
- const { element } = DCMViewer.instance.viewportData;
- const viewportIndex = DCMViewer.ui.$imageViewerViewport.index(element);
- const { viewportOverlayUtils } = DCMViewer.viewerbase;
- const viewportData = DCMViewer.layoutManager.viewportData[viewportIndex];
- const image = viewportOverlayUtils.getImage(viewportData.viewportIndex);
- const dimensions = image ? `${image.width} x ${image.height}` : '';
- const stack = DCMViewer.viewerbase.getStackDataIfNotEmpty(viewportIndex);
- const numImages = stack && stack.imageIds ? stack.imageIds.length : '';
-
- const $slider = $('.imageSlider');
- $slider.val(stack.currentImageIdIndex + 1);
-
- // Remove viewport overlay if exists
- $('.imageViewerViewportOverlay').remove();
-
- // Update overlay data
- const viewportOverlayContent = ViewportOverlay({
- patientName: viewportOverlayUtils.getPatient.call(viewportData, 'name'),
- patientId: viewportOverlayUtils.getPatient.call(viewportData, 'id'),
- studyDescription: viewportOverlayUtils.getStudy.call(viewportData, 'studyDescription'),
- studyDate: viewportOverlayUtils.getStudy.call(viewportData, 'studyDate'),
- studyTime: viewportOverlayUtils.getStudy.call(viewportData, 'studyTime'),
- seriesNumber: viewportOverlayUtils.getSeries.call(viewportData, 'seriesNumber'),
- instanceNumber: viewportOverlayUtils.getInstance.call(image, 'instanceNumber'),
- imageIndex: stack.currentImageIdIndex + 1,
- numImages,
- seriesDescription: viewportOverlayUtils.getSeries.call(viewportData, 'seriesDescription'),
- dimensions,
- compression: getCompression(),
- });
-
- $('.removable').append(viewportOverlayContent);
-}
-
-function loadDisplaySetIntoViewport() {
- DCMViewerLog.info('imageViewerViewport loadDisplaySetIntoViewport');
-
- const data = DCMViewer.instance.viewportData;
-
- // Make sure we have all the data required to render the series
- if (!data.study || !data.displaySet || !data.element) {
- DCMViewerLog.warn('loadDisplaySetIntoViewport: No Study, Display Set, or Element provided');
- return;
- }
-
- // Get the current element and it's index in the list of all viewports
- // The viewport index is often used to store information about a viewport element
- const { element } = data;
- const viewportIndex = DCMViewer.ui.$imageViewerViewport.index(element);
-
- const { layoutManager } = DCMViewer;
- layoutManager.viewportData = layoutManager.viewportData || {};
- layoutManager.viewportData[viewportIndex] = layoutManager.viewportData[viewportIndex] || {};
- layoutManager.viewportData[viewportIndex].viewportIndex = viewportIndex;
-
- // Create shortcut to displaySet
- const { displaySet } = data;
-
- // Get stack from Stack Manager
- let stack = Viewerbase.StackManager.findOrCreateStack(data.study, displaySet);
-
- // Shortcut for array with image IDs
- const { imageIds } = stack;
- const imageIdIndex = data.currentImageIdIndex;
-
- // Define the current image stack using the newly created image IDs
- stack = {
- currentImageIdIndex: imageIdIndex > 0 && imageIdIndex < imageIds.length ? imageIdIndex : 0,
- imageIds,
- displaySetInstanceUid: data.displaySetInstanceUid
- };
-
- // Get the current image ID for the stack that will be rendered
- const imageId = imageIds[stack.currentImageIdIndex];
-
- cornerstone.enable(data.element);
-
- // Get the handler functions that will run when loading has finished or thrown
- // an error. These are used to show/hide loading / error text boxes on each viewport.
- const errorLoadingHandler = cornerstoneTools.loadHandlerManager.getErrorLoadingHandler();
-
- // Get the current viewport settings
- const viewport = cornerstone.getViewport(element);
-
- const {
- studyInstanceUid, seriesInstanceUid, displaySetInstanceUid, currentImageIdIndex
- } = data;
-
- // Store the current series data inside the Layout Manager
- layoutManager.viewportData[viewportIndex] = {
- imageId,
- studyInstanceUid,
- seriesInstanceUid,
- displaySetInstanceUid,
- currentImageIdIndex,
- viewport: viewport || data.viewport,
- viewportIndex
- };
-
- // TODO
- // Update layoutManager of viewer
- // DCMViewer.instance.layoutManager = layoutManager;
-
- let imagePromise;
- try {
- imagePromise = cornerstone.loadAndCacheImage(imageId);
- } catch (error) {
- DCMViewerLog.info(error);
- if (!imagePromise) {
- errorLoadingHandler(element, imageId, error);
- return;
- }
- }
-
- // Start loading the image.
- imagePromise.then((image) => {
- let enabledElement;
- try {
- enabledElement = cornerstone.getEnabledElement(element);
- } catch (error) {
- DCMViewerLog.warn('Viewport destroyed before loaded image could be displayed');
- return;
- }
-
- // Update metadata from image dataset
- DCMViewer.viewer.metadataProvider.updateMetadata(image);
-
- // Enable mouse interactions
- cornerstoneTools.mouseInput.enable(element);
- cornerstoneTools.touchInput.enable(element);
- cornerstoneTools.mouseWheelInput.enable(element);
- cornerstoneTools.keyboardInput.enable(element);
-
- // Update the enabled element with the image and viewport data
- // This is not usually necessary, but we need them stored in case
- // a sopClassUid-specific viewport setting is present.
- enabledElement.image = image;
- enabledElement.viewport = cornerstone.getDefaultViewport(enabledElement.canvas, image);
-
- // Display image on viewport
- cornerstone.displayImage(element, image, enabledElement.viewport);
-
- // Display orientation markers
- DCMViewer.viewerbase.updateOrientationMarkers(element, enabledElement.viewport);
-
- // Resize the canvas to fit the current viewport element size. Fit the displayed
- // image to the canvas dimensions.
- cornerstone.resize(element, true);
-
- // Use the tool manager to enable the currently active tool for this
- // newly rendered element
- const activeTool = DCMViewer.tools.toolManager.getActiveTool();
- DCMViewer.tools.toolManager.setActiveTool(activeTool, [element]);
-
- // Set the stack as tool state
- cornerstoneTools.addStackStateManager(element, ['stack', 'playClip']);
- cornerstoneTools.addToolState(element, 'stack', stack);
-
- // Enable all tools we want to use with this element
- cornerstoneTools.stackScrollWheel.activate(element);
-
- // Update overlay information
- updateOverlay();
-
- // Handle changes if a new image is displayed
- element.addEventListener('cornerstonenewimage', (event) => {
- const eventData = event.detail;
- const currentImage = eventData.enabledElement.image;
-
- // Update metadata from image dataset
- DCMViewer.viewer.metadataProvider.updateMetadata(currentImage);
-
- layoutManager.viewportData[viewportIndex].imageId = currentImage.imageId;
-
- // Get the element and stack data
- const targetElement = event.target;
- const toolData = cornerstoneTools.getToolState(targetElement, 'stack');
- if (!toolData || !toolData.data || !toolData.data.length) {
- return;
- }
-
- // Update overlay information
- updateOverlay();
-
- // Display orientation markers
- DCMViewer.viewerbase.updateOrientationMarkers(targetElement);
-
- // If this viewport is displaying a stack of images, save the current image
- // index in the stack to the global DCMViewer.viewer.data object.
- const stackState = cornerstoneTools.getToolState(targetElement, 'stack');
- if (stackState && stackState.data.length && stackState.data[0].imageIds.length > 1) {
- layoutManager.viewportData[viewportIndex].currentImageIdIndex = stackState.data[0].imageIds.indexOf(currentImage.imageId);
- }
- });
-
- // Handle changes on each image rendering
- element.addEventListener('cornerstoneimagerendered', (e) => {
- // Update overlay information
- updateOverlay();
-
- const viewportVal = cornerstone.getViewport(e.target);
- const $zoomLevel = $('#zoomLevel');
- const $windowLevel = $('#windowLevel');
-
- $zoomLevel.text(`${t('dicomviewer', 'Zoom')}: ${viewportVal.scale.toFixed(2)}`);
- $windowLevel.text(`${t('dicomviewer', 'WW/WC')}: ${Math.round(viewportVal.voi.windowWidth)} / ${Math.round(viewportVal.voi.windowCenter)}`);
- });
- });
-}
-
-function setImageControlButton($element) {
- $element.on('touchstart', function () {
- if ($(this).hasClass('imageControlButtonActive')) {
- return;
- }
-
- $(this).addClass('imageControlButtonActive');
- });
-
- $element.on('touchend', function () {
- if (!$(this).hasClass('imageControlButtonActive')) {
- return;
- }
-
- $(this).removeClass('imageControlButtonActive');
- });
-
- $element.on('mouseenter', function () {
- if ($(this).hasClass('imageControlButtonActive')) {
- return;
- }
-
- $(this).addClass('imageControlButtonActive');
- });
-
- $element.on('mouseleave', function () {
- if (!$(this).hasClass('imageControlButtonActive')) {
- return;
- }
-
- $(this).removeClass('imageControlButtonActive');
- });
-}
-
-function renderImageControls() {
- const data = DCMViewer.instance.viewportData;
- const numImages = data.displaySet.images.length;
- const imageIndex = 1;
-
- const imageControlsContent = ImageControls({ imageIndex, numImages });
- $('#imageControls').html(imageControlsContent);
-
- // Set size of scrollbar
- setTimeout(() => {
- const $slider = $('.imageSlider');
- const $imageControlUp = $('.imageControlUp');
- const $imageControlDown = $('.imageControlDown');
- const $element = DCMViewer.ui.$imageViewerViewport;
- const element = $element.get(0);
-
- // Change the instance when scrollbar is changed
- $slider.on('input change', () => {
- const newImageIdIndex = parseInt($slider.val(), 10) - 1;
- cornerstoneTools.scrollToIndex(element, newImageIdIndex);
- });
-
- // Change image slider's value with image control buttons
- $imageControlUp.on('click', (e) => {
- e.stopImmediatePropagation();
-
- let currentSliderVal = parseInt($slider.val(), 10);
- if (currentSliderVal === 0) {
- return;
- }
-
- currentSliderVal -= 1;
-
- $slider.val(currentSliderVal);
- $slider.trigger('change');
- });
-
- // Change image slider's value with image control buttons
- $imageControlDown.on('click', (e) => {
- e.stopImmediatePropagation();
-
- let currentSliderVal = parseInt($slider.val(), 10);
- let maxValue = $slider.attr('max');
- maxValue = parseInt(maxValue, 10);
- if (currentSliderVal === maxValue) {
- return;
- }
-
- currentSliderVal += 1;
-
- $slider.val(currentSliderVal);
- $slider.trigger('change');
- });
-
- setImageControlButton($imageControlUp);
- setImageControlButton($imageControlDown);
-
- const handleResize = _.throttle(() => {
- const viewportHeight = $element.height();
- $slider.width(viewportHeight - 120);
- }, 150);
-
- handleResize();
-
- $(window).on('resize', handleResize);
- }, 300);
-}
-
-/**
- * Render layout
- * @param viewportData
- */
-const renderLayout = (viewportData) => {
- const { studies } = DCMViewer.viewerbase.data;
- const study = studies.find(entry => entry.studyInstanceUid === viewportData.studyInstanceUid);
-
- if (!study) {
- DCMViewerError('Study does not exist');
- }
-
- viewportData.study = study;
-
- if (!study.displaySets) {
- DCMViewerError('Study has no display sets');
- }
-
- study.displaySets.every((displaySet) => {
- if (displaySet.displaySetInstanceUid === viewportData.displaySetInstanceUid) {
- viewportData.displaySet = displaySet;
- return false;
- }
-
- return true;
- });
-
- const $imageViewerViewport = $('.imageViewerViewport');
- viewportData.element = $imageViewerViewport.get(0);
- DCMViewer.ui.$imageViewerViewport = $imageViewerViewport;
- DCMViewer.instance.viewportData = viewportData;
-
- // Update dicom image container attributes to disallow manipulating viewer
- $imageViewerViewport.on('contextmenu', () => false);
- $imageViewerViewport.on('mousedown', () => false);
- $imageViewerViewport.on('selectstart', () => false);
-
- // Render orientation markers template before displaying image
- $('#viewportOrientationMarkers').html(ViewportOrientationMarkers);
-
- // Load and display image
- loadDisplaySetIntoViewport();
-
- // Render image controls
- renderImageControls();
-};
-
-function jumpToImage(viewportIndex, studyInstanceUid, seriesInstanceUid, sopInstanceUid) {
- const study = DCMViewer.viewer.Studies.find(s => s.studyInstanceUid === studyInstanceUid);
-
- // Find the proper stack to display
- const stacksFromSeries = study.displaySets.filter(stack => stack.seriesInstanceUid === seriesInstanceUid);
- const stack = stacksFromSeries.find((s) => {
- const imageIndex = s.images.findIndex(image => image.getSOPInstanceUID() === sopInstanceUid);
- return imageIndex > -1;
- });
-
- // TODO: make this work for multi-frame instances
- const specificImageIndex = stack.images.findIndex(image => image.getSOPInstanceUID() === sopInstanceUid);
-
- const viewportData = {
- studyInstanceUid,
- seriesInstanceUid,
- displaySetInstanceUid: stack.displaySetInstanceUid,
- displaySet: stack,
- currentImageIdIndex: specificImageIndex
- };
-
- DCMViewer.layoutManager.rerenderViewportWithNewDisplaySet(viewportIndex, viewportData);
-}
-
-/**
- * Render viewport
- */
-export default function renderViewport() {
- if (!DCMViewer.instance) {
- DCMViewer.instance = {};
- }
-
- const { studies, imageToJump } = DCMViewer.viewerbase.data;
- DCMViewer.instance.parentElement = $('#layoutManagerTarget');
-
- const studyPrefetcher = DCMViewer.viewerbase.StudyPrefetcher.getInstance();
- DCMViewer.instance.studyPrefetcher = studyPrefetcher;
-
- DCMViewer.instance.studyLoadingListener = DCMViewer.viewerbase.StudyLoadingListener.getInstance();
- DCMViewer.instance.studyLoadingListener.clear();
- DCMViewer.instance.studyLoadingListener.addStudies(studies);
-
- DCMViewer.layoutManager = new DCMViewer.viewerbase.LayoutManager(DCMViewer.instance.parentElement, studies, renderLayout);
- DCMViewer.layoutManager.updateViewports();
-
- if (imageToJump) {
- const { studyInstanceUid, seriesInstanceUid, sopInstanceUid } = imageToJump;
- jumpToImage(0, studyInstanceUid, seriesInstanceUid, sopInstanceUid);
- }
-
- studyPrefetcher.setStudies(studies);
-}
diff --git a/src/lib/viewerMain/viewerbase/index.js b/src/lib/viewerMain/viewerbase/index.js
deleted file mode 100644
index 8f1bfc7..0000000
--- a/src/lib/viewerMain/viewerbase/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Viewerbase } from '../../viewerbase/index';
-
-import setDisplaySets from './setDisplaySets';
-
-const viewerbase = {
- data: {
- loadedSeriesData: {}
- },
- instance: {},
- loadedSeriesData: {},
- getStackDataIfNotEmpty: Viewerbase.getStackDataIfNotEmpty,
- setDisplaySets,
- viewportOverlayUtils: Viewerbase.viewportOverlayUtils,
- sortingManager: Viewerbase.sortingManager,
- updateOrientationMarkers: Viewerbase.updateOrientationMarkers,
- viewportUtils: Viewerbase.viewportUtils,
- StudyPrefetcher: Viewerbase.StudyPrefetcher,
- StudyLoadingListener: Viewerbase.StudyLoadingListener,
- LayoutManager: Viewerbase.LayoutManager,
- ResizeViewportManager: Viewerbase.ResizeViewportManager
-};
-
-export default viewerbase;
diff --git a/src/lib/viewerMain/viewerbase/setDisplaySets.js b/src/lib/viewerMain/viewerbase/setDisplaySets.js
deleted file mode 100644
index 283d1d5..0000000
--- a/src/lib/viewerMain/viewerbase/setDisplaySets.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import { StudyMetadata } from '../../viewerbase/classes/metadata/viewerMain/StudyMetadata';
-import { Viewerbase } from '../../viewerbase/index';
-
-export default function setDisplaySets(studies) {
- studies.forEach((study) => {
- const studyMetadata = new StudyMetadata(study, study.studyInstanceUid);
- let { displaySets } = study;
-
- if (!study.displaySets) {
- displaySets = Viewerbase.sortingManager.getDisplaySets(studyMetadata);
- study.displaySets = displaySets;
- }
- });
-}
diff --git a/src/lib/viewerbase/DICOMTagDescriptions.js b/src/lib/viewerbase/DICOMTagDescriptions.js
deleted file mode 100644
index 60d814e..0000000
--- a/src/lib/viewerbase/DICOMTagDescriptions.js
+++ /dev/null
@@ -1,3261 +0,0 @@
-
-const NUMBER = 'number';
-const STRING = 'string';
-const REGEX_TAG = /^x[0-9a-fx]{8}$/;
-
-const DICOMTagDescriptions = Object.create(Object.prototype, {
- _descriptions: {
- configurable: false,
- enumerable: false,
- writable: false,
- value: Object.create(null)
- },
- tagNumberToString: {
- configurable: false,
- enumerable: true,
- writable: false,
- value: function tagNumberToString(tag) {
- let string; // by default, undefined is returned...
- if (this.isValidTagNumber(tag)) {
- // if it's a number, build its hexadecimal representation...
- string = `x${(`00000000${tag.toString(16)}`).substr(-8)}`;
- }
- return string;
- }
- },
- isValidTagNumber: {
- configurable: false,
- enumerable: true,
- writable: false,
- value: function isValidTagNumber(tag) {
- return (typeof tag === NUMBER && tag >= 0 && tag <= 0xFFFFFFFF);
- }
- },
- isValidTag: {
- configurable: false,
- enumerable: true,
- writable: false,
- value: function isValidTag(tag) {
- return (typeof tag === STRING ? REGEX_TAG.test(tag) : this.isValidTagNumber(tag));
- }
- },
- find: {
- configurable: false,
- enumerable: true,
- writable: false,
- value: function find(name) {
- let description; // by default, undefined is returned...
- if (typeof name !== STRING) {
- // if it's a number, a tag string will be returned...
- name = this.tagNumberToString(name);
- }
- if (typeof name === STRING) {
- description = this._descriptions[name];
- }
- return description;
- }
- },
- init: {
- configurable: false,
- enumerable: true,
- writable: false,
- value: function init(descriptionMap) {
- const { _descriptions } = this;
- const tags = Object.keys(descriptionMap);
- for (let i = 0; i < tags.length; i++) {
- const tag = tags[i];
-
- if (!this.isValidTag(tag)) {
- // Skip in case tag is not valid...
- console.info(`DICOMTagDescriptions: Invalid tag "${tag}"...`);
- continue;
- }
- if (tag in _descriptions) {
- // Skip in case the tag is duplicated...
- console.info(`DICOMTagDescriptions: Duplicated tag "${tag}"...`);
- continue;
- }
- // Save keyword...
- const keyword = descriptionMap[tag];
- // Create a description entry and freeze it...
- const entry = Object.create(null);
- entry.tag = tag;
- entry.keyword = keyword;
- Object.freeze(entry);
- // Add tag references to entry...
- _descriptions[tag] = entry;
- // Add keyword references to entry (if not present already)...
- if (keyword in _descriptions) {
- const currentEntry = _descriptions[keyword];
- console.info(`DICOMTagDescriptions: Using <${currentEntry.tag},${currentEntry.keyword}> instead of <${entry.tag},${entry.keyword}> for keyword "${keyword}"...`);
- } else {
- _descriptions[keyword] = entry;
- }
- }
-
- // Freeze internal description map...
- Object.freeze(_descriptions);
- // Freeze itself...
- Object.freeze(this);
- }
- },
-});
-
-/**
- * Map with DICOM Tag Descriptions
- */
-let initialTagDescriptionMap = {
- x00020000: 'FileMetaInfoGroupLength',
- x00020001: 'FileMetaInfoVersion',
- x00020002: 'MediaStorageSOPClassUID',
- x00020003: 'MediaStorageSOPInstanceUID',
- x00020010: 'TransferSyntaxUID',
- x00020012: 'ImplementationClassUID',
- x00020013: 'ImplementationVersionName',
- x00020016: 'SourceApplicationEntityTitle',
- x00020100: 'PrivateInformationCreatorUID',
- x00020102: 'PrivateInformation',
- x00041130: 'FileSetID',
- x00041141: 'FileSetDescriptorFileID',
- x00041142: 'SpecificCharacterSetOfFile',
- x00041200: 'FirstDirectoryRecordOffset',
- x00041202: 'LastDirectoryRecordOffset',
- x00041212: 'FileSetConsistencyFlag',
- x00041220: 'DirectoryRecordSequence',
- x00041400: 'OffsetOfNextDirectoryRecord',
- x00041410: 'RecordInUseFlag',
- x00041420: 'LowerLevelDirectoryEntityOffset',
- x00041430: 'DirectoryRecordType',
- x00041432: 'PrivateRecordUID',
- x00041500: 'ReferencedFileID',
- x00041504: 'MRDRDirectoryRecordOffset',
- x00041510: 'ReferencedSOPClassUIDInFile',
- x00041511: 'ReferencedSOPInstanceUIDInFile',
- x00041512: 'ReferencedTransferSyntaxUIDInFile',
- x0004151a: 'ReferencedRelatedSOPClassUIDInFile',
- x00041600: 'NumberOfReferences',
- x00080000: 'IdentifyingGroupLength',
- x00080001: 'LengthToEnd',
- x00080005: 'SpecificCharacterSet',
- x00080006: 'LanguageCodeSequence',
- x00080008: 'ImageType',
- x00080010: 'RecognitionCode',
- x00080012: 'InstanceCreationDate',
- x00080013: 'InstanceCreationTime',
- x00080014: 'InstanceCreatorUID',
- x00080016: 'SOPClassUID',
- x00080018: 'SOPInstanceUID',
- x0008001a: 'RelatedGeneralSOPClassUID',
- x0008001b: 'OriginalSpecializedSOPClassUID',
- x00080020: 'StudyDate',
- x00080021: 'SeriesDate',
- x00080022: 'AcquisitionDate',
- x00080023: 'ContentDate',
- x00080024: 'OverlayDate',
- x00080025: 'CurveDate',
- x0008002a: 'AcquisitionDateTime',
- x00080030: 'StudyTime',
- x00080031: 'SeriesTime',
- x00080032: 'AcquisitionTime',
- x00080033: 'ContentTime',
- x00080034: 'OverlayTime',
- x00080035: 'CurveTime',
- x00080040: 'DataSetType',
- x00080041: 'DataSetSubtype',
- x00080042: 'NuclearMedicineSeriesType',
- x00080050: 'AccessionNumber',
- x00080052: 'QueryRetrieveLevel',
- x00080054: 'RetrieveAETitle',
- x00080056: 'InstanceAvailability',
- x00080058: 'FailedSOPInstanceUIDList',
- x00080060: 'Modality',
- x00080061: 'ModalitiesInStudy',
- x00080062: 'SOPClassesInStudy',
- x00080064: 'ConversionType',
- x00080068: 'PresentationIntentType',
- x00080070: 'Manufacturer',
- x00080080: 'InstitutionName',
- x00080081: 'InstitutionAddress',
- x00080082: 'InstitutionCodeSequence',
- x00080090: 'ReferringPhysicianName',
- x00080092: 'ReferringPhysicianAddress',
- x00080094: 'ReferringPhysicianTelephoneNumber',
- x00080096: 'ReferringPhysicianIDSequence',
- x00080100: 'CodeValue',
- x00080102: 'CodingSchemeDesignator',
- x00080103: 'CodingSchemeVersion',
- x00080104: 'CodeMeaning',
- x00080105: 'MappingResource',
- x00080106: 'ContextGroupVersion',
- x00080107: 'ContextGroupLocalVersion',
- x0008010b: 'ContextGroupExtensionFlag',
- x0008010c: 'CodingSchemeUID',
- x0008010d: 'ContextGroupExtensionCreatorUID',
- x0008010f: 'ContextIdentifier',
- x00080110: 'CodingSchemeIDSequence',
- x00080112: 'CodingSchemeRegistry',
- x00080114: 'CodingSchemeExternalID',
- x00080115: 'CodingSchemeName',
- x00080116: 'CodingSchemeResponsibleOrganization',
- x00080117: 'ContextUID',
- x00080201: 'TimezoneOffsetFromUTC',
- x00081000: 'NetworkID',
- x00081010: 'StationName',
- x00081030: 'StudyDescription',
- x00081032: 'ProcedureCodeSequence',
- x0008103e: 'SeriesDescription',
- x00081040: 'InstitutionalDepartmentName',
- x00081048: 'PhysiciansOfRecord',
- x00081049: 'PhysiciansOfRecordIDSequence',
- x00081050: 'PerformingPhysicianName',
- x00081052: 'PerformingPhysicianIDSequence',
- x00081060: 'NameOfPhysicianReadingStudy',
- x00081062: 'PhysicianReadingStudyIDSequence',
- x00081070: 'OperatorsName',
- x00081072: 'OperatorIDSequence',
- x00081080: 'AdmittingDiagnosesDescription',
- x00081084: 'AdmittingDiagnosesCodeSequence',
- x00081090: 'ManufacturersModelName',
- x00081100: 'ReferencedResultsSequence',
- x00081110: 'ReferencedStudySequence',
- x00081111: 'ReferencedPerformedProcedureStepSequence',
- x00081115: 'ReferencedSeriesSequence',
- x00081120: 'ReferencedPatientSequence',
- x00081125: 'ReferencedVisitSequence',
- x00081130: 'ReferencedOverlaySequence',
- x0008113a: 'ReferencedWaveformSequence',
- x00081140: 'ReferencedImageSequence',
- x00081145: 'ReferencedCurveSequence',
- x0008114a: 'ReferencedInstanceSequence',
- x00081150: 'ReferencedSOPClassUID',
- x00081155: 'ReferencedSOPInstanceUID',
- x0008115a: 'SOPClassesSupported',
- x00081160: 'ReferencedFrameNumber',
- x00081161: 'SimpleFrameList',
- x00081162: 'CalculatedFrameList',
- x00081163: 'TimeRange',
- x00081164: 'FrameExtractionSequence',
- x00081195: 'TransactionUID',
- x00081197: 'FailureReason',
- x00081198: 'FailedSOPSequence',
- x00081199: 'ReferencedSOPSequence',
- x00081200: 'OtherReferencedStudiesSequence',
- x00081250: 'RelatedSeriesSequence',
- x00082110: 'LossyImageCompressionRetired',
- x00082111: 'DerivationDescription',
- x00082112: 'SourceImageSequence',
- x00082120: 'StageName',
- x00082122: 'StageNumber',
- x00082124: 'NumberOfStages',
- x00082127: 'ViewName',
- x00082128: 'ViewNumber',
- x00082129: 'NumberOfEventTimers',
- x0008212a: 'NumberOfViewsInStage',
- x00082130: 'EventElapsedTimes',
- x00082132: 'EventTimerNames',
- x00082133: 'EventTimerSequence',
- x00082134: 'EventTimeOffset',
- x00082135: 'EventCodeSequence',
- x00082142: 'StartTrim',
- x00082143: 'StopTrim',
- x00082144: 'RecommendedDisplayFrameRate',
- x00082200: 'TransducerPosition',
- x00082204: 'TransducerOrientation',
- x00082208: 'AnatomicStructure',
- x00082218: 'AnatomicRegionSequence',
- x00082220: 'AnatomicRegionModifierSequence',
- x00082228: 'PrimaryAnatomicStructureSequence',
- x00082229: 'AnatomicStructureOrRegionSequence',
- x00082230: 'AnatomicStructureModifierSequence',
- x00082240: 'TransducerPositionSequence',
- x00082242: 'TransducerPositionModifierSequence',
- x00082244: 'TransducerOrientationSequence',
- x00082246: 'TransducerOrientationModifierSeq',
- x00082253: 'AnatomicEntrancePortalCodeSeqTrial',
- x00082255: 'AnatomicApproachDirCodeSeqTrial',
- x00082256: 'AnatomicPerspectiveDescrTrial',
- x00082257: 'AnatomicPerspectiveCodeSeqTrial',
- x00083001: 'AlternateRepresentationSequence',
- x00083010: 'IrradiationEventUID',
- x00084000: 'IdentifyingComments',
- x00089007: 'FrameType',
- x00089092: 'ReferencedImageEvidenceSequence',
- x00089121: 'ReferencedRawDataSequence',
- x00089123: 'CreatorVersionUID',
- x00089124: 'DerivationImageSequence',
- x00089154: 'SourceImageEvidenceSequence',
- x00089205: 'PixelPresentation',
- x00089206: 'VolumetricProperties',
- x00089207: 'VolumeBasedCalculationTechnique',
- x00089208: 'ComplexImageComponent',
- x00089209: 'AcquisitionContrast',
- x00089215: 'DerivationCodeSequence',
- x00089237: 'GrayscalePresentationStateSequence',
- x00089410: 'ReferencedOtherPlaneSequence',
- x00089458: 'FrameDisplaySequence',
- x00089459: 'RecommendedDisplayFrameRateInFloat',
- x00089460: 'SkipFrameRangeFlag',
- // x00091001: 'FullFidelity',
- // x00091002: 'SuiteID',
- // x00091004: 'ProductID',
- // x00091027: 'ImageActualDate',
- // x00091030: 'ServiceID',
- // x00091031: 'MobileLocationNumber',
- // x000910e3: 'EquipmentUID',
- // x000910e6: 'GenesisVersionNow',
- // x000910e7: 'ExamRecordChecksum',
- // x000910e9: 'ActualSeriesDataTimeStamp',
- x00100000: 'PatientGroupLength',
- x00100010: 'PatientName',
- x00100020: 'PatientID',
- x00100021: 'IssuerOfPatientID',
- x00100022: 'TypeOfPatientID',
- x00100030: 'PatientBirthDate',
- x00100032: 'PatientBirthTime',
- x00100040: 'PatientSex',
- x00100050: 'PatientInsurancePlanCodeSequence',
- x00100101: 'PatientPrimaryLanguageCodeSeq',
- x00100102: 'PatientPrimaryLanguageCodeModSeq',
- x00101000: 'OtherPatientIDs',
- x00101001: 'OtherPatientNames',
- x00101002: 'OtherPatientIDsSequence',
- x00101005: 'PatientBirthName',
- x00101010: 'PatientAge',
- x00101020: 'PatientSize',
- x00101030: 'PatientWeight',
- x00101040: 'PatientAddress',
- x00101050: 'InsurancePlanIdentification',
- x00101060: 'PatientMotherBirthName',
- x00101080: 'MilitaryRank',
- x00101081: 'BranchOfService',
- x00101090: 'MedicalRecordLocator',
- x00102000: 'MedicalAlerts',
- x00102110: 'Allergies',
- x00102150: 'CountryOfResidence',
- x00102152: 'RegionOfResidence',
- x00102154: 'PatientTelephoneNumbers',
- x00102160: 'EthnicGroup',
- x00102180: 'Occupation',
- x001021a0: 'SmokingStatus',
- x001021b0: 'AdditionalPatientHistory',
- x001021c0: 'PregnancyStatus',
- x001021d0: 'LastMenstrualDate',
- x001021f0: 'PatientReligiousPreference',
- x00102201: 'PatientSpeciesDescription',
- x00102202: 'PatientSpeciesCodeSequence',
- x00102203: 'PatientSexNeutered',
- x00102210: 'AnatomicalOrientationType',
- x00102292: 'PatientBreedDescription',
- x00102293: 'PatientBreedCodeSequence',
- x00102294: 'BreedRegistrationSequence',
- x00102295: 'BreedRegistrationNumber',
- x00102296: 'BreedRegistryCodeSequence',
- x00102297: 'ResponsiblePerson',
- x00102298: 'ResponsiblePersonRole',
- x00102299: 'ResponsibleOrganization',
- x00104000: 'PatientComments',
- x00109431: 'ExaminedBodyThickness',
- x00111010: 'PatientStatus',
- x00120010: 'ClinicalTrialSponsorName',
- x00120020: 'ClinicalTrialProtocolID',
- x00120021: 'ClinicalTrialProtocolName',
- x00120030: 'ClinicalTrialSiteID',
- x00120031: 'ClinicalTrialSiteName',
- x00120040: 'ClinicalTrialSubjectID',
- x00120042: 'ClinicalTrialSubjectReadingID',
- x00120050: 'ClinicalTrialTimePointID',
- x00120051: 'ClinicalTrialTimePointDescription',
- x00120060: 'ClinicalTrialCoordinatingCenter',
- x00120062: 'PatientIdentityRemoved',
- x00120063: 'DeidentificationMethod',
- x00120064: 'DeidentificationMethodCodeSequence',
- x00120071: 'ClinicalTrialSeriesID',
- x00120072: 'ClinicalTrialSeriesDescription',
- x00120084: 'DistributionType',
- x00120085: 'ConsentForDistributionFlag',
- x00180000: 'AcquisitionGroupLength',
- x00180010: 'ContrastBolusAgent',
- x00180012: 'ContrastBolusAgentSequence',
- x00180014: 'ContrastBolusAdministrationRoute',
- x00180015: 'BodyPartExamined',
- x00180020: 'ScanningSequence',
- x00180021: 'SequenceVariant',
- x00180022: 'ScanOptions',
- x00180023: 'MRAcquisitionType',
- x00180024: 'SequenceName',
- x00180025: 'AngioFlag',
- x00180026: 'InterventionDrugInformationSeq',
- x00180027: 'InterventionDrugStopTime',
- x00180028: 'InterventionDrugDose',
- x00180029: 'InterventionDrugSequence',
- x0018002a: 'AdditionalDrugSequence',
- x00180030: 'Radionuclide',
- x00180031: 'Radiopharmaceutical',
- x00180032: 'EnergyWindowCenterline',
- x00180033: 'EnergyWindowTotalWidth',
- x00180034: 'InterventionDrugName',
- x00180035: 'InterventionDrugStartTime',
- x00180036: 'InterventionSequence',
- x00180037: 'TherapyType',
- x00180038: 'InterventionStatus',
- x00180039: 'TherapyDescription',
- x0018003a: 'InterventionDescription',
- x00180040: 'CineRate',
- x00180042: 'InitialCineRunState',
- x00180050: 'SliceThickness',
- x00180060: 'KVP',
- x00180070: 'CountsAccumulated',
- x00180071: 'AcquisitionTerminationCondition',
- x00180072: 'EffectiveDuration',
- x00180073: 'AcquisitionStartCondition',
- x00180074: 'AcquisitionStartConditionData',
- x00180075: 'AcquisitionEndConditionData',
- x00180080: 'RepetitionTime',
- x00180081: 'EchoTime',
- x00180082: 'InversionTime',
- x00180083: 'NumberOfAverages',
- x00180084: 'ImagingFrequency',
- x00180085: 'ImagedNucleus',
- x00180086: 'EchoNumber',
- x00180087: 'MagneticFieldStrength',
- x00180088: 'SpacingBetweenSlices',
- x00180089: 'NumberOfPhaseEncodingSteps',
- x00180090: 'DataCollectionDiameter',
- x00180091: 'EchoTrainLength',
- x00180093: 'PercentSampling',
- x00180094: 'PercentPhaseFieldOfView',
- x00180095: 'PixelBandwidth',
- x00181000: 'DeviceSerialNumber',
- x00181002: 'DeviceUID',
- x00181003: 'DeviceID',
- x00181004: 'PlateID',
- x00181005: 'GeneratorID',
- x00181006: 'GridID',
- x00181007: 'CassetteID',
- x00181008: 'GantryID',
- x00181010: 'SecondaryCaptureDeviceID',
- x00181011: 'HardcopyCreationDeviceID',
- x00181012: 'DateOfSecondaryCapture',
- x00181014: 'TimeOfSecondaryCapture',
- x00181016: 'SecondaryCaptureDeviceManufacturer',
- x00181017: 'HardcopyDeviceManufacturer',
- x00181018: 'SecondaryCaptureDeviceModelName',
- x00181019: 'SecondaryCaptureDeviceSoftwareVers',
- x0018101a: 'HardcopyDeviceSoftwareVersion',
- x0018101b: 'HardcopyDeviceModelName',
- x00181020: 'SoftwareVersion',
- x00181022: 'VideoImageFormatAcquired',
- x00181023: 'DigitalImageFormatAcquired',
- x00181030: 'ProtocolName',
- x00181040: 'ContrastBolusRoute',
- x00181041: 'ContrastBolusVolume',
- x00181042: 'ContrastBolusStartTime',
- x00181043: 'ContrastBolusStopTime',
- x00181044: 'ContrastBolusTotalDose',
- x00181045: 'SyringeCounts',
- x00181046: 'ContrastFlowRate',
- x00181047: 'ContrastFlowDuration',
- x00181048: 'ContrastBolusIngredient',
- x00181049: 'ContrastBolusConcentration',
- x00181050: 'SpatialResolution',
- x00181060: 'TriggerTime',
- x00181061: 'TriggerSourceOrType',
- x00181062: 'NominalInterval',
- x00181063: 'FrameTime',
- x00181064: 'CardiacFramingType',
- x00181065: 'FrameTimeVector',
- x00181066: 'FrameDelay',
- x00181067: 'ImageTriggerDelay',
- x00181068: 'MultiplexGroupTimeOffset',
- x00181069: 'TriggerTimeOffset',
- x0018106a: 'SynchronizationTrigger',
- x0018106c: 'SynchronizationChannel',
- x0018106e: 'TriggerSamplePosition',
- x00181070: 'RadiopharmaceuticalRoute',
- x00181071: 'RadiopharmaceuticalVolume',
- x00181072: 'RadiopharmaceuticalStartTime',
- x00181073: 'RadiopharmaceuticalStopTime',
- x00181074: 'RadionuclideTotalDose',
- x00181075: 'RadionuclideHalfLife',
- x00181076: 'RadionuclidePositronFraction',
- x00181077: 'RadiopharmaceuticalSpecActivity',
- x00181078: 'RadiopharmaceuticalStartDateTime',
- x00181079: 'RadiopharmaceuticalStopDateTime',
- x00181080: 'BeatRejectionFlag',
- x00181081: 'LowRRValue',
- x00181082: 'HighRRValue',
- x00181083: 'IntervalsAcquired',
- x00181084: 'IntervalsRejected',
- x00181085: 'PVCRejection',
- x00181086: 'SkipBeats',
- x00181088: 'HeartRate',
- x00181090: 'CardiacNumberOfImages',
- x00181094: 'TriggerWindow',
- x00181100: 'ReconstructionDiameter',
- x00181110: 'DistanceSourceToDetector',
- x00181111: 'DistanceSourceToPatient',
- x00181114: 'EstimatedRadiographicMagnification',
- x00181120: 'GantryDetectorTilt',
- x00181121: 'GantryDetectorSlew',
- x00181130: 'TableHeight',
- x00181131: 'TableTraverse',
- x00181134: 'TableMotion',
- x00181135: 'TableVerticalIncrement',
- x00181136: 'TableLateralIncrement',
- x00181137: 'TableLongitudinalIncrement',
- x00181138: 'TableAngle',
- x0018113a: 'TableType',
- x00181140: 'RotationDirection',
- x00181141: 'AngularPosition',
- x00181142: 'RadialPosition',
- x00181143: 'ScanArc',
- x00181144: 'AngularStep',
- x00181145: 'CenterOfRotationOffset',
- x00181146: 'RotationOffset',
- x00181147: 'FieldOfViewShape',
- x00181149: 'FieldOfViewDimensions',
- x00181150: 'ExposureTime',
- x00181151: 'XRayTubeCurrent',
- x00181152: 'Exposure',
- x00181153: 'ExposureInMicroAmpSec',
- x00181154: 'AveragePulseWidth',
- x00181155: 'RadiationSetting',
- x00181156: 'RectificationType',
- x0018115a: 'RadiationMode',
- x0018115e: 'ImageAreaDoseProduct',
- x00181160: 'FilterType',
- x00181161: 'TypeOfFilters',
- x00181162: 'IntensifierSize',
- x00181164: 'ImagerPixelSpacing',
- x00181166: 'Grid',
- x00181170: 'GeneratorPower',
- x00181180: 'CollimatorGridName',
- x00181181: 'CollimatorType',
- x00181182: 'FocalDistance',
- x00181183: 'XFocusCenter',
- x00181184: 'YFocusCenter',
- x00181190: 'FocalSpots',
- x00181191: 'AnodeTargetMaterial',
- x001811a0: 'BodyPartThickness',
- x001811a2: 'CompressionForce',
- x00181200: 'DateOfLastCalibration',
- x00181201: 'TimeOfLastCalibration',
- x00181210: 'ConvolutionKernel',
- x00181240: 'UpperLowerPixelValues',
- x00181242: 'ActualFrameDuration',
- x00181243: 'CountRate',
- x00181244: 'PreferredPlaybackSequencing',
- x00181250: 'ReceiveCoilName',
- x00181251: 'TransmitCoilName',
- x00181260: 'PlateType',
- x00181261: 'PhosphorType',
- x00181300: 'ScanVelocity',
- x00181301: 'WholeBodyTechnique',
- x00181302: 'ScanLength',
- x00181310: 'AcquisitionMatrix',
- x00181312: 'InPlanePhaseEncodingDirection',
- x00181314: 'FlipAngle',
- x00181315: 'VariableFlipAngleFlag',
- x00181316: 'SAR',
- x00181318: 'DB-Dt',
- x00181400: 'AcquisitionDeviceProcessingDescr',
- x00181401: 'AcquisitionDeviceProcessingCode',
- x00181402: 'CassetteOrientation',
- x00181403: 'CassetteSize',
- x00181404: 'ExposuresOnPlate',
- x00181405: 'RelativeXRayExposure',
- x00181450: 'ColumnAngulation',
- x00181460: 'TomoLayerHeight',
- x00181470: 'TomoAngle',
- x00181480: 'TomoTime',
- x00181490: 'TomoType',
- x00181491: 'TomoClass',
- x00181495: 'NumberOfTomosynthesisSourceImages',
- x00181500: 'PositionerMotion',
- x00181508: 'PositionerType',
- x00181510: 'PositionerPrimaryAngle',
- x00181511: 'PositionerSecondaryAngle',
- x00181520: 'PositionerPrimaryAngleIncrement',
- x00181521: 'PositionerSecondaryAngleIncrement',
- x00181530: 'DetectorPrimaryAngle',
- x00181531: 'DetectorSecondaryAngle',
- x00181600: 'ShutterShape',
- x00181602: 'ShutterLeftVerticalEdge',
- x00181604: 'ShutterRightVerticalEdge',
- x00181606: 'ShutterUpperHorizontalEdge',
- x00181608: 'ShutterLowerHorizontalEdge',
- x00181610: 'CenterOfCircularShutter',
- x00181612: 'RadiusOfCircularShutter',
- x00181620: 'VerticesOfPolygonalShutter',
- x00181622: 'ShutterPresentationValue',
- x00181623: 'ShutterOverlayGroup',
- x00181624: 'ShutterPresentationColorCIELabVal',
- x00181700: 'CollimatorShape',
- x00181702: 'CollimatorLeftVerticalEdge',
- x00181704: 'CollimatorRightVerticalEdge',
- x00181706: 'CollimatorUpperHorizontalEdge',
- x00181708: 'CollimatorLowerHorizontalEdge',
- x00181710: 'CenterOfCircularCollimator',
- x00181712: 'RadiusOfCircularCollimator',
- x00181720: 'VerticesOfPolygonalCollimator',
- x00181800: 'AcquisitionTimeSynchronized',
- x00181801: 'TimeSource',
- x00181802: 'TimeDistributionProtocol',
- x00181803: 'NTPSourceAddress',
- x00182001: 'PageNumberVector',
- x00182002: 'FrameLabelVector',
- x00182003: 'FramePrimaryAngleVector',
- x00182004: 'FrameSecondaryAngleVector',
- x00182005: 'SliceLocationVector',
- x00182006: 'DisplayWindowLabelVector',
- x00182010: 'NominalScannedPixelSpacing',
- x00182020: 'DigitizingDeviceTransportDirection',
- x00182030: 'RotationOfScannedFilm',
- x00183100: 'IVUSAcquisition',
- x00183101: 'IVUSPullbackRate',
- x00183102: 'IVUSGatedRate',
- x00183103: 'IVUSPullbackStartFrameNumber',
- x00183104: 'IVUSPullbackStopFrameNumber',
- x00183105: 'LesionNumber',
- x00184000: 'AcquisitionComments',
- x00185000: 'OutputPower',
- x00185010: 'TransducerData',
- x00185012: 'FocusDepth',
- x00185020: 'ProcessingFunction',
- x00185021: 'PostprocessingFunction',
- x00185022: 'MechanicalIndex',
- x00185024: 'BoneThermalIndex',
- x00185026: 'CranialThermalIndex',
- x00185027: 'SoftTissueThermalIndex',
- x00185028: 'SoftTissueFocusThermalIndex',
- x00185029: 'SoftTissueSurfaceThermalIndex',
- x00185030: 'DynamicRange',
- x00185040: 'TotalGain',
- x00185050: 'DepthOfScanField',
- x00185100: 'PatientPosition',
- x00185101: 'ViewPosition',
- x00185104: 'ProjectionEponymousNameCodeSeq',
- x00185210: 'ImageTransformationMatrix',
- x00185212: 'ImageTranslationVector',
- x00186000: 'Sensitivity',
- x00186011: 'SequenceOfUltrasoundRegions',
- x00186012: 'RegionSpatialFormat',
- x00186014: 'RegionDataType',
- x00186016: 'RegionFlags',
- x00186018: 'RegionLocationMinX0',
- x0018601a: 'RegionLocationMinY0',
- x0018601c: 'RegionLocationMaxX1',
- x0018601e: 'RegionLocationMaxY1',
- x00186020: 'ReferencePixelX0',
- x00186022: 'ReferencePixelY0',
- x00186024: 'PhysicalUnitsXDirection',
- x00186026: 'PhysicalUnitsYDirection',
- x00186028: 'ReferencePixelPhysicalValueX',
- x0018602a: 'ReferencePixelPhysicalValueY',
- x0018602c: 'PhysicalDeltaX',
- x0018602e: 'PhysicalDeltaY',
- x00186030: 'TransducerFrequency',
- x00186031: 'TransducerType',
- x00186032: 'PulseRepetitionFrequency',
- x00186034: 'DopplerCorrectionAngle',
- x00186036: 'SteeringAngle',
- x00186038: 'DopplerSampleVolumeXPosRetired',
- x00186039: 'DopplerSampleVolumeXPosition',
- x0018603a: 'DopplerSampleVolumeYPosRetired',
- x0018603b: 'DopplerSampleVolumeYPosition',
- x0018603c: 'TMLinePositionX0Retired',
- x0018603d: 'TMLinePositionX0',
- x0018603e: 'TMLinePositionY0Retired',
- x0018603f: 'TMLinePositionY0',
- x00186040: 'TMLinePositionX1Retired',
- x00186041: 'TMLinePositionX1',
- x00186042: 'TMLinePositionY1Retired',
- x00186043: 'TMLinePositionY1',
- x00186044: 'PixelComponentOrganization',
- x00186046: 'PixelComponentMask',
- x00186048: 'PixelComponentRangeStart',
- x0018604a: 'PixelComponentRangeStop',
- x0018604c: 'PixelComponentPhysicalUnits',
- x0018604e: 'PixelComponentDataType',
- x00186050: 'NumberOfTableBreakPoints',
- x00186052: 'TableOfXBreakPoints',
- x00186054: 'TableOfYBreakPoints',
- x00186056: 'NumberOfTableEntries',
- x00186058: 'TableOfPixelValues',
- x0018605a: 'TableOfParameterValues',
- x00186060: 'RWaveTimeVector',
- x00187000: 'DetectorConditionsNominalFlag',
- x00187001: 'DetectorTemperature',
- x00187004: 'DetectorType',
- x00187005: 'DetectorConfiguration',
- x00187006: 'DetectorDescription',
- x00187008: 'DetectorMode',
- x0018700a: 'DetectorID',
- x0018700c: 'DateOfLastDetectorCalibration',
- x0018700e: 'TimeOfLastDetectorCalibration',
- x00187010: 'DetectorExposuresSinceCalibration',
- x00187011: 'DetectorExposuresSinceManufactured',
- x00187012: 'DetectorTimeSinceLastExposure',
- x00187014: 'DetectorActiveTime',
- x00187016: 'DetectorActiveOffsetFromExposure',
- x0018701a: 'DetectorBinning',
- x00187020: 'DetectorElementPhysicalSize',
- x00187022: 'DetectorElementSpacing',
- x00187024: 'DetectorActiveShape',
- x00187026: 'DetectorActiveDimensions',
- x00187028: 'DetectorActiveOrigin',
- x0018702a: 'DetectorManufacturerName',
- x0018702b: 'DetectorManufacturersModelName',
- x00187030: 'FieldOfViewOrigin',
- x00187032: 'FieldOfViewRotation',
- x00187034: 'FieldOfViewHorizontalFlip',
- x00187040: 'GridAbsorbingMaterial',
- x00187041: 'GridSpacingMaterial',
- x00187042: 'GridThickness',
- x00187044: 'GridPitch',
- x00187046: 'GridAspectRatio',
- x00187048: 'GridPeriod',
- x0018704c: 'GridFocalDistance',
- x00187050: 'FilterMaterial',
- x00187052: 'FilterThicknessMinimum',
- x00187054: 'FilterThicknessMaximum',
- x00187060: 'ExposureControlMode',
- x00187062: 'ExposureControlModeDescription',
- x00187064: 'ExposureStatus',
- x00187065: 'PhototimerSetting',
- x00188150: 'ExposureTimeInMicroSec',
- x00188151: 'XRayTubeCurrentInMicroAmps',
- x00189004: 'ContentQualification',
- x00189005: 'PulseSequenceName',
- x00189006: 'MRImagingModifierSequence',
- x00189008: 'EchoPulseSequence',
- x00189009: 'InversionRecovery',
- x00189010: 'FlowCompensation',
- x00189011: 'MultipleSpinEcho',
- x00189012: 'MultiPlanarExcitation',
- x00189014: 'PhaseContrast',
- x00189015: 'TimeOfFlightContrast',
- x00189016: 'Spoiling',
- x00189017: 'SteadyStatePulseSequence',
- x00189018: 'EchoPlanarPulseSequence',
- x00189019: 'TagAngleFirstAxis',
- x00189020: 'MagnetizationTransfer',
- x00189021: 'T2Preparation',
- x00189022: 'BloodSignalNulling',
- x00189024: 'SaturationRecovery',
- x00189025: 'SpectrallySelectedSuppression',
- x00189026: 'SpectrallySelectedExcitation',
- x00189027: 'SpatialPresaturation',
- x00189028: 'Tagging',
- x00189029: 'OversamplingPhase',
- x00189030: 'TagSpacingFirstDimension',
- x00189032: 'GeometryOfKSpaceTraversal',
- x00189033: 'SegmentedKSpaceTraversal',
- x00189034: 'RectilinearPhaseEncodeReordering',
- x00189035: 'TagThickness',
- x00189036: 'PartialFourierDirection',
- x00189037: 'CardiacSynchronizationTechnique',
- x00189041: 'ReceiveCoilManufacturerName',
- x00189042: 'MRReceiveCoilSequence',
- x00189043: 'ReceiveCoilType',
- x00189044: 'QuadratureReceiveCoil',
- x00189045: 'MultiCoilDefinitionSequence',
- x00189046: 'MultiCoilConfiguration',
- x00189047: 'MultiCoilElementName',
- x00189048: 'MultiCoilElementUsed',
- x00189049: 'MRTransmitCoilSequence',
- x00189050: 'TransmitCoilManufacturerName',
- x00189051: 'TransmitCoilType',
- x00189052: 'SpectralWidth',
- x00189053: 'ChemicalShiftReference',
- x00189054: 'VolumeLocalizationTechnique',
- x00189058: 'MRAcquisitionFrequencyEncodeSteps',
- x00189059: 'Decoupling',
- x00189060: 'DecoupledNucleus',
- x00189061: 'DecouplingFrequency',
- x00189062: 'DecouplingMethod',
- x00189063: 'DecouplingChemicalShiftReference',
- x00189064: 'KSpaceFiltering',
- x00189065: 'TimeDomainFiltering',
- x00189066: 'NumberOfZeroFills',
- x00189067: 'BaselineCorrection',
- x00189069: 'ParallelReductionFactorInPlane',
- x00189070: 'CardiacRRIntervalSpecified',
- x00189073: 'AcquisitionDuration',
- x00189074: 'FrameAcquisitionDateTime',
- x00189075: 'DiffusionDirectionality',
- x00189076: 'DiffusionGradientDirectionSequence',
- x00189077: 'ParallelAcquisition',
- x00189078: 'ParallelAcquisitionTechnique',
- x00189079: 'InversionTimes',
- x00189080: 'MetaboliteMapDescription',
- x00189081: 'PartialFourier',
- x00189082: 'EffectiveEchoTime',
- x00189083: 'MetaboliteMapCodeSequence',
- x00189084: 'ChemicalShiftSequence',
- x00189085: 'CardiacSignalSource',
- x00189087: 'DiffusionBValue',
- x00189089: 'DiffusionGradientOrientation',
- x00189090: 'VelocityEncodingDirection',
- x00189091: 'VelocityEncodingMinimumValue',
- x00189093: 'NumberOfKSpaceTrajectories',
- x00189094: 'CoverageOfKSpace',
- x00189095: 'SpectroscopyAcquisitionPhaseRows',
- x00189096: 'ParallelReductFactorInPlaneRetired',
- x00189098: 'TransmitterFrequency',
- x00189100: 'ResonantNucleus',
- x00189101: 'FrequencyCorrection',
- x00189103: 'MRSpectroscopyFOV-GeometrySequence',
- x00189104: 'SlabThickness',
- x00189105: 'SlabOrientation',
- x00189106: 'MidSlabPosition',
- x00189107: 'MRSpatialSaturationSequence',
- x00189112: 'MRTimingAndRelatedParametersSeq',
- x00189114: 'MREchoSequence',
- x00189115: 'MRModifierSequence',
- x00189117: 'MRDiffusionSequence',
- x00189118: 'CardiacTriggerSequence',
- x00189119: 'MRAveragesSequence',
- x00189125: 'MRFOV-GeometrySequence',
- x00189126: 'VolumeLocalizationSequence',
- x00189127: 'SpectroscopyAcquisitionDataColumns',
- x00189147: 'DiffusionAnisotropyType',
- x00189151: 'FrameReferenceDateTime',
- x00189152: 'MRMetaboliteMapSequence',
- x00189155: 'ParallelReductionFactorOutOfPlane',
- x00189159: 'SpectroscopyOutOfPlanePhaseSteps',
- x00189166: 'BulkMotionStatus',
- x00189168: 'ParallelReductionFactSecondInPlane',
- x00189169: 'CardiacBeatRejectionTechnique',
- x00189170: 'RespiratoryMotionCompTechnique',
- x00189171: 'RespiratorySignalSource',
- x00189172: 'BulkMotionCompensationTechnique',
- x00189173: 'BulkMotionSignalSource',
- x00189174: 'ApplicableSafetyStandardAgency',
- x00189175: 'ApplicableSafetyStandardDescr',
- x00189176: 'OperatingModeSequence',
- x00189177: 'OperatingModeType',
- x00189178: 'OperatingMode',
- x00189179: 'SpecificAbsorptionRateDefinition',
- x00189180: 'GradientOutputType',
- x00189181: 'SpecificAbsorptionRateValue',
- x00189182: 'GradientOutput',
- x00189183: 'FlowCompensationDirection',
- x00189184: 'TaggingDelay',
- x00189185: 'RespiratoryMotionCompTechDescr',
- x00189186: 'RespiratorySignalSourceID',
- x00189195: 'ChemicalShiftsMinIntegrateLimitHz',
- x00189196: 'ChemicalShiftsMaxIntegrateLimitHz',
- x00189197: 'MRVelocityEncodingSequence',
- x00189198: 'FirstOrderPhaseCorrection',
- x00189199: 'WaterReferencedPhaseCorrection',
- x00189200: 'MRSpectroscopyAcquisitionType',
- x00189214: 'RespiratoryCyclePosition',
- x00189217: 'VelocityEncodingMaximumValue',
- x00189218: 'TagSpacingSecondDimension',
- x00189219: 'TagAngleSecondAxis',
- x00189220: 'FrameAcquisitionDuration',
- x00189226: 'MRImageFrameTypeSequence',
- x00189227: 'MRSpectroscopyFrameTypeSequence',
- x00189231: 'MRAcqPhaseEncodingStepsInPlane',
- x00189232: 'MRAcqPhaseEncodingStepsOutOfPlane',
- x00189234: 'SpectroscopyAcqPhaseColumns',
- x00189236: 'CardiacCyclePosition',
- x00189239: 'SpecificAbsorptionRateSequence',
- x00189240: 'RFEchoTrainLength',
- x00189241: 'GradientEchoTrainLength',
- x00189295: 'ChemicalShiftsMinIntegrateLimitPPM',
- x00189296: 'ChemicalShiftsMaxIntegrateLimitPPM',
- x00189301: 'CTAcquisitionTypeSequence',
- x00189302: 'AcquisitionType',
- x00189303: 'TubeAngle',
- x00189304: 'CTAcquisitionDetailsSequence',
- x00189305: 'RevolutionTime',
- x00189306: 'SingleCollimationWidth',
- x00189307: 'TotalCollimationWidth',
- x00189308: 'CTTableDynamicsSequence',
- x00189309: 'TableSpeed',
- x00189310: 'TableFeedPerRotation',
- x00189311: 'SpiralPitchFactor',
- x00189312: 'CTGeometrySequence',
- x00189313: 'DataCollectionCenterPatient',
- x00189314: 'CTReconstructionSequence',
- x00189315: 'ReconstructionAlgorithm',
- x00189316: 'ConvolutionKernelGroup',
- x00189317: 'ReconstructionFieldOfView',
- x00189318: 'ReconstructionTargetCenterPatient',
- x00189319: 'ReconstructionAngle',
- x00189320: 'ImageFilter',
- x00189321: 'CTExposureSequence',
- x00189322: 'ReconstructionPixelSpacing',
- x00189323: 'ExposureModulationType',
- x00189324: 'EstimatedDoseSaving',
- x00189325: 'CTXRayDetailsSequence',
- x00189326: 'CTPositionSequence',
- x00189327: 'TablePosition',
- x00189328: 'ExposureTimeInMilliSec',
- x00189329: 'CTImageFrameTypeSequence',
- x00189330: 'XRayTubeCurrentInMilliAmps',
- x00189332: 'ExposureInMilliAmpSec',
- x00189333: 'ConstantVolumeFlag',
- x00189334: 'FluoroscopyFlag',
- x00189335: 'SourceToDataCollectionCenterDist',
- x00189337: 'ContrastBolusAgentNumber',
- x00189338: 'ContrastBolusIngredientCodeSeq',
- x00189340: 'ContrastAdministrationProfileSeq',
- x00189341: 'ContrastBolusUsageSequence',
- x00189342: 'ContrastBolusAgentAdministered',
- x00189343: 'ContrastBolusAgentDetected',
- x00189344: 'ContrastBolusAgentPhase',
- x00189345: 'CTDIvol',
- x00189346: 'CTDIPhantomTypeCodeSequence',
- x00189351: 'CalciumScoringMassFactorPatient',
- x00189352: 'CalciumScoringMassFactorDevice',
- x00189353: 'EnergyWeightingFactor',
- x00189360: 'CTAdditionalXRaySourceSequence',
- x00189401: 'ProjectionPixelCalibrationSequence',
- x00189402: 'DistanceSourceToIsocenter',
- x00189403: 'DistanceObjectToTableTop',
- x00189404: 'ObjectPixelSpacingInCenterOfBeam',
- x00189405: 'PositionerPositionSequence',
- x00189406: 'TablePositionSequence',
- x00189407: 'CollimatorShapeSequence',
- x00189412: 'XA-XRFFrameCharacteristicsSequence',
- x00189417: 'FrameAcquisitionSequence',
- x00189420: 'XRayReceptorType',
- x00189423: 'AcquisitionProtocolName',
- x00189424: 'AcquisitionProtocolDescription',
- x00189425: 'ContrastBolusIngredientOpaque',
- x00189426: 'DistanceReceptorPlaneToDetHousing',
- x00189427: 'IntensifierActiveShape',
- x00189428: 'IntensifierActiveDimensions',
- x00189429: 'PhysicalDetectorSize',
- x00189430: 'PositionOfIsocenterProjection',
- x00189432: 'FieldOfViewSequence',
- x00189433: 'FieldOfViewDescription',
- x00189434: 'ExposureControlSensingRegionsSeq',
- x00189435: 'ExposureControlSensingRegionShape',
- x00189436: 'ExposureControlSensRegionLeftEdge',
- x00189437: 'ExposureControlSensRegionRightEdge',
- x00189440: 'CenterOfCircExposControlSensRegion',
- x00189441: 'RadiusOfCircExposControlSensRegion',
- x00189447: 'ColumnAngulationPatient',
- x00189449: 'BeamAngle',
- x00189451: 'FrameDetectorParametersSequence',
- x00189452: 'CalculatedAnatomyThickness',
- x00189455: 'CalibrationSequence',
- x00189456: 'ObjectThicknessSequence',
- x00189457: 'PlaneIdentification',
- x00189461: 'FieldOfViewDimensionsInFloat',
- x00189462: 'IsocenterReferenceSystemSequence',
- x00189463: 'PositionerIsocenterPrimaryAngle',
- x00189464: 'PositionerIsocenterSecondaryAngle',
- x00189465: 'PositionerIsocenterDetRotAngle',
- x00189466: 'TableXPositionToIsocenter',
- x00189467: 'TableYPositionToIsocenter',
- x00189468: 'TableZPositionToIsocenter',
- x00189469: 'TableHorizontalRotationAngle',
- x00189470: 'TableHeadTiltAngle',
- x00189471: 'TableCradleTiltAngle',
- x00189472: 'FrameDisplayShutterSequence',
- x00189473: 'AcquiredImageAreaDoseProduct',
- x00189474: 'CArmPositionerTabletopRelationship',
- x00189476: 'XRayGeometrySequence',
- x00189477: 'IrradiationEventIDSequence',
- x00189504: 'XRay3DFrameTypeSequence',
- x00189506: 'ContributingSourcesSequence',
- x00189507: 'XRay3DAcquisitionSequence',
- x00189508: 'PrimaryPositionerScanArc',
- x00189509: 'SecondaryPositionerScanArc',
- x00189510: 'PrimaryPositionerScanStartAngle',
- x00189511: 'SecondaryPositionerScanStartAngle',
- x00189514: 'PrimaryPositionerIncrement',
- x00189515: 'SecondaryPositionerIncrement',
- x00189516: 'StartAcquisitionDateTime',
- x00189517: 'EndAcquisitionDateTime',
- x00189524: 'ApplicationName',
- x00189525: 'ApplicationVersion',
- x00189526: 'ApplicationManufacturer',
- x00189527: 'AlgorithmType',
- x00189528: 'AlgorithmDescription',
- x00189530: 'XRay3DReconstructionSequence',
- x00189531: 'ReconstructionDescription',
- x00189538: 'PerProjectionAcquisitionSequence',
- x00189601: 'DiffusionBMatrixSequence',
- x00189602: 'DiffusionBValueXX',
- x00189603: 'DiffusionBValueXY',
- x00189604: 'DiffusionBValueXZ',
- x00189605: 'DiffusionBValueYY',
- x00189606: 'DiffusionBValueYZ',
- x00189607: 'DiffusionBValueZZ',
- x00189701: 'DecayCorrectionDateTime',
- x00189715: 'StartDensityThreshold',
- x00189722: 'TerminationTimeThreshold',
- x00189725: 'DetectorGeometry',
- x00189727: 'AxialDetectorDimension',
- x00189735: 'PETPositionSequence',
- x00189739: 'NumberOfIterations',
- x00189740: 'NumberOfSubsets',
- x00189751: 'PETFrameTypeSequence',
- x00189756: 'ReconstructionType',
- x00189758: 'DecayCorrected',
- x00189759: 'AttenuationCorrected',
- x00189760: 'ScatterCorrected',
- x00189761: 'DeadTimeCorrected',
- x00189762: 'GantryMotionCorrected',
- x00189763: 'PatientMotionCorrected',
- x00189765: 'RandomsCorrected',
- x00189767: 'SensitivityCalibrated',
- x00189801: 'DepthsOfFocus',
- x00189804: 'ExclusionStartDatetime',
- x00189805: 'ExclusionDuration',
- x00189807: 'ImageDataTypeSequence',
- x00189808: 'DataType',
- x0018980b: 'AliasedDataType',
- x0018a001: 'ContributingEquipmentSequence',
- x0018a002: 'ContributionDateTime',
- x0018a003: 'ContributionDescription',
- // x00191002: 'NumberOfCellsIInDetector',
- // x00191003: 'CellNumberAtTheta',
- // x00191004: 'CellSpacing',
- // x0019100f: 'HorizFrameOfRef',
- // x00191011: 'SeriesContrast',
- // x00191012: 'LastPseq',
- // x00191013: 'StartNumberForBaseline',
- // x00191014: 'EndNumberForBaseline',
- // x00191015: 'StartNumberForEnhancedScans',
- // x00191016: 'EndNumberForEnhancedScans',
- // x00191017: 'SeriesPlane',
- // x00191018: 'FirstScanRas',
- // x00191019: 'FirstScanLocation',
- // x0019101a: 'LastScanRas',
- // x0019101b: 'LastScanLoc',
- // x0019101e: 'DisplayFieldOfView',
- // x00191023: 'TableSpeed',
- // x00191024: 'MidScanTime',
- // x00191025: 'MidScanFlag',
- // x00191026: 'DegreesOfAzimuth',
- // x00191027: 'GantryPeriod',
- // x0019102a: 'XRayOnPosition',
- // x0019102b: 'XRayOffPosition',
- // x0019102c: 'NumberOfTriggers',
- // x0019102e: 'AngleOfFirstView',
- // x0019102f: 'TriggerFrequency',
- // x00191039: 'ScanFOVType',
- // x00191040: 'StatReconFlag',
- // x00191041: 'ComputeType',
- // x00191042: 'SegmentNumber',
- // x00191043: 'TotalSegmentsRequested',
- // x00191044: 'InterscanDelay',
- // x00191047: 'ViewCompressionFactor',
- // x0019104a: 'TotalNoOfRefChannels',
- // x0019104b: 'DataSizeForScanData',
- // x00191052: 'ReconPostProcflag',
- // x00191057: 'CTWaterNumber',
- // x00191058: 'CTBoneNumber',
- // x0019105a: 'AcquisitionDuration',
- // x0019105e: 'NumberOfChannels',
- // x0019105f: 'IncrementBetweenChannels',
- // x00191060: 'StartingView',
- // x00191061: 'NumberOfViews',
- // x00191062: 'IncrementBetweenViews',
- // x0019106a: 'DependantOnNoViewsProcessed',
- // x0019106b: 'FieldOfViewInDetectorCells',
- // x00191070: 'ValueOfBackProjectionButton',
- // x00191071: 'SetIfFatqEstimatesWereUsed',
- // x00191072: 'ZChanAvgOverViews',
- // x00191073: 'AvgOfLeftRefChansOverViews',
- // x00191074: 'MaxLeftChanOverViews',
- // x00191075: 'AvgOfRightRefChansOverViews',
- // x00191076: 'MaxRightChanOverViews',
- // x0019107d: 'SecondEcho',
- // x0019107e: 'NumberOfEchoes',
- // x0019107f: 'TableDelta',
- // x00191081: 'Contiguous',
- // x00191084: 'PeakSAR',
- // x00191085: 'MonitorSAR',
- // x00191087: 'CardiacRepetitionTime',
- // x00191088: 'ImagesPerCardiacCycle',
- // x0019108a: 'ActualReceiveGainAnalog',
- // x0019108b: 'ActualReceiveGainDigital',
- // x0019108d: 'DelayAfterTrigger',
- // x0019108f: 'Swappf',
- // x00191090: 'PauseInterval',
- // x00191091: 'PulseTime',
- // x00191092: 'SliceOffsetOnFreqAxis',
- // x00191093: 'CenterFrequency',
- // x00191094: 'TransmitGain',
- // x00191095: 'AnalogReceiverGain',
- // x00191096: 'DigitalReceiverGain',
- // x00191097: 'BitmapDefiningCVs',
- // x00191098: 'CenterFreqMethod',
- // x0019109b: 'PulseSeqMode',
- // x0019109c: 'PulseSeqName',
- // x0019109d: 'PulseSeqDate',
- // x0019109e: 'InternalPulseSeqName',
- // x0019109f: 'TransmittingCoil',
- // x001910a0: 'SurfaceCoilType',
- // x001910a1: 'ExtremityCoilFlag',
- // x001910a2: 'RawDataRunNumber',
- // x001910a3: 'CalibratedFieldStrength',
- // x001910a4: 'SATFatWaterBone',
- // x001910a5: 'ReceiveBandwidth',
- // x001910a7: 'UserData01',
- // x001910a8: 'UserData02',
- // x001910a9: 'UserData03',
- // x001910aa: 'UserData04',
- // x001910ab: 'UserData05',
- // x001910ac: 'UserData06',
- // x001910ad: 'UserData07',
- // x001910ae: 'UserData08',
- // x001910af: 'UserData09',
- // x001910b0: 'UserData10',
- // x001910b1: 'UserData11',
- // x001910b2: 'UserData12',
- // x001910b3: 'UserData13',
- // x001910b4: 'UserData14',
- // x001910b5: 'UserData15',
- // x001910b6: 'UserData16',
- // x001910b7: 'UserData17',
- // x001910b8: 'UserData18',
- // x001910b9: 'UserData19',
- // x001910ba: 'UserData20',
- // x001910bb: 'UserData21',
- // x001910bc: 'UserData22',
- // x001910bd: 'UserData23',
- // x001910be: 'ProjectionAngle',
- // x001910c0: 'SaturationPlanes',
- // x001910c1: 'SurfaceCoilIntensity',
- // x001910c2: 'SATLocationR',
- // x001910c3: 'SATLocationL',
- // x001910c4: 'SATLocationA',
- // x001910c5: 'SATLocationP',
- // x001910c6: 'SATLocationH',
- // x001910c7: 'SATLocationF',
- // x001910c8: 'SATThicknessR-L',
- // x001910c9: 'SATThicknessA-P',
- // x001910ca: 'SATThicknessH-F',
- // x001910cb: 'PrescribedFlowAxis',
- // x001910cc: 'VelocityEncoding',
- // x001910cd: 'ThicknessDisclaimer',
- // x001910ce: 'PrescanType',
- // x001910cf: 'PrescanStatus',
- // x001910d0: 'RawDataType',
- // x001910d2: 'ProjectionAlgorithm',
- // x001910d3: 'ProjectionAlgorithm',
- // x001910d5: 'FractionalEcho',
- // x001910d6: 'PrepPulse',
- // x001910d7: 'CardiacPhases',
- // x001910d8: 'VariableEchoflag',
- // x001910d9: 'ConcatenatedSAT',
- // x001910da: 'ReferenceChannelUsed',
- // x001910db: 'BackProjectorCoefficient',
- // x001910dc: 'PrimarySpeedCorrectionUsed',
- // x001910dd: 'OverrangeCorrectionUsed',
- // x001910de: 'DynamicZAlphaValue',
- // x001910df: 'UserData',
- // x001910e0: 'UserData',
- // x001910e2: 'VelocityEncodeScale',
- // x001910f2: 'FastPhases',
- // x001910f9: 'TransmissionGain',
- x00200000: 'RelationshipGroupLength',
- x0020000d: 'StudyInstanceUID',
- x0020000e: 'SeriesInstanceUID',
- x00200010: 'StudyID',
- x00200011: 'SeriesNumber',
- x00200012: 'AcquisitionNumber',
- x00200013: 'InstanceNumber',
- x00200014: 'IsotopeNumber',
- x00200015: 'PhaseNumber',
- x00200016: 'IntervalNumber',
- x00200017: 'TimeSlotNumber',
- x00200018: 'AngleNumber',
- x00200019: 'ItemNumber',
- x00200020: 'PatientOrientation',
- x00200022: 'OverlayNumber',
- x00200024: 'CurveNumber',
- x00200026: 'LookupTableNumber',
- x00200030: 'ImagePosition',
- x00200032: 'ImagePositionPatient',
- x00200035: 'ImageOrientation',
- x00200037: 'ImageOrientationPatient',
- x00200050: 'Location',
- x00200052: 'FrameOfReferenceUID',
- x00200060: 'Laterality',
- x00200062: 'ImageLaterality',
- x00200070: 'ImageGeometryType',
- x00200080: 'MaskingImage',
- x00200100: 'TemporalPositionIdentifier',
- x00200105: 'NumberOfTemporalPositions',
- x00200110: 'TemporalResolution',
- x00200200: 'SynchronizationFrameOfReferenceUID',
- x00201000: 'SeriesInStudy',
- x00201001: 'AcquisitionsInSeries',
- x00201002: 'ImagesInAcquisition',
- x00201003: 'ImagesInSeries',
- x00201004: 'AcquisitionsInStudy',
- x00201005: 'ImagesInStudy',
- x00201020: 'Reference',
- x00201040: 'PositionReferenceIndicator',
- x00201041: 'SliceLocation',
- x00201070: 'OtherStudyNumbers',
- x00201200: 'NumberOfPatientRelatedStudies',
- x00201202: 'NumberOfPatientRelatedSeries',
- x00201204: 'NumberOfPatientRelatedInstances',
- x00201206: 'NumberOfStudyRelatedSeries',
- x00201208: 'NumberOfStudyRelatedInstances',
- x00201209: 'NumberOfSeriesRelatedInstances',
- x002031xx: 'SourceImageIDs',
- x00203401: 'ModifyingDeviceID',
- x00203402: 'ModifiedImageID',
- x00203403: 'ModifiedImageDate',
- x00203404: 'ModifyingDeviceManufacturer',
- x00203405: 'ModifiedImageTime',
- x00203406: 'ModifiedImageDescription',
- x00204000: 'ImageComments',
- x00205000: 'OriginalImageIdentification',
- x00205002: 'OriginalImageIdentNomenclature',
- x00209056: 'StackID',
- x00209057: 'InStackPositionNumber',
- x00209071: 'FrameAnatomySequence',
- x00209072: 'FrameLaterality',
- x00209111: 'FrameContentSequence',
- x00209113: 'PlanePositionSequence',
- x00209116: 'PlaneOrientationSequence',
- x00209128: 'TemporalPositionIndex',
- x00209153: 'TriggerDelayTime',
- x00209156: 'FrameAcquisitionNumber',
- x00209157: 'DimensionIndexValues',
- x00209158: 'FrameComments',
- x00209161: 'ConcatenationUID',
- x00209162: 'InConcatenationNumber',
- x00209163: 'InConcatenationTotalNumber',
- x00209164: 'DimensionOrganizationUID',
- x00209165: 'DimensionIndexPointer',
- x00209167: 'FunctionalGroupPointer',
- x00209213: 'DimensionIndexPrivateCreator',
- x00209221: 'DimensionOrganizationSequence',
- x00209222: 'DimensionIndexSequence',
- x00209228: 'ConcatenationFrameOffsetNumber',
- x00209238: 'FunctionalGroupPrivateCreator',
- x00209241: 'NominalPercentageOfCardiacPhase',
- x00209245: 'NominalPercentOfRespiratoryPhase',
- x00209246: 'StartingRespiratoryAmplitude',
- x00209247: 'StartingRespiratoryPhase',
- x00209248: 'EndingRespiratoryAmplitude',
- x00209249: 'EndingRespiratoryPhase',
- x00209250: 'RespiratoryTriggerType',
- x00209251: 'RRIntervalTimeNominal',
- x00209252: 'ActualCardiacTriggerDelayTime',
- x00209253: 'RespiratorySynchronizationSequence',
- x00209254: 'RespiratoryIntervalTime',
- x00209255: 'NominalRespiratoryTriggerDelayTime',
- x00209256: 'RespiratoryTriggerDelayThreshold',
- x00209257: 'ActualRespiratoryTriggerDelayTime',
- x00209301: 'ImagePositionVolume',
- x00209302: 'ImageOrientationVolume',
- x00209308: 'ApexPosition',
- x00209421: 'DimensionDescriptionLabel',
- x00209450: 'PatientOrientationInFrameSequence',
- x00209453: 'FrameLabel',
- x00209518: 'AcquisitionIndex',
- x00209529: 'ContributingSOPInstancesRefSeq',
- x00209536: 'ReconstructionIndex',
- // x00211003: 'SeriesFromWhichPrescribed',
- // x00211005: 'GenesisVersionNow',
- // x00211007: 'SeriesRecordChecksum',
- // x00211018: 'GenesisVersionNow',
- // x00211019: 'AcqreconRecordChecksum',
- // x00211020: 'TableStartLocation',
- // x00211035: 'SeriesFromWhichPrescribed',
- // x00211036: 'ImageFromWhichPrescribed',
- // x00211037: 'ScreenFormat',
- // x0021104a: 'AnatomicalReferenceForScout',
- // x0021104f: 'LocationsInAcquisition',
- // x00211050: 'GraphicallyPrescribed',
- // x00211051: 'RotationFromSourceXRot',
- // x00211052: 'RotationFromSourceYRot',
- // x00211053: 'RotationFromSourceZRot',
- // x00211054: 'ImagePosition',
- // x00211055: 'ImageOrientation',
- // x00211056: 'IntegerSlop',
- // x00211057: 'IntegerSlop',
- // x00211058: 'IntegerSlop',
- // x00211059: 'IntegerSlop',
- // x0021105a: 'IntegerSlop',
- // x0021105b: 'FloatSlop',
- // x0021105c: 'FloatSlop',
- // x0021105d: 'FloatSlop',
- // x0021105e: 'FloatSlop',
- // x0021105f: 'FloatSlop',
- // x00211081: 'AutoWindowLevelAlpha',
- // x00211082: 'AutoWindowLevelBeta',
- // x00211083: 'AutoWindowLevelWindow',
- // x00211084: 'ToWindowLevelLevel',
- // x00211090: 'TubeFocalSpotPosition',
- // x00211091: 'BiopsyPosition',
- // x00211092: 'BiopsyTLocation',
- // x00211093: 'BiopsyRefLocation',
- x00220001: 'LightPathFilterPassThroughWavelen',
- x00220002: 'LightPathFilterPassBand',
- x00220003: 'ImagePathFilterPassThroughWavelen',
- x00220004: 'ImagePathFilterPassBand',
- x00220005: 'PatientEyeMovementCommanded',
- x00220006: 'PatientEyeMovementCommandCodeSeq',
- x00220007: 'SphericalLensPower',
- x00220008: 'CylinderLensPower',
- x00220009: 'CylinderAxis',
- x0022000a: 'EmmetropicMagnification',
- x0022000b: 'IntraOcularPressure',
- x0022000c: 'HorizontalFieldOfView',
- x0022000d: 'PupilDilated',
- x0022000e: 'DegreeOfDilation',
- x00220010: 'StereoBaselineAngle',
- x00220011: 'StereoBaselineDisplacement',
- x00220012: 'StereoHorizontalPixelOffset',
- x00220013: 'StereoVerticalPixelOffset',
- x00220014: 'StereoRotation',
- x00220015: 'AcquisitionDeviceTypeCodeSequence',
- x00220016: 'IlluminationTypeCodeSequence',
- x00220017: 'LightPathFilterTypeStackCodeSeq',
- x00220018: 'ImagePathFilterTypeStackCodeSeq',
- x00220019: 'LensesCodeSequence',
- x0022001a: 'ChannelDescriptionCodeSequence',
- x0022001b: 'RefractiveStateSequence',
- x0022001c: 'MydriaticAgentCodeSequence',
- x0022001d: 'RelativeImagePositionCodeSequence',
- x00220020: 'StereoPairsSequence',
- x00220021: 'LeftImageSequence',
- x00220022: 'RightImageSequence',
- x00220030: 'AxialLengthOfTheEye',
- x00220031: 'OphthalmicFrameLocationSequence',
- x00220032: 'ReferenceCoordinates',
- x00220035: 'DepthSpatialResolution',
- x00220036: 'MaximumDepthDistortion',
- x00220037: 'AlongScanSpatialResolution',
- x00220038: 'MaximumAlongScanDistortion',
- x00220039: 'OphthalmicImageOrientation',
- x00220041: 'DepthOfTransverseImage',
- x00220042: 'MydriaticAgentConcUnitsSeq',
- x00220048: 'AcrossScanSpatialResolution',
- x00220049: 'MaximumAcrossScanDistortion',
- x0022004e: 'MydriaticAgentConcentration',
- x00220055: 'IlluminationWaveLength',
- x00220056: 'IlluminationPower',
- x00220057: 'IlluminationBandwidth',
- x00220058: 'MydriaticAgentSequence',
- // x00231001: 'NumberOfSeriesInStudy',
- // x00231002: 'NumberOfUnarchivedSeries',
- // x00231010: 'ReferenceImageField',
- // x00231050: 'SummaryImage',
- // x00231070: 'StartTimeSecsInFirstAxial',
- // x00231074: 'NoofUpdatesToHeader',
- // x0023107d: 'IndicatesIfTheStudyHasCompleteInfo',
- // x00251006: 'LastPulseSequenceUsed',
- // x00251007: 'ImagesInSeries',
- // x00251010: 'LandmarkCounter',
- // x00251011: 'NumberOfAcquisitions',
- // x00251014: 'IndicatesNoofUpdatesToHeader',
- // x00251017: 'SeriesCompleteFlag',
- // x00251018: 'NumberOfImagesArchived',
- // x00251019: 'LastImageNumberUsed',
- // x0025101a: 'PrimaryReceiverSuiteAndHost',
- // x00271006: 'ImageArchiveFlag',
- // x00271010: 'ScoutType',
- // x0027101c: 'VmaMamp',
- // x0027101d: 'VmaPhase',
- // x0027101e: 'VmaMod',
- // x0027101f: 'VmaClip',
- // x00271020: 'SmartScanOnOffFlag',
- // x00271030: 'ForeignImageRevision',
- // x00271031: 'ImagingMode',
- // x00271032: 'PulseSequence',
- // x00271033: 'ImagingOptions',
- // x00271035: 'PlaneType',
- // x00271036: 'ObliquePlane',
- // x00271040: 'RASLetterOfImageLocation',
- // x00271041: 'ImageLocation',
- // x00271042: 'CenterRCoordOfPlaneImage',
- // x00271043: 'CenterACoordOfPlaneImage',
- // x00271044: 'CenterSCoordOfPlaneImage',
- // x00271045: 'NormalRCoord',
- // x00271046: 'NormalACoord',
- // x00271047: 'NormalSCoord',
- // x00271048: 'RCoordOfTopRightCorner',
- // x00271049: 'ACoordOfTopRightCorner',
- // x0027104a: 'SCoordOfTopRightCorner',
- // x0027104b: 'RCoordOfBottomRightCorner',
- // x0027104c: 'ACoordOfBottomRightCorner',
- // x0027104d: 'SCoordOfBottomRightCorner',
- // x00271050: 'TableStartLocation',
- // x00271051: 'TableEndLocation',
- // x00271052: 'RASLetterForSideOfImage',
- // x00271053: 'RASLetterForAnteriorPosterior',
- // x00271054: 'RASLetterForScoutStartLoc',
- // x00271055: 'RASLetterForScoutEndLoc',
- // x00271060: 'ImageDimensionX',
- // x00271061: 'ImageDimensionY',
- // x00271062: 'NumberOfExcitations',
- x00280000: 'ImagePresentationGroupLength',
- x00280002: 'SamplesPerPixel',
- x00280003: 'SamplesPerPixelUsed',
- x00280004: 'PhotometricInterpretation',
- x00280005: 'ImageDimensions',
- x00280006: 'PlanarConfiguration',
- x00280008: 'NumberOfFrames',
- x00280009: 'FrameIncrementPointer',
- x0028000a: 'FrameDimensionPointer',
- x00280010: 'Rows',
- x00280011: 'Columns',
- x00280012: 'Planes',
- x00280014: 'UltrasoundColorDataPresent',
- x00280030: 'PixelSpacing',
- x00280031: 'ZoomFactor',
- x00280032: 'ZoomCenter',
- x00280034: 'PixelAspectRatio',
- x00280040: 'ImageFormat',
- x00280050: 'ManipulatedImage',
- x00280051: 'CorrectedImage',
- x0028005f: 'CompressionRecognitionCode',
- x00280060: 'CompressionCode',
- x00280061: 'CompressionOriginator',
- x00280062: 'CompressionLabel',
- x00280063: 'CompressionDescription',
- x00280065: 'CompressionSequence',
- x00280066: 'CompressionStepPointers',
- x00280068: 'RepeatInterval',
- x00280069: 'BitsGrouped',
- x00280070: 'PerimeterTable',
- x00280071: 'PerimeterValue',
- x00280080: 'PredictorRows',
- x00280081: 'PredictorColumns',
- x00280082: 'PredictorConstants',
- x00280090: 'BlockedPixels',
- x00280091: 'BlockRows',
- x00280092: 'BlockColumns',
- x00280093: 'RowOverlap',
- x00280094: 'ColumnOverlap',
- x00280100: 'BitsAllocated',
- x00280101: 'BitsStored',
- x00280102: 'HighBit',
- x00280103: 'PixelRepresentation',
- x00280104: 'SmallestValidPixelValue',
- x00280105: 'LargestValidPixelValue',
- x00280106: 'SmallestImagePixelValue',
- x00280107: 'LargestImagePixelValue',
- x00280108: 'SmallestPixelValueInSeries',
- x00280109: 'LargestPixelValueInSeries',
- x00280110: 'SmallestImagePixelValueInPlane',
- x00280111: 'LargestImagePixelValueInPlane',
- x00280120: 'PixelPaddingValue',
- x00280121: 'PixelPaddingRangeLimit',
- x00280200: 'ImageLocation',
- x00280300: 'QualityControlImage',
- x00280301: 'BurnedInAnnotation',
- x00280400: 'TransformLabel',
- x00280401: 'TransformVersionNumber',
- x00280402: 'NumberOfTransformSteps',
- x00280403: 'SequenceOfCompressedData',
- x00280404: 'DetailsOfCoefficients',
- x002804x2: 'CoefficientCoding',
- x002804x3: 'CoefficientCodingPointers',
- x00280700: 'DCTLabel',
- x00280701: 'DataBlockDescription',
- x00280702: 'DataBlock',
- x00280710: 'NormalizationFactorFormat',
- x00280720: 'ZonalMapNumberFormat',
- x00280721: 'ZonalMapLocation',
- x00280722: 'ZonalMapFormat',
- x00280730: 'AdaptiveMapFormat',
- x00280740: 'CodeNumberFormat',
- x002808x0: 'CodeLabel',
- x002808x2: 'NumberOfTables',
- x002808x3: 'CodeTableLocation',
- x002808x4: 'BitsForCodeWord',
- x002808x8: 'ImageDataLocation',
- x00280a02: 'PixelSpacingCalibrationType',
- x00280a04: 'PixelSpacingCalibrationDescription',
- x00281040: 'PixelIntensityRelationship',
- x00281041: 'PixelIntensityRelationshipSign',
- x00281050: 'WindowCenter',
- x00281051: 'WindowWidth',
- x00281052: 'RescaleIntercept',
- x00281053: 'RescaleSlope',
- x00281054: 'RescaleType',
- x00281055: 'WindowCenterAndWidthExplanation',
- x00281056: 'VOI_LUTFunction',
- x00281080: 'GrayScale',
- x00281090: 'RecommendedViewingMode',
- x00281100: 'GrayLookupTableDescriptor',
- x00281101: 'RedPaletteColorTableDescriptor',
- x00281102: 'GreenPaletteColorTableDescriptor',
- x00281103: 'BluePaletteColorTableDescriptor',
- x00281111: 'LargeRedPaletteColorTableDescr',
- x00281112: 'LargeGreenPaletteColorTableDescr',
- x00281113: 'LargeBluePaletteColorTableDescr',
- x00281199: 'PaletteColorTableUID',
- x00281200: 'GrayLookupTableData',
- x00281201: 'RedPaletteColorTableData',
- x00281202: 'GreenPaletteColorTableData',
- x00281203: 'BluePaletteColorTableData',
- x00281211: 'LargeRedPaletteColorTableData',
- x00281212: 'LargeGreenPaletteColorTableData',
- x00281213: 'LargeBluePaletteColorTableData',
- x00281214: 'LargePaletteColorLookupTableUID',
- x00281221: 'SegmentedRedColorTableData',
- x00281222: 'SegmentedGreenColorTableData',
- x00281223: 'SegmentedBlueColorTableData',
- x00281300: 'BreastImplantPresent',
- x00281350: 'PartialView',
- x00281351: 'PartialViewDescription',
- x00281352: 'PartialViewCodeSequence',
- x0028135a: 'SpatialLocationsPreserved',
- x00281402: 'DataPathAssignment',
- x00281404: 'BlendingLUT1Sequence',
- x00281406: 'BlendingWeightConstant',
- x00281408: 'BlendingLookupTableData',
- x0028140c: 'BlendingLUT2Sequence',
- x0028140e: 'DataPathID',
- x0028140f: 'RGBLUTTransferFunction',
- x00281410: 'AlphaLUTTransferFunction',
- x00282000: 'ICCProfile',
- x00282110: 'LossyImageCompression',
- x00282112: 'LossyImageCompressionRatio',
- x00282114: 'LossyImageCompressionMethod',
- x00283000: 'ModalityLUTSequence',
- x00283002: 'LUTDescriptor',
- x00283003: 'LUTExplanation',
- x00283004: 'ModalityLUTType',
- x00283006: 'LUTData',
- x00283010: 'VOILUTSequence',
- x00283110: 'SoftcopyVOILUTSequence',
- x00284000: 'ImagePresentationComments',
- x00285000: 'BiPlaneAcquisitionSequence',
- x00286010: 'RepresentativeFrameNumber',
- x00286020: 'FrameNumbersOfInterest',
- x00286022: 'FrameOfInterestDescription',
- x00286023: 'FrameOfInterestType',
- x00286030: 'MaskPointers',
- x00286040: 'RWavePointer',
- x00286100: 'MaskSubtractionSequence',
- x00286101: 'MaskOperation',
- x00286102: 'ApplicableFrameRange',
- x00286110: 'MaskFrameNumbers',
- x00286112: 'ContrastFrameAveraging',
- x00286114: 'MaskSubPixelShift',
- x00286120: 'TIDOffset',
- x00286190: 'MaskOperationExplanation',
- x00287fe0: 'PixelDataProviderURL',
- x00289001: 'DataPointRows',
- x00289002: 'DataPointColumns',
- x00289003: 'SignalDomainColumns',
- x00289099: 'LargestMonochromePixelValue',
- x00289108: 'DataRepresentation',
- x00289110: 'PixelMeasuresSequence',
- x00289132: 'FrameVOILUTSequence',
- x00289145: 'PixelValueTransformationSequence',
- x00289235: 'SignalDomainRows',
- x00289411: 'DisplayFilterPercentage',
- x00289415: 'FramePixelShiftSequence',
- x00289416: 'SubtractionItemID',
- x00289422: 'PixelIntensityRelationshipLUTSeq',
- x00289443: 'FramePixelDataPropertiesSequence',
- x00289444: 'GeometricalProperties',
- x00289445: 'GeometricMaximumDistortion',
- x00289446: 'ImageProcessingApplied',
- x00289454: 'MaskSelectionMode',
- x00289474: 'LUTFunction',
- x00289478: 'MaskVisibilityPercentage',
- x00289501: 'PixelShiftSequence',
- x00289502: 'RegionPixelShiftSequence',
- x00289503: 'VerticesOfTheRegion',
- x00289506: 'PixelShiftFrameRange',
- x00289507: 'LUTFrameRange',
- x00289520: 'ImageToEquipmentMappingMatrix',
- x00289537: 'EquipmentCoordinateSystemID',
- // x00291004: 'LowerRangeOfPixels1a',
- // x00291005: 'LowerRangeOfPixels1b',
- // x00291006: 'LowerRangeOfPixels1c',
- // x00291007: 'LowerRangeOfPixels1d',
- // x00291008: 'LowerRangeOfPixels1e',
- // x00291009: 'LowerRangeOfPixels1f',
- // x0029100a: 'LowerRangeOfPixels1g',
- // x00291015: 'LowerRangeOfPixels1h',
- // x00291016: 'LowerRangeOfPixels1i',
- // x00291017: 'LowerRangeOfPixels2',
- // x00291018: 'UpperRangeOfPixels2',
- // x0029101a: 'LenOfTotHdrInBytes',
- // x00291026: 'VersionOfTheHdrStruct',
- // x00291034: 'AdvantageCompOverflow',
- // x00291035: 'AdvantageCompUnderflow',
- x00320000: 'StudyGroupLength',
- x0032000a: 'StudyStatusID',
- x0032000c: 'StudyPriorityID',
- x00320012: 'StudyIDIssuer',
- x00320032: 'StudyVerifiedDate',
- x00320033: 'StudyVerifiedTime',
- x00320034: 'StudyReadDate',
- x00320035: 'StudyReadTime',
- x00321000: 'ScheduledStudyStartDate',
- x00321001: 'ScheduledStudyStartTime',
- x00321010: 'ScheduledStudyStopDate',
- x00321011: 'ScheduledStudyStopTime',
- x00321020: 'ScheduledStudyLocation',
- x00321021: 'ScheduledStudyLocationAETitle',
- x00321030: 'ReasonForStudy',
- x00321031: 'RequestingPhysicianIDSequence',
- x00321032: 'RequestingPhysician',
- x00321033: 'RequestingService',
- x00321040: 'StudyArrivalDate',
- x00321041: 'StudyArrivalTime',
- x00321050: 'StudyCompletionDate',
- x00321051: 'StudyCompletionTime',
- x00321055: 'StudyComponentStatusID',
- x00321060: 'RequestedProcedureDescription',
- x00321064: 'RequestedProcedureCodeSequence',
- x00321070: 'RequestedContrastAgent',
- x00324000: 'StudyComments',
- x00380004: 'ReferencedPatientAliasSequence',
- x00380008: 'VisitStatusID',
- x00380010: 'AdmissionID',
- x00380011: 'IssuerOfAdmissionID',
- x00380016: 'RouteOfAdmissions',
- x0038001a: 'ScheduledAdmissionDate',
- x0038001b: 'ScheduledAdmissionTime',
- x0038001c: 'ScheduledDischargeDate',
- x0038001d: 'ScheduledDischargeTime',
- x0038001e: 'ScheduledPatientInstitResidence',
- x00380020: 'AdmittingDate',
- x00380021: 'AdmittingTime',
- x00380030: 'DischargeDate',
- x00380032: 'DischargeTime',
- x00380040: 'DischargeDiagnosisDescription',
- x00380044: 'DischargeDiagnosisCodeSequence',
- x00380050: 'SpecialNeeds',
- x00380060: 'ServiceEpisodeID',
- x00380061: 'IssuerOfServiceEpisodeID',
- x00380062: 'ServiceEpisodeDescription',
- x00380100: 'PertinentDocumentsSequence',
- x00380300: 'CurrentPatientLocation',
- x00380400: 'PatientInstitutionResidence',
- x00380500: 'PatientState',
- x00380502: 'PatientClinicalTrialParticipSeq',
- x00384000: 'VisitComments',
- x003a0004: 'WaveformOriginality',
- x003a0005: 'NumberOfWaveformChannels',
- x003a0010: 'NumberOfWaveformSamples',
- x003a001a: 'SamplingFrequency',
- x003a0020: 'MultiplexGroupLabel',
- x003a0200: 'ChannelDefinitionSequence',
- x003a0202: 'WaveformChannelNumber',
- x003a0203: 'ChannelLabel',
- x003a0205: 'ChannelStatus',
- x003a0208: 'ChannelSourceSequence',
- x003a0209: 'ChannelSourceModifiersSequence',
- x003a020a: 'SourceWaveformSequence',
- x003a020c: 'ChannelDerivationDescription',
- x003a0210: 'ChannelSensitivity',
- x003a0211: 'ChannelSensitivityUnitsSequence',
- x003a0212: 'ChannelSensitivityCorrectionFactor',
- x003a0213: 'ChannelBaseline',
- x003a0214: 'ChannelTimeSkew',
- x003a0215: 'ChannelSampleSkew',
- x003a0218: 'ChannelOffset',
- x003a021a: 'WaveformBitsStored',
- x003a0220: 'FilterLowFrequency',
- x003a0221: 'FilterHighFrequency',
- x003a0222: 'NotchFilterFrequency',
- x003a0223: 'NotchFilterBandwidth',
- x003a0230: 'WaveformDataDisplayScale',
- x003a0231: 'WaveformDisplayBkgCIELabValue',
- x003a0240: 'WaveformPresentationGroupSequence',
- x003a0241: 'PresentationGroupNumber',
- x003a0242: 'ChannelDisplaySequence',
- x003a0244: 'ChannelRecommendDisplayCIELabValue',
- x003a0245: 'ChannelPosition',
- x003a0246: 'DisplayShadingFlag',
- x003a0247: 'FractionalChannelDisplayScale',
- x003a0248: 'AbsoluteChannelDisplayScale',
- x003a0300: 'MultiplexAudioChannelsDescrCodeSeq',
- x003a0301: 'ChannelIdentificationCode',
- x003a0302: 'ChannelMode',
- x00400001: 'ScheduledStationAETitle',
- x00400002: 'ScheduledProcedureStepStartDate',
- x00400003: 'ScheduledProcedureStepStartTime',
- x00400004: 'ScheduledProcedureStepEndDate',
- x00400005: 'ScheduledProcedureStepEndTime',
- x00400006: 'ScheduledPerformingPhysiciansName',
- x00400007: 'ScheduledProcedureStepDescription',
- x00400008: 'ScheduledProtocolCodeSequence',
- x00400009: 'ScheduledProcedureStepID',
- x0040000a: 'StageCodeSequence',
- x0040000b: 'ScheduledPerformingPhysicianIDSeq',
- x00400010: 'ScheduledStationName',
- x00400011: 'ScheduledProcedureStepLocation',
- x00400012: 'PreMedication',
- x00400020: 'ScheduledProcedureStepStatus',
- x00400031: 'LocalNamespaceEntityID',
- x00400032: 'UniversalEntityID',
- x00400033: 'UniversalEntityIDType',
- x00400035: 'IdentifierTypeCode',
- x00400036: 'AssigningFacilitySequence',
- x00400100: 'ScheduledProcedureStepSequence',
- x00400220: 'ReferencedNonImageCompositeSOPSeq',
- x00400241: 'PerformedStationAETitle',
- x00400242: 'PerformedStationName',
- x00400243: 'PerformedLocation',
- x00400244: 'PerformedProcedureStepStartDate',
- x00400245: 'PerformedProcedureStepStartTime',
- x00400250: 'PerformedProcedureStepEndDate',
- x00400251: 'PerformedProcedureStepEndTime',
- x00400252: 'PerformedProcedureStepStatus',
- x00400253: 'PerformedProcedureStepID',
- x00400254: 'PerformedProcedureStepDescription',
- x00400255: 'PerformedProcedureTypeDescription',
- x00400260: 'PerformedProtocolCodeSequence',
- x00400261: 'PerformedProtocolType',
- x00400270: 'ScheduledStepAttributesSequence',
- x00400275: 'RequestAttributesSequence',
- x00400280: 'CommentsOnPerformedProcedureStep',
- x00400281: 'ProcStepDiscontinueReasonCodeSeq',
- x00400293: 'QuantitySequence',
- x00400294: 'Quantity',
- x00400295: 'MeasuringUnitsSequence',
- x00400296: 'BillingItemSequence',
- x00400300: 'TotalTimeOfFluoroscopy',
- x00400301: 'TotalNumberOfExposures',
- x00400302: 'EntranceDose',
- x00400303: 'ExposedArea',
- x00400306: 'DistanceSourceToEntrance',
- x00400307: 'DistanceSourceToSupport',
- x0040030e: 'ExposureDoseSequence',
- x00400310: 'CommentsOnRadiationDose',
- x00400312: 'XRayOutput',
- x00400314: 'HalfValueLayer',
- x00400316: 'OrganDose',
- x00400318: 'OrganExposed',
- x00400320: 'BillingProcedureStepSequence',
- x00400321: 'FilmConsumptionSequence',
- x00400324: 'BillingSuppliesAndDevicesSequence',
- x00400330: 'ReferencedProcedureStepSequence',
- x00400340: 'PerformedSeriesSequence',
- x00400400: 'CommentsOnScheduledProcedureStep',
- x00400440: 'ProtocolContextSequence',
- x00400441: 'ContentItemModifierSequence',
- x0040050a: 'SpecimenAccessionNumber',
- x00400512: 'ContainerIdentifier',
- x0040051a: 'ContainerDescription',
- x00400550: 'SpecimenSequence',
- x00400551: 'SpecimenIdentifier',
- x00400552: 'SpecimenDescriptionSequenceTrial',
- x00400553: 'SpecimenDescriptionTrial',
- x00400554: 'SpecimenUID',
- x00400555: 'AcquisitionContextSequence',
- x00400556: 'AcquisitionContextDescription',
- x0040059a: 'SpecimenTypeCodeSequence',
- x00400600: 'SpecimenShortDescription',
- x004006fa: 'SlideIdentifier',
- x0040071a: 'ImageCenterPointCoordinatesSeq',
- x0040072a: 'XOffsetInSlideCoordinateSystem',
- x0040073a: 'YOffsetInSlideCoordinateSystem',
- x0040074a: 'ZOffsetInSlideCoordinateSystem',
- x004008d8: 'PixelSpacingSequence',
- x004008da: 'CoordinateSystemAxisCodeSequence',
- x004008ea: 'MeasurementUnitsCodeSequence',
- x004009f8: 'VitalStainCodeSequenceTrial',
- x00401001: 'RequestedProcedureID',
- x00401002: 'ReasonForRequestedProcedure',
- x00401003: 'RequestedProcedurePriority',
- x00401004: 'PatientTransportArrangements',
- x00401005: 'RequestedProcedureLocation',
- x00401006: 'PlacerOrderNumber-Procedure',
- x00401007: 'FillerOrderNumber-Procedure',
- x00401008: 'ConfidentialityCode',
- x00401009: 'ReportingPriority',
- x0040100a: 'ReasonForRequestedProcedureCodeSeq',
- x00401010: 'NamesOfIntendedRecipientsOfResults',
- x00401011: 'IntendedRecipientsOfResultsIDSeq',
- x00401101: 'PersonIdentificationCodeSequence',
- x00401102: 'PersonAddress',
- x00401103: 'PersonTelephoneNumbers',
- x00401400: 'RequestedProcedureComments',
- x00402001: 'ReasonForImagingServiceRequest',
- x00402004: 'IssueDateOfImagingServiceRequest',
- x00402005: 'IssueTimeOfImagingServiceRequest',
- x00402006: 'PlacerOrderNumberImagingServiceRequestRetired',
- x00402007: 'FillerOrderNumberImagingServiceRequestRetired',
- x00402008: 'OrderEnteredBy',
- x00402009: 'OrderEntererLocation',
- x00402010: 'OrderCallbackPhoneNumber',
- x00402016: 'PlacerOrderNum-ImagingServiceReq',
- x00402017: 'FillerOrderNum-ImagingServiceReq',
- x00402400: 'ImagingServiceRequestComments',
- x00403001: 'ConfidentialityOnPatientDataDescr',
- x00404001: 'GenPurposeScheduledProcStepStatus',
- x00404002: 'GenPurposePerformedProcStepStatus',
- x00404003: 'GenPurposeSchedProcStepPriority',
- x00404004: 'SchedProcessingApplicationsCodeSeq',
- x00404005: 'SchedProcedureStepStartDateAndTime',
- x00404006: 'MultipleCopiesFlag',
- x00404007: 'PerformedProcessingAppsCodeSeq',
- x00404009: 'HumanPerformerCodeSequence',
- x00404010: 'SchedProcStepModificationDateTime',
- x00404011: 'ExpectedCompletionDateAndTime',
- x00404015: 'ResultingGenPurposePerfProcStepSeq',
- x00404016: 'RefGenPurposeSchedProcStepSeq',
- x00404018: 'ScheduledWorkitemCodeSequence',
- x00404019: 'PerformedWorkitemCodeSequence',
- x00404020: 'InputAvailabilityFlag',
- x00404021: 'InputInformationSequence',
- x00404022: 'RelevantInformationSequence',
- x00404023: 'RefGenPurSchedProcStepTransUID',
- x00404025: 'ScheduledStationNameCodeSequence',
- x00404026: 'ScheduledStationClassCodeSequence',
- x00404027: 'SchedStationGeographicLocCodeSeq',
- x00404028: 'PerformedStationNameCodeSequence',
- x00404029: 'PerformedStationClassCodeSequence',
- x00404030: 'PerformedStationGeogLocCodeSeq',
- x00404031: 'RequestedSubsequentWorkItemCodeSeq',
- x00404032: 'NonDICOMOutputCodeSequence',
- x00404033: 'OutputInformationSequence',
- x00404034: 'ScheduledHumanPerformersSequence',
- x00404035: 'ActualHumanPerformersSequence',
- x00404036: 'HumanPerformersOrganization',
- x00404037: 'HumanPerformerName',
- x00404040: 'RawDataHandling',
- x00408302: 'EntranceDoseInMilliGy',
- x00409094: 'RefImageRealWorldValueMappingSeq',
- x00409096: 'RealWorldValueMappingSequence',
- x00409098: 'PixelValueMappingCodeSequence',
- x00409210: 'LUTLabel',
- x00409211: 'RealWorldValueLastValueMapped',
- x00409212: 'RealWorldValueLUTData',
- x00409216: 'RealWorldValueFirstValueMapped',
- x00409224: 'RealWorldValueIntercept',
- x00409225: 'RealWorldValueSlope',
- x0040a010: 'RelationshipType',
- x0040a027: 'VerifyingOrganization',
- x0040a030: 'VerificationDateTime',
- x0040a032: 'ObservationDateTime',
- x0040a040: 'ValueType',
- x0040a043: 'ConceptNameCodeSequence',
- x0040a050: 'ContinuityOfContent',
- x0040a073: 'VerifyingObserverSequence',
- x0040a075: 'VerifyingObserverName',
- x0040a078: 'AuthorObserverSequence',
- x0040a07a: 'ParticipantSequence',
- x0040a07c: 'CustodialOrganizationSequence',
- x0040a080: 'ParticipationType',
- x0040a082: 'ParticipationDateTime',
- x0040a084: 'ObserverType',
- x0040a088: 'VerifyingObserverIdentCodeSequence',
- x0040a090: 'EquivalentCDADocumentSequence',
- x0040a0b0: 'ReferencedWaveformChannels',
- x0040a120: 'DateTime',
- x0040a121: 'Date',
- x0040a122: 'Time',
- x0040a123: 'PersonName',
- x0040a124: 'UID',
- x0040a130: 'TemporalRangeType',
- x0040a132: 'ReferencedSamplePositions',
- x0040a136: 'ReferencedFrameNumbers',
- x0040a138: 'ReferencedTimeOffsets',
- x0040a13a: 'ReferencedDateTime',
- x0040a160: 'TextValue',
- x0040a168: 'ConceptCodeSequence',
- x0040a170: 'PurposeOfReferenceCodeSequence',
- x0040a180: 'AnnotationGroupNumber',
- x0040a195: 'ModifierCodeSequence',
- x0040a300: 'MeasuredValueSequence',
- x0040a301: 'NumericValueQualifierCodeSequence',
- x0040a30a: 'NumericValue',
- x0040a353: 'AddressTrial',
- x0040a354: 'TelephoneNumberTrial',
- x0040a360: 'PredecessorDocumentsSequence',
- x0040a370: 'ReferencedRequestSequence',
- x0040a372: 'PerformedProcedureCodeSequence',
- x0040a375: 'CurrentRequestedProcEvidenceSeq',
- x0040a385: 'PertinentOtherEvidenceSequence',
- x0040a390: 'HL7StructuredDocumentRefSeq',
- x0040a491: 'CompletionFlag',
- x0040a492: 'CompletionFlagDescription',
- x0040a493: 'VerificationFlag',
- x0040a494: 'ArchiveRequested',
- x0040a496: 'PreliminaryFlag',
- x0040a504: 'ContentTemplateSequence',
- x0040a525: 'IdenticalDocumentsSequence',
- x0040a730: 'ContentSequence',
- x0040b020: 'AnnotationSequence',
- x0040db00: 'TemplateIdentifier',
- x0040db06: 'TemplateVersion',
- x0040db07: 'TemplateLocalVersion',
- x0040db0b: 'TemplateExtensionFlag',
- x0040db0c: 'TemplateExtensionOrganizationUID',
- x0040db0d: 'TemplateExtensionCreatorUID',
- x0040db73: 'ReferencedContentItemIdentifier',
- x0040e001: 'HL7InstanceIdentifier',
- x0040e004: 'HL7DocumentEffectiveTime',
- x0040e006: 'HL7DocumentTypeCodeSequence',
- x0040e010: 'RetrieveURI',
- x0040e011: 'RetrieveLocationUID',
- x00420010: 'DocumentTitle',
- x00420011: 'EncapsulatedDocument',
- x00420012: 'MIMETypeOfEncapsulatedDocument',
- x00420013: 'SourceInstanceSequence',
- x00420014: 'ListOfMIMETypes',
- // x00431001: 'BitmapOfPrescanOptions',
- // x00431002: 'GradientOffsetInX',
- // x00431003: 'GradientOffsetInY',
- // x00431004: 'GradientOffsetInZ',
- // x00431005: 'ImgIsOriginalOrUnoriginal',
- // x00431006: 'NumberOfEPIShots',
- // x00431007: 'ViewsPerSegment',
- // x00431008: 'RespiratoryRateBpm',
- // x00431009: 'RespiratoryTriggerPoint',
- // x0043100a: 'TypeOfReceiverUsed',
- // x0043100b: 'PeakRateOfChangeOfGradientField',
- // x0043100c: 'LimitsInUnitsOfPercent',
- // x0043100d: 'PSDEstimatedLimit',
- // x0043100e: 'PSDEstimatedLimitInTeslaPerSecond',
- // x0043100f: 'Saravghead',
- // x00431010: 'WindowValue',
- // x00431011: 'TotalInputViews',
- // x00431012: 'X-RayChain',
- // x00431013: 'DeconKernelParameters',
- // x00431014: 'CalibrationParameters',
- // x00431015: 'TotalOutputViews',
- // x00431016: 'NumberOfOverranges',
- // x00431017: 'IBHImageScaleFactors',
- // x00431018: 'BBHCoefficients',
- // x00431019: 'NumberOfBBHChainsToBlend',
- // x0043101a: 'StartingChannelNumber',
- // x0043101b: 'PpscanParameters',
- // x0043101c: 'GEImageIntegrity',
- // x0043101d: 'LevelValue',
- // x0043101e: 'DeltaStartTime',
- // x0043101f: 'MaxOverrangesInAView',
- // x00431020: 'AvgOverrangesAllViews',
- // x00431021: 'CorrectedAfterGlowTerms',
- // x00431025: 'ReferenceChannels',
- // x00431026: 'NoViewsRefChansBlocked',
- // x00431027: 'ScanPitchRatio',
- // x00431028: 'UniqueImageIden',
- // x00431029: 'HistogramTables',
- // x0043102a: 'UserDefinedData',
- // x0043102b: 'PrivateScanOptions',
- // x0043102c: 'EffectiveEchoSpacing',
- // x0043102d: 'StringSlopField1',
- // x0043102e: 'StringSlopField2',
- // x0043102f: 'RawDataType',
- // x00431030: 'RawDataType',
- // x00431031: 'RACordOfTargetReconCenter',
- // x00431032: 'RawDataType',
- // x00431033: 'NegScanspacing',
- // x00431034: 'OffsetFrequency',
- // x00431035: 'UserUsageTag',
- // x00431036: 'UserFillMapMSW',
- // x00431037: 'UserFillMapLSW',
- // x00431038: 'User25-48',
- // x00431039: 'SlopInt6-9',
- // x00431040: 'TriggerOnPosition',
- // x00431041: 'DegreeOfRotation',
- // x00431042: 'DASTriggerSource',
- // x00431043: 'DASFpaGain',
- // x00431044: 'DASOutputSource',
- // x00431045: 'DASAdInput',
- // x00431046: 'DASCalMode',
- // x00431047: 'DASCalFrequency',
- // x00431048: 'DASRegXm',
- // x00431049: 'DASAutoZero',
- // x0043104a: 'StartingChannelOfView',
- // x0043104b: 'DASXmPattern',
- // x0043104c: 'TGGCTriggerMode',
- // x0043104d: 'StartScanToXrayOnDelay',
- // x0043104e: 'DurationOfXrayOn',
- // x00431060: 'SlopInt10-17',
- // x00431061: 'ScannerStudyEntityUID',
- // x00431062: 'ScannerStudyID',
- // x0043106f: 'ScannerTableEntry',
- x00440001: 'ProductPackageIdentifier',
- x00440002: 'SubstanceAdministrationApproval',
- x00440003: 'ApprovalStatusFurtherDescription',
- x00440004: 'ApprovalStatusDateTime',
- x00440007: 'ProductTypeCodeSequence',
- x00440008: 'ProductName',
- x00440009: 'ProductDescription',
- x0044000a: 'ProductLotIdentifier',
- x0044000b: 'ProductExpirationDateTime',
- x00440010: 'SubstanceAdministrationDateTime',
- x00440011: 'SubstanceAdministrationNotes',
- x00440012: 'SubstanceAdministrationDeviceID',
- x00440013: 'ProductParameterSequence',
- x00440019: 'SubstanceAdminParameterSeq',
- // x00451001: 'NumberOfMacroRowsInDetector',
- // x00451002: 'MacroWidthAtISOCenter',
- // x00451003: 'DASType',
- // x00451004: 'DASGain',
- // x00451005: 'DASTemperature',
- // x00451006: 'TableDirectionInOrOut',
- // x00451007: 'ZSmoothingFactor',
- // x00451008: 'ViewWeightingMode',
- // x00451009: 'SigmaRowNumberWhichRowsWereUsed',
- // x0045100a: 'MinimumDasValueFoundInTheScanData',
- // x0045100b: 'MaximumOffsetShiftValueUsed',
- // x0045100c: 'NumberOfViewsShifted',
- // x0045100d: 'ZTrackingFlag',
- // x0045100e: 'MeanZError',
- // x0045100f: 'ZTrackingMaximumError',
- // x00451010: 'StartingViewForRow2a',
- // x00451011: 'NumberOfViewsInRow2a',
- // x00451012: 'StartingViewForRow1a',
- // x00451013: 'SigmaMode',
- // x00451014: 'NumberOfViewsInRow1a',
- // x00451015: 'StartingViewForRow2b',
- // x00451016: 'NumberOfViewsInRow2b',
- // x00451017: 'StartingViewForRow1b',
- // x00451018: 'NumberOfViewsInRow1b',
- // x00451019: 'AirFilterCalibrationDate',
- // x0045101a: 'AirFilterCalibrationTime',
- // x0045101b: 'PhantomCalibrationDate',
- // x0045101c: 'PhantomCalibrationTime',
- // x0045101d: 'ZSlopeCalibrationDate',
- // x0045101e: 'ZSlopeCalibrationTime',
- // x0045101f: 'CrosstalkCalibrationDate',
- // x00451020: 'CrosstalkCalibrationTime',
- // x00451021: 'IterboneOptionFlag',
- // x00451022: 'PeristalticFlagOption',
- x00460012: 'LensDescription',
- x00460014: 'RightLensSequence',
- x00460015: 'LeftLensSequence',
- x00460018: 'CylinderSequence',
- x00460028: 'PrismSequence',
- x00460030: 'HorizontalPrismPower',
- x00460032: 'HorizontalPrismBase',
- x00460034: 'VerticalPrismPower',
- x00460036: 'VerticalPrismBase',
- x00460038: 'LensSegmentType',
- x00460040: 'OpticalTransmittance',
- x00460042: 'ChannelWidth',
- x00460044: 'PupilSize',
- x00460046: 'CornealSize',
- x00460060: 'DistancePupillaryDistance',
- x00460062: 'NearPupillaryDistance',
- x00460064: 'OtherPupillaryDistance',
- x00460075: 'RadiusOfCurvature',
- x00460076: 'KeratometricPower',
- x00460077: 'KeratometricAxis',
- x00460092: 'BackgroundColor',
- x00460094: 'Optotype',
- x00460095: 'OptotypePresentation',
- x00460100: 'AddNearSequence',
- x00460101: 'AddIntermediateSequence',
- x00460102: 'AddOtherSequence',
- x00460104: 'AddPower',
- x00460106: 'ViewingDistance',
- x00460125: 'ViewingDistanceType',
- x00460135: 'VisualAcuityModifiers',
- x00460137: 'DecimalVisualAcuity',
- x00460139: 'OptotypeDetailedDefinition',
- x00460146: 'SpherePower',
- x00460147: 'CylinderPower',
- x00500004: 'CalibrationImage',
- x00500010: 'DeviceSequence',
- x00500014: 'DeviceLength',
- x00500015: 'ContainerComponentWidth',
- x00500016: 'DeviceDiameter',
- x00500017: 'DeviceDiameterUnits',
- x00500018: 'DeviceVolume',
- x00500019: 'InterMarkerDistance',
- x0050001b: 'ContainerComponentID',
- x00500020: 'DeviceDescription',
- x00540010: 'EnergyWindowVector',
- x00540011: 'NumberOfEnergyWindows',
- x00540012: 'EnergyWindowInformationSequence',
- x00540013: 'EnergyWindowRangeSequence',
- x00540014: 'EnergyWindowLowerLimit',
- x00540015: 'EnergyWindowUpperLimit',
- x00540016: 'RadiopharmaceuticalInformationSeq',
- x00540017: 'ResidualSyringeCounts',
- x00540018: 'EnergyWindowName',
- x00540020: 'DetectorVector',
- x00540021: 'NumberOfDetectors',
- x00540022: 'DetectorInformationSequence',
- x00540030: 'PhaseVector',
- x00540031: 'NumberOfPhases',
- x00540032: 'PhaseInformationSequence',
- x00540033: 'NumberOfFramesInPhase',
- x00540036: 'PhaseDelay',
- x00540038: 'PauseBetweenFrames',
- x00540039: 'PhaseDescription',
- x00540050: 'RotationVector',
- x00540051: 'NumberOfRotations',
- x00540052: 'RotationInformationSequence',
- x00540053: 'NumberOfFramesInRotation',
- x00540060: 'RRIntervalVector',
- x00540061: 'NumberOfRRIntervals',
- x00540062: 'GatedInformationSequence',
- x00540063: 'DataInformationSequence',
- x00540070: 'TimeSlotVector',
- x00540071: 'NumberOfTimeSlots',
- x00540072: 'TimeSlotInformationSequence',
- x00540073: 'TimeSlotTime',
- x00540080: 'SliceVector',
- x00540081: 'NumberOfSlices',
- x00540090: 'AngularViewVector',
- x00540100: 'TimeSliceVector',
- x00540101: 'NumberOfTimeSlices',
- x00540200: 'StartAngle',
- x00540202: 'TypeOfDetectorMotion',
- x00540210: 'TriggerVector',
- x00540211: 'NumberOfTriggersInPhase',
- x00540220: 'ViewCodeSequence',
- x00540222: 'ViewModifierCodeSequence',
- x00540300: 'RadionuclideCodeSequence',
- x00540302: 'AdministrationRouteCodeSequence',
- x00540304: 'RadiopharmaceuticalCodeSequence',
- x00540306: 'CalibrationDataSequence',
- x00540308: 'EnergyWindowNumber',
- x00540400: 'ImageID',
- x00540410: 'PatientOrientationCodeSequence',
- x00540412: 'PatientOrientationModifierCodeSeq',
- x00540414: 'PatientGantryRelationshipCodeSeq',
- x00540500: 'SliceProgressionDirection',
- x00541000: 'SeriesType',
- x00541001: 'Units',
- x00541002: 'CountsSource',
- x00541004: 'ReprojectionMethod',
- x00541100: 'RandomsCorrectionMethod',
- x00541101: 'AttenuationCorrectionMethod',
- x00541102: 'DecayCorrection',
- x00541103: 'ReconstructionMethod',
- x00541104: 'DetectorLinesOfResponseUsed',
- x00541105: 'ScatterCorrectionMethod',
- x00541200: 'AxialAcceptance',
- x00541201: 'AxialMash',
- x00541202: 'TransverseMash',
- x00541203: 'DetectorElementSize',
- x00541210: 'CoincidenceWindowWidth',
- x00541220: 'SecondaryCountsType',
- x00541300: 'FrameReferenceTime',
- x00541310: 'PrimaryCountsAccumulated',
- x00541311: 'SecondaryCountsAccumulated',
- x00541320: 'SliceSensitivityFactor',
- x00541321: 'DecayFactor',
- x00541322: 'DoseCalibrationFactor',
- x00541323: 'ScatterFractionFactor',
- x00541324: 'DeadTimeFactor',
- x00541330: 'ImageIndex',
- x00541400: 'CountsIncluded',
- x00541401: 'DeadTimeCorrectionFlag',
- x00603000: 'HistogramSequence',
- x00603002: 'HistogramNumberOfBins',
- x00603004: 'HistogramFirstBinValue',
- x00603006: 'HistogramLastBinValue',
- x00603008: 'HistogramBinWidth',
- x00603010: 'HistogramExplanation',
- x00603020: 'HistogramData',
- x00620001: 'SegmentationType',
- x00620002: 'SegmentSequence',
- x00620003: 'SegmentedPropertyCategoryCodeSeq',
- x00620004: 'SegmentNumber',
- x00620005: 'SegmentLabel',
- x00620006: 'SegmentDescription',
- x00620008: 'SegmentAlgorithmType',
- x00620009: 'SegmentAlgorithmName',
- x0062000a: 'SegmentIdentificationSequence',
- x0062000b: 'ReferencedSegmentNumber',
- x0062000c: 'RecommendedDisplayGrayscaleValue',
- x0062000d: 'RecommendedDisplayCIELabValue',
- x0062000e: 'MaximumFractionalValue',
- x0062000f: 'SegmentedPropertyTypeCodeSequence',
- x00620010: 'SegmentationFractionalType',
- x00640002: 'DeformableRegistrationSequence',
- x00640003: 'SourceFrameOfReferenceUID',
- x00640005: 'DeformableRegistrationGridSequence',
- x00640007: 'GridDimensions',
- x00640008: 'GridResolution',
- x00640009: 'VectorGridData',
- x0064000f: 'PreDeformationMatrixRegistSeq',
- x00640010: 'PostDeformationMatrixRegistSeq',
- x00660001: 'NumberOfSurfaces',
- x00660002: 'SurfaceSequence',
- x00660003: 'SurfaceNumber',
- x00660004: 'SurfaceComments',
- x00660009: 'SurfaceProcessing',
- x0066000a: 'SurfaceProcessingRatio',
- x0066000e: 'FiniteVolume',
- x00660010: 'Manifold',
- x00660011: 'SurfacePointsSequence',
- x00660015: 'NumberOfSurfacePoints',
- x00660016: 'PointCoordinatesData',
- x00660017: 'PointPositionAccuracy',
- x00660018: 'MeanPointDistance',
- x00660019: 'MaximumPointDistance',
- x0066001b: 'AxisOfRotation',
- x0066001c: 'CenterOfRotation',
- x0066001e: 'NumberOfVectors',
- x0066001f: 'VectorDimensionality',
- x00660020: 'VectorAccuracy',
- x00660021: 'VectorCoordinateData',
- x00660023: 'TrianglePointIndexList',
- x00660024: 'EdgePointIndexList',
- x00660025: 'VertexPointIndexList',
- x00660026: 'TriangleStripSequence',
- x00660027: 'TriangleFanSequence',
- x00660028: 'LineSequence',
- x00660029: 'PrimitivePointIndexList',
- x0066002a: 'SurfaceCount',
- x0066002f: 'AlgorithmFamilyCodeSequ',
- x00660031: 'AlgorithmVersion',
- x00660032: 'AlgorithmParameters',
- x00660034: 'FacetSequence',
- x00660036: 'AlgorithmName',
- x00700001: 'GraphicAnnotationSequence',
- x00700002: 'GraphicLayer',
- x00700003: 'BoundingBoxAnnotationUnits',
- x00700004: 'AnchorPointAnnotationUnits',
- x00700005: 'GraphicAnnotationUnits',
- x00700006: 'UnformattedTextValue',
- x00700008: 'TextObjectSequence',
- x00700009: 'GraphicObjectSequence',
- x00700010: 'BoundingBoxTopLeftHandCorner',
- x00700011: 'BoundingBoxBottomRightHandCorner',
- x00700012: 'BoundingBoxTextHorizJustification',
- x00700014: 'AnchorPoint',
- x00700015: 'AnchorPointVisibility',
- x00700020: 'GraphicDimensions',
- x00700021: 'NumberOfGraphicPoints',
- x00700022: 'GraphicData',
- x00700023: 'GraphicType',
- x00700024: 'GraphicFilled',
- x00700040: 'ImageRotationRetired',
- x00700041: 'ImageHorizontalFlip',
- x00700042: 'ImageRotation',
- x00700050: 'DisplayedAreaTopLeftTrial',
- x00700051: 'DisplayedAreaBottomRightTrial',
- x00700052: 'DisplayedAreaTopLeft',
- x00700053: 'DisplayedAreaBottomRight',
- x0070005a: 'DisplayedAreaSelectionSequence',
- x00700060: 'GraphicLayerSequence',
- x00700062: 'GraphicLayerOrder',
- x00700066: 'GraphicLayerRecDisplayGraysclValue',
- x00700067: 'GraphicLayerRecDisplayRGBValue',
- x00700068: 'GraphicLayerDescription',
- x00700080: 'ContentLabel',
- x00700081: 'ContentDescription',
- x00700082: 'PresentationCreationDate',
- x00700083: 'PresentationCreationTime',
- x00700084: 'ContentCreatorName',
- x00700086: 'ContentCreatorIDCodeSequence',
- x00700100: 'PresentationSizeMode',
- x00700101: 'PresentationPixelSpacing',
- x00700102: 'PresentationPixelAspectRatio',
- x00700103: 'PresentationPixelMagRatio',
- x00700306: 'ShapeType',
- x00700308: 'RegistrationSequence',
- x00700309: 'MatrixRegistrationSequence',
- x0070030a: 'MatrixSequence',
- x0070030c: 'FrameOfRefTransformationMatrixType',
- x0070030d: 'RegistrationTypeCodeSequence',
- x0070030f: 'FiducialDescription',
- x00700310: 'FiducialIdentifier',
- x00700311: 'FiducialIdentifierCodeSequence',
- x00700312: 'ContourUncertaintyRadius',
- x00700314: 'UsedFiducialsSequence',
- x00700318: 'GraphicCoordinatesDataSequence',
- x0070031a: 'FiducialUID',
- x0070031c: 'FiducialSetSequence',
- x0070031e: 'FiducialSequence',
- x00700401: 'GraphicLayerRecomDisplayCIELabVal',
- x00700402: 'BlendingSequence',
- x00700403: 'RelativeOpacity',
- x00700404: 'ReferencedSpatialRegistrationSeq',
- x00700405: 'BlendingPosition',
- x00720002: 'HangingProtocolName',
- x00720004: 'HangingProtocolDescription',
- x00720006: 'HangingProtocolLevel',
- x00720008: 'HangingProtocolCreator',
- x0072000a: 'HangingProtocolCreationDateTime',
- x0072000c: 'HangingProtocolDefinitionSequence',
- x0072000e: 'HangingProtocolUserIDCodeSequence',
- x00720010: 'HangingProtocolUserGroupName',
- x00720012: 'SourceHangingProtocolSequence',
- x00720014: 'NumberOfPriorsReferenced',
- x00720020: 'ImageSetsSequence',
- x00720022: 'ImageSetSelectorSequence',
- x00720024: 'ImageSetSelectorUsageFlag',
- x00720026: 'SelectorAttribute',
- x00720028: 'SelectorValueNumber',
- x00720030: 'TimeBasedImageSetsSequence',
- x00720032: 'ImageSetNumber',
- x00720034: 'ImageSetSelectorCategory',
- x00720038: 'RelativeTime',
- x0072003a: 'RelativeTimeUnits',
- x0072003c: 'AbstractPriorValue',
- x0072003e: 'AbstractPriorCodeSequence',
- x00720040: 'ImageSetLabel',
- x00720050: 'SelectorAttributeVR',
- x00720052: 'SelectorSequencePointer',
- x00720054: 'SelectorSeqPointerPrivateCreator',
- x00720056: 'SelectorAttributePrivateCreator',
- x00720060: 'SelectorATValue',
- x00720062: 'SelectorCSValue',
- x00720064: 'SelectorISValue',
- x00720066: 'SelectorLOValue',
- x00720068: 'SelectorLTValue',
- x0072006a: 'SelectorPNValue',
- x0072006c: 'SelectorSHValue',
- x0072006e: 'SelectorSTValue',
- x00720070: 'SelectorUTValue',
- x00720072: 'SelectorDSValue',
- x00720074: 'SelectorFDValue',
- x00720076: 'SelectorFLValue',
- x00720078: 'SelectorULValue',
- x0072007a: 'SelectorUSValue',
- x0072007c: 'SelectorSLValue',
- x0072007e: 'SelectorSSValue',
- x00720080: 'SelectorCodeSequenceValue',
- x00720100: 'NumberOfScreens',
- x00720102: 'NominalScreenDefinitionSequence',
- x00720104: 'NumberOfVerticalPixels',
- x00720106: 'NumberOfHorizontalPixels',
- x00720108: 'DisplayEnvironmentSpatialPosition',
- x0072010a: 'ScreenMinimumGrayscaleBitDepth',
- x0072010c: 'ScreenMinimumColorBitDepth',
- x0072010e: 'ApplicationMaximumRepaintTime',
- x00720200: 'DisplaySetsSequence',
- x00720202: 'DisplaySetNumber',
- x00720203: 'DisplaySetLabel',
- x00720204: 'DisplaySetPresentationGroup',
- x00720206: 'DisplaySetPresentationGroupDescr',
- x00720208: 'PartialDataDisplayHandling',
- x00720210: 'SynchronizedScrollingSequence',
- x00720212: 'DisplaySetScrollingGroup',
- x00720214: 'NavigationIndicatorSequence',
- x00720216: 'NavigationDisplaySet',
- x00720218: 'ReferenceDisplaySets',
- x00720300: 'ImageBoxesSequence',
- x00720302: 'ImageBoxNumber',
- x00720304: 'ImageBoxLayoutType',
- x00720306: 'ImageBoxTileHorizontalDimension',
- x00720308: 'ImageBoxTileVerticalDimension',
- x00720310: 'ImageBoxScrollDirection',
- x00720312: 'ImageBoxSmallScrollType',
- x00720314: 'ImageBoxSmallScrollAmount',
- x00720316: 'ImageBoxLargeScrollType',
- x00720318: 'ImageBoxLargeScrollAmount',
- x00720320: 'ImageBoxOverlapPriority',
- x00720330: 'CineRelativeToRealTime',
- x00720400: 'FilterOperationsSequence',
- x00720402: 'FilterByCategory',
- x00720404: 'FilterByAttributePresence',
- x00720406: 'FilterByOperator',
- x00720432: 'SynchronizedImageBoxList',
- x00720434: 'TypeOfSynchronization',
- x00720500: 'BlendingOperationType',
- x00720510: 'ReformattingOperationType',
- x00720512: 'ReformattingThickness',
- x00720514: 'ReformattingInterval',
- x00720516: 'ReformattingOpInitialViewDir',
- x00720520: 'RenderingType3D',
- x00720600: 'SortingOperationsSequence',
- x00720602: 'SortByCategory',
- x00720604: 'SortingDirection',
- x00720700: 'DisplaySetPatientOrientation',
- x00720702: 'VOIType',
- x00720704: 'PseudoColorType',
- x00720706: 'ShowGrayscaleInverted',
- x00720710: 'ShowImageTrueSizeFlag',
- x00720712: 'ShowGraphicAnnotationFlag',
- x00720714: 'ShowPatientDemographicsFlag',
- x00720716: 'ShowAcquisitionTechniquesFlag',
- x00720717: 'DisplaySetHorizontalJustification',
- x00720718: 'DisplaySetVerticalJustification',
- x00741000: 'UnifiedProcedureStepState',
- x00741002: 'UPSProgressInformationSequence',
- x00741004: 'UnifiedProcedureStepProgress',
- x00741006: 'UnifiedProcedureStepProgressDescr',
- x00741008: 'UnifiedProcedureStepComURISeq',
- x0074100a: 'ContactURI',
- x0074100c: 'ContactDisplayName',
- x00741020: 'BeamTaskSequence',
- x00741022: 'BeamTaskType',
- x00741024: 'BeamOrderIndex',
- x00741030: 'DeliveryVerificationImageSequence',
- x00741032: 'VerificationImageTiming',
- x00741034: 'DoubleExposureFlag',
- x00741036: 'DoubleExposureOrdering',
- x00741038: 'DoubleExposureMeterset',
- x0074103a: 'DoubleExposureFieldDelta',
- x00741040: 'RelatedReferenceRTImageSequence',
- x00741042: 'GeneralMachineVerificationSequence',
- x00741044: 'ConventionalMachineVerificationSeq',
- x00741046: 'IonMachineVerificationSequence',
- x00741048: 'FailedAttributesSequence',
- x0074104a: 'OverriddenAttributesSequence',
- x0074104c: 'ConventionalControlPointVerifySeq',
- x0074104e: 'IonControlPointVerificationSeq',
- x00741050: 'AttributeOccurrenceSequence',
- x00741052: 'AttributeOccurrencePointer',
- x00741054: 'AttributeItemSelector',
- x00741056: 'AttributeOccurrencePrivateCreator',
- x00741200: 'ScheduledProcedureStepPriority',
- x00741202: 'StudyListLabel',
- x00741204: 'ProcedureStepLabel',
- x00741210: 'ScheduledProcessingParametersSeq',
- x00741212: 'PerformedProcessingParametersSeq',
- x00741216: 'UPSPerformedProcedureSequence',
- x00741220: 'RelatedProcedureStepSequence',
- x00741222: 'ProcedureStepRelationshipType',
- x00741230: 'DeletionLock',
- x00741234: 'ReceivingAE',
- x00741236: 'RequestingAE',
- x00741238: 'ReasonForCancellation',
- x00741242: 'SCPStatus',
- x00741244: 'SubscriptionListStatus',
- x00741246: 'UPSListStatus',
- x00880130: 'StorageMediaFileSetID',
- x00880140: 'StorageMediaFileSetUID',
- x00880200: 'IconImageSequence',
- x00880904: 'TopicTitle',
- x00880906: 'TopicSubject',
- x00880910: 'TopicAuthor',
- x00880912: 'TopicKeywords',
- x01000410: 'SOPInstanceStatus',
- x01000420: 'SOPAuthorizationDateAndTime',
- x01000424: 'SOPAuthorizationComment',
- x01000426: 'AuthorizationEquipmentCertNumber',
- x04000005: 'MACIDNumber',
- x04000010: 'MACCalculationTransferSyntaxUID',
- x04000015: 'MACAlgorithm',
- x04000020: 'DataElementsSigned',
- x04000100: 'DigitalSignatureUID',
- x04000105: 'DigitalSignatureDateTime',
- x04000110: 'CertificateType',
- x04000115: 'CertificateOfSigner',
- x04000120: 'Signature',
- x04000305: 'CertifiedTimestampType',
- x04000310: 'CertifiedTimestamp',
- x04000401: 'DigitalSignaturePurposeCodeSeq',
- x04000402: 'ReferencedDigitalSignatureSeq',
- x04000403: 'ReferencedSOPInstanceMACSeq',
- x04000404: 'MAC',
- x04000500: 'EncryptedAttributesSequence',
- x04000510: 'EncryptedContentTransferSyntaxUID',
- x04000520: 'EncryptedContent',
- x04000550: 'ModifiedAttributesSequence',
- x04000561: 'OriginalAttributesSequence',
- x04000562: 'AttributeModificationDateTime',
- x04000563: 'ModifyingSystem',
- x04000564: 'SourceOfPreviousValues',
- x04000565: 'ReasonForTheAttributeModification',
- x1000xxx0: 'EscapeTriplet',
- x1000xxx1: 'RunLengthTriplet',
- x1000xxx2: 'HuffmanTableSize',
- x1000xxx3: 'HuffmanTableTriplet',
- x1000xxx4: 'ShiftTableSize',
- x1000xxx5: 'ShiftTableTriplet',
- x1010xxxx: 'ZonalMap',
- x20000010: 'NumberOfCopies',
- x2000001e: 'PrinterConfigurationSequence',
- x20000020: 'PrintPriority',
- x20000030: 'MediumType',
- x20000040: 'FilmDestination',
- x20000050: 'FilmSessionLabel',
- x20000060: 'MemoryAllocation',
- x20000061: 'MaximumMemoryAllocation',
- x20000062: 'ColorImagePrintingFlag',
- x20000063: 'CollationFlag',
- x20000065: 'AnnotationFlag',
- x20000067: 'ImageOverlayFlag',
- x20000069: 'PresentationLUTFlag',
- x2000006a: 'ImageBoxPresentationLUTFlag',
- x200000a0: 'MemoryBitDepth',
- x200000a1: 'PrintingBitDepth',
- x200000a2: 'MediaInstalledSequence',
- x200000a4: 'OtherMediaAvailableSequence',
- x200000a8: 'SupportedImageDisplayFormatSeq',
- x20000500: 'ReferencedFilmBoxSequence',
- x20000510: 'ReferencedStoredPrintSequence',
- x20100010: 'ImageDisplayFormat',
- x20100030: 'AnnotationDisplayFormatID',
- x20100040: 'FilmOrientation',
- x20100050: 'FilmSizeID',
- x20100052: 'PrinterResolutionID',
- x20100054: 'DefaultPrinterResolutionID',
- x20100060: 'MagnificationType',
- x20100080: 'SmoothingType',
- x201000a6: 'DefaultMagnificationType',
- x201000a7: 'OtherMagnificationTypesAvailable',
- x201000a8: 'DefaultSmoothingType',
- x201000a9: 'OtherSmoothingTypesAvailable',
- x20100100: 'BorderDensity',
- x20100110: 'EmptyImageDensity',
- x20100120: 'MinDensity',
- x20100130: 'MaxDensity',
- x20100140: 'Trim',
- x20100150: 'ConfigurationInformation',
- x20100152: 'ConfigurationInformationDescr',
- x20100154: 'MaximumCollatedFilms',
- x2010015e: 'Illumination',
- x20100160: 'ReflectedAmbientLight',
- x20100376: 'PrinterPixelSpacing',
- x20100500: 'ReferencedFilmSessionSequence',
- x20100510: 'ReferencedImageBoxSequence',
- x20100520: 'ReferencedBasicAnnotationBoxSeq',
- x20200010: 'ImageBoxPosition',
- x20200020: 'Polarity',
- x20200030: 'RequestedImageSize',
- x20200040: 'RequestedDecimate-CropBehavior',
- x20200050: 'RequestedResolutionID',
- x202000a0: 'RequestedImageSizeFlag',
- x202000a2: 'DecimateCropResult',
- x20200110: 'BasicGrayscaleImageSequence',
- x20200111: 'BasicColorImageSequence',
- x20200130: 'ReferencedImageOverlayBoxSequence',
- x20200140: 'ReferencedVOILUTBoxSequence',
- x20300010: 'AnnotationPosition',
- x20300020: 'TextString',
- x20400010: 'ReferencedOverlayPlaneSequence',
- x20400011: 'ReferencedOverlayPlaneGroups',
- x20400020: 'OverlayPixelDataSequence',
- x20400060: 'OverlayMagnificationType',
- x20400070: 'OverlaySmoothingType',
- x20400072: 'OverlayOrImageMagnification',
- x20400074: 'MagnifyToNumberOfColumns',
- x20400080: 'OverlayForegroundDensity',
- x20400082: 'OverlayBackgroundDensity',
- x20400090: 'OverlayMode',
- x20400100: 'ThresholdDensity',
- x20400500: 'ReferencedImageBoxSequenceRetired',
- x20500010: 'PresentationLUTSequence',
- x20500020: 'PresentationLUTShape',
- x20500500: 'ReferencedPresentationLUTSequence',
- x21000010: 'PrintJobID',
- x21000020: 'ExecutionStatus',
- x21000030: 'ExecutionStatusInfo',
- x21000040: 'CreationDate',
- x21000050: 'CreationTime',
- x21000070: 'Originator',
- x21000140: 'DestinationAE',
- x21000160: 'OwnerID',
- x21000170: 'NumberOfFilms',
- x21000500: 'ReferencedPrintJobSequencePullStoredPrint',
- x21100010: 'PrinterStatus',
- x21100020: 'PrinterStatusInfo',
- x21100030: 'PrinterName',
- x21100099: 'PrintQueueID',
- x21200010: 'QueueStatus',
- x21200050: 'PrintJobDescriptionSequence',
- x21200070: 'ReferencedPrintJobSequence',
- x21300010: 'PrintManagementCapabilitiesSeq',
- x21300015: 'PrinterCharacteristicsSequence',
- x21300030: 'FilmBoxContentSequence',
- x21300040: 'ImageBoxContentSequence',
- x21300050: 'AnnotationContentSequence',
- x21300060: 'ImageOverlayBoxContentSequence',
- x21300080: 'PresentationLUTContentSequence',
- x213000a0: 'ProposedStudySequence',
- x213000c0: 'OriginalImageSequence',
- x22000001: 'LabelFromInfoExtractedFromInstance',
- x22000002: 'LabelText',
- x22000003: 'LabelStyleSelection',
- x22000004: 'MediaDisposition',
- x22000005: 'BarcodeValue',
- x22000006: 'BarcodeSymbology',
- x22000007: 'AllowMediaSplitting',
- x22000008: 'IncludeNonDICOMObjects',
- x22000009: 'IncludeDisplayApplication',
- x2200000a: 'SaveCompInstancesAfterMediaCreate',
- x2200000b: 'TotalNumberMediaPiecesCreated',
- x2200000c: 'RequestedMediaApplicationProfile',
- x2200000d: 'ReferencedStorageMediaSequence',
- x2200000e: 'FailureAttributes',
- x2200000f: 'AllowLossyCompression',
- x22000020: 'RequestPriority',
- x30020002: 'RTImageLabel',
- x30020003: 'RTImageName',
- x30020004: 'RTImageDescription',
- x3002000a: 'ReportedValuesOrigin',
- x3002000c: 'RTImagePlane',
- x3002000d: 'XRayImageReceptorTranslation',
- x3002000e: 'XRayImageReceptorAngle',
- x30020010: 'RTImageOrientation',
- x30020011: 'ImagePlanePixelSpacing',
- x30020012: 'RTImagePosition',
- x30020020: 'RadiationMachineName',
- x30020022: 'RadiationMachineSAD',
- x30020024: 'RadiationMachineSSD',
- x30020026: 'RTImageSID',
- x30020028: 'SourceToReferenceObjectDistance',
- x30020029: 'FractionNumber',
- x30020030: 'ExposureSequence',
- x30020032: 'MetersetExposure',
- x30020034: 'DiaphragmPosition',
- x30020040: 'FluenceMapSequence',
- x30020041: 'FluenceDataSource',
- x30020042: 'FluenceDataScale',
- x30020051: 'FluenceMode',
- x30020052: 'FluenceModeID',
- x30040001: 'DVHType',
- x30040002: 'DoseUnits',
- x30040004: 'DoseType',
- x30040006: 'DoseComment',
- x30040008: 'NormalizationPoint',
- x3004000a: 'DoseSummationType',
- x3004000c: 'GridFrameOffsetVector',
- x3004000e: 'DoseGridScaling',
- x30040010: 'RTDoseROISequence',
- x30040012: 'DoseValue',
- x30040014: 'TissueHeterogeneityCorrection',
- x30040040: 'DVHNormalizationPoint',
- x30040042: 'DVHNormalizationDoseValue',
- x30040050: 'DVHSequence',
- x30040052: 'DVHDoseScaling',
- x30040054: 'DVHVolumeUnits',
- x30040056: 'DVHNumberOfBins',
- x30040058: 'DVHData',
- x30040060: 'DVHReferencedROISequence',
- x30040062: 'DVHROIContributionType',
- x30040070: 'DVHMinimumDose',
- x30040072: 'DVHMaximumDose',
- x30040074: 'DVHMeanDose',
- x30060002: 'StructureSetLabel',
- x30060004: 'StructureSetName',
- x30060006: 'StructureSetDescription',
- x30060008: 'StructureSetDate',
- x30060009: 'StructureSetTime',
- x30060010: 'ReferencedFrameOfReferenceSequence',
- x30060012: 'RTReferencedStudySequence',
- x30060014: 'RTReferencedSeriesSequence',
- x30060016: 'ContourImageSequence',
- x30060020: 'StructureSetROISequence',
- x30060022: 'ROINumber',
- x30060024: 'ReferencedFrameOfReferenceUID',
- x30060026: 'ROIName',
- x30060028: 'ROIDescription',
- x3006002a: 'ROIDisplayColor',
- x3006002c: 'ROIVolume',
- x30060030: 'RTRelatedROISequence',
- x30060033: 'RTROIRelationship',
- x30060036: 'ROIGenerationAlgorithm',
- x30060038: 'ROIGenerationDescription',
- x30060039: 'ROIContourSequence',
- x30060040: 'ContourSequence',
- x30060042: 'ContourGeometricType',
- x30060044: 'ContourSlabThickness',
- x30060045: 'ContourOffsetVector',
- x30060046: 'NumberOfContourPoints',
- x30060048: 'ContourNumber',
- x30060049: 'AttachedContours',
- x30060050: 'ContourData',
- x30060080: 'RTROIObservationsSequence',
- x30060082: 'ObservationNumber',
- x30060084: 'ReferencedROINumber',
- x30060085: 'ROIObservationLabel',
- x30060086: 'RTROIIdentificationCodeSequence',
- x30060088: 'ROIObservationDescription',
- x300600a0: 'RelatedRTROIObservationsSequence',
- x300600a4: 'RTROIInterpretedType',
- x300600a6: 'ROIInterpreter',
- x300600b0: 'ROIPhysicalPropertiesSequence',
- x300600b2: 'ROIPhysicalProperty',
- x300600b4: 'ROIPhysicalPropertyValue',
- x300600b6: 'ROIElementalCompositionSequence',
- x300600b7: 'ROIElementalCompAtomicNumber',
- x300600b8: 'ROIElementalCompAtomicMassFraction',
- x300600c0: 'FrameOfReferenceRelationshipSeq',
- x300600c2: 'RelatedFrameOfReferenceUID',
- x300600c4: 'FrameOfReferenceTransformType',
- x300600c6: 'FrameOfReferenceTransformMatrix',
- x300600c8: 'FrameOfReferenceTransformComment',
- x30080010: 'MeasuredDoseReferenceSequence',
- x30080012: 'MeasuredDoseDescription',
- x30080014: 'MeasuredDoseType',
- x30080016: 'MeasuredDoseValue',
- x30080020: 'TreatmentSessionBeamSequence',
- x30080021: 'TreatmentSessionIonBeamSequence',
- x30080022: 'CurrentFractionNumber',
- x30080024: 'TreatmentControlPointDate',
- x30080025: 'TreatmentControlPointTime',
- x3008002a: 'TreatmentTerminationStatus',
- x3008002b: 'TreatmentTerminationCode',
- x3008002c: 'TreatmentVerificationStatus',
- x30080030: 'ReferencedTreatmentRecordSequence',
- x30080032: 'SpecifiedPrimaryMeterset',
- x30080033: 'SpecifiedSecondaryMeterset',
- x30080036: 'DeliveredPrimaryMeterset',
- x30080037: 'DeliveredSecondaryMeterset',
- x3008003a: 'SpecifiedTreatmentTime',
- x3008003b: 'DeliveredTreatmentTime',
- x30080040: 'ControlPointDeliverySequence',
- x30080041: 'IonControlPointDeliverySequence',
- x30080042: 'SpecifiedMeterset',
- x30080044: 'DeliveredMeterset',
- x30080045: 'MetersetRateSet',
- x30080046: 'MetersetRateDelivered',
- x30080047: 'ScanSpotMetersetsDelivered',
- x30080048: 'DoseRateDelivered',
- x30080050: 'TreatmentSummaryCalcDoseRefSeq',
- x30080052: 'CumulativeDoseToDoseReference',
- x30080054: 'FirstTreatmentDate',
- x30080056: 'MostRecentTreatmentDate',
- x3008005a: 'NumberOfFractionsDelivered',
- x30080060: 'OverrideSequence',
- x30080061: 'ParameterSequencePointer',
- x30080062: 'OverrideParameterPointer',
- x30080063: 'ParameterItemIndex',
- x30080064: 'MeasuredDoseReferenceNumber',
- x30080065: 'ParameterPointer',
- x30080066: 'OverrideReason',
- x30080068: 'CorrectedParameterSequence',
- x3008006a: 'CorrectionValue',
- x30080070: 'CalculatedDoseReferenceSequence',
- x30080072: 'CalculatedDoseReferenceNumber',
- x30080074: 'CalculatedDoseReferenceDescription',
- x30080076: 'CalculatedDoseReferenceDoseValue',
- x30080078: 'StartMeterset',
- x3008007a: 'EndMeterset',
- x30080080: 'ReferencedMeasuredDoseReferenceSeq',
- x30080082: 'ReferencedMeasuredDoseReferenceNum',
- x30080090: 'ReferencedCalculatedDoseRefSeq',
- x30080092: 'ReferencedCalculatedDoseRefNumber',
- x300800a0: 'BeamLimitingDeviceLeafPairsSeq',
- x300800b0: 'RecordedWedgeSequence',
- x300800c0: 'RecordedCompensatorSequence',
- x300800d0: 'RecordedBlockSequence',
- x300800e0: 'TreatmentSummaryMeasuredDoseRefSeq',
- x300800f0: 'RecordedSnoutSequence',
- x300800f2: 'RecordedRangeShifterSequence',
- x300800f4: 'RecordedLateralSpreadingDeviceSeq',
- x300800f6: 'RecordedRangeModulatorSequence',
- x30080100: 'RecordedSourceSequence',
- x30080105: 'SourceSerialNumber',
- x30080110: 'TreatmentSessionAppSetupSeq',
- x30080116: 'ApplicationSetupCheck',
- x30080120: 'RecordedBrachyAccessoryDeviceSeq',
- x30080122: 'ReferencedBrachyAccessoryDeviceNum',
- x30080130: 'RecordedChannelSequence',
- x30080132: 'SpecifiedChannelTotalTime',
- x30080134: 'DeliveredChannelTotalTime',
- x30080136: 'SpecifiedNumberOfPulses',
- x30080138: 'DeliveredNumberOfPulses',
- x3008013a: 'SpecifiedPulseRepetitionInterval',
- x3008013c: 'DeliveredPulseRepetitionInterval',
- x30080140: 'RecordedSourceApplicatorSequence',
- x30080142: 'ReferencedSourceApplicatorNumber',
- x30080150: 'RecordedChannelShieldSequence',
- x30080152: 'ReferencedChannelShieldNumber',
- x30080160: 'BrachyControlPointDeliveredSeq',
- x30080162: 'SafePositionExitDate',
- x30080164: 'SafePositionExitTime',
- x30080166: 'SafePositionReturnDate',
- x30080168: 'SafePositionReturnTime',
- x30080200: 'CurrentTreatmentStatus',
- x30080202: 'TreatmentStatusComment',
- x30080220: 'FractionGroupSummarySequence',
- x30080223: 'ReferencedFractionNumber',
- x30080224: 'FractionGroupType',
- x30080230: 'BeamStopperPosition',
- x30080240: 'FractionStatusSummarySequence',
- x30080250: 'TreatmentDate',
- x30080251: 'TreatmentTime',
- x300a0002: 'RTPlanLabel',
- x300a0003: 'RTPlanName',
- x300a0004: 'RTPlanDescription',
- x300a0006: 'RTPlanDate',
- x300a0007: 'RTPlanTime',
- x300a0009: 'TreatmentProtocols',
- x300a000a: 'PlanIntent',
- x300a000b: 'TreatmentSites',
- x300a000c: 'RTPlanGeometry',
- x300a000e: 'PrescriptionDescription',
- x300a0010: 'DoseReferenceSequence',
- x300a0012: 'DoseReferenceNumber',
- x300a0013: 'DoseReferenceUID',
- x300a0014: 'DoseReferenceStructureType',
- x300a0015: 'NominalBeamEnergyUnit',
- x300a0016: 'DoseReferenceDescription',
- x300a0018: 'DoseReferencePointCoordinates',
- x300a001a: 'NominalPriorDose',
- x300a0020: 'DoseReferenceType',
- x300a0021: 'ConstraintWeight',
- x300a0022: 'DeliveryWarningDose',
- x300a0023: 'DeliveryMaximumDose',
- x300a0025: 'TargetMinimumDose',
- x300a0026: 'TargetPrescriptionDose',
- x300a0027: 'TargetMaximumDose',
- x300a0028: 'TargetUnderdoseVolumeFraction',
- x300a002a: 'OrganAtRiskFullVolumeDose',
- x300a002b: 'OrganAtRiskLimitDose',
- x300a002c: 'OrganAtRiskMaximumDose',
- x300a002d: 'OrganAtRiskOverdoseVolumeFraction',
- x300a0040: 'ToleranceTableSequence',
- x300a0042: 'ToleranceTableNumber',
- x300a0043: 'ToleranceTableLabel',
- x300a0044: 'GantryAngleTolerance',
- x300a0046: 'BeamLimitingDeviceAngleTolerance',
- x300a0048: 'BeamLimitingDeviceToleranceSeq',
- x300a004a: 'BeamLimitingDevicePositionTol',
- x300a004b: 'SnoutPositionTolerance',
- x300a004c: 'PatientSupportAngleTolerance',
- x300a004e: 'TableTopEccentricAngleTolerance',
- x300a004f: 'TableTopPitchAngleTolerance',
- x300a0050: 'TableTopRollAngleTolerance',
- x300a0051: 'TableTopVerticalPositionTolerance',
- x300a0052: 'TableTopLongitudinalPositionTol',
- x300a0053: 'TableTopLateralPositionTolerance',
- x300a0055: 'RTPlanRelationship',
- x300a0070: 'FractionGroupSequence',
- x300a0071: 'FractionGroupNumber',
- x300a0072: 'FractionGroupDescription',
- x300a0078: 'NumberOfFractionsPlanned',
- x300a0079: 'NumberFractionPatternDigitsPerDay',
- x300a007a: 'RepeatFractionCycleLength',
- x300a007b: 'FractionPattern',
- x300a0080: 'NumberOfBeams',
- x300a0082: 'BeamDoseSpecificationPoint',
- x300a0084: 'BeamDose',
- x300a0086: 'BeamMeterset',
- x300a0088: 'BeamDosePointDepth',
- x300a0089: 'BeamDosePointEquivalentDepth',
- x300a008a: 'BeamDosePointSSD',
- x300a00a0: 'NumberOfBrachyApplicationSetups',
- x300a00a2: 'BrachyAppSetupDoseSpecPoint',
- x300a00a4: 'BrachyApplicationSetupDose',
- x300a00b0: 'BeamSequence',
- x300a00b2: 'TreatmentMachineName',
- x300a00b3: 'PrimaryDosimeterUnit',
- x300a00b4: 'SourceAxisDistance',
- x300a00b6: 'BeamLimitingDeviceSequence',
- x300a00b8: 'RTBeamLimitingDeviceType',
- x300a00ba: 'SourceToBeamLimitingDeviceDistance',
- x300a00bb: 'IsocenterToBeamLimitingDeviceDist',
- x300a00bc: 'NumberOfLeafJawPairs',
- x300a00be: 'LeafPositionBoundaries',
- x300a00c0: 'BeamNumber',
- x300a00c2: 'BeamName',
- x300a00c3: 'BeamDescription',
- x300a00c4: 'BeamType',
- x300a00c6: 'RadiationType',
- x300a00c7: 'HighDoseTechniqueType',
- x300a00c8: 'ReferenceImageNumber',
- x300a00ca: 'PlannedVerificationImageSequence',
- x300a00cc: 'ImagingDeviceSpecificAcqParams',
- x300a00ce: 'TreatmentDeliveryType',
- x300a00d0: 'NumberOfWedges',
- x300a00d1: 'WedgeSequence',
- x300a00d2: 'WedgeNumber',
- x300a00d3: 'WedgeType',
- x300a00d4: 'WedgeID',
- x300a00d5: 'WedgeAngle',
- x300a00d6: 'WedgeFactor',
- x300a00d7: 'TotalWedgeTrayWaterEquivThickness',
- x300a00d8: 'WedgeOrientation',
- x300a00d9: 'IsocenterToWedgeTrayDistance',
- x300a00da: 'SourceToWedgeTrayDistance',
- x300a00db: 'WedgeThinEdgePosition',
- x300a00dc: 'BolusID',
- x300a00dd: 'BolusDescription',
- x300a00e0: 'NumberOfCompensators',
- x300a00e1: 'MaterialID',
- x300a00e2: 'TotalCompensatorTrayFactor',
- x300a00e3: 'CompensatorSequence',
- x300a00e4: 'CompensatorNumber',
- x300a00e5: 'CompensatorID',
- x300a00e6: 'SourceToCompensatorTrayDistance',
- x300a00e7: 'CompensatorRows',
- x300a00e8: 'CompensatorColumns',
- x300a00e9: 'CompensatorPixelSpacing',
- x300a00ea: 'CompensatorPosition',
- x300a00eb: 'CompensatorTransmissionData',
- x300a00ec: 'CompensatorThicknessData',
- x300a00ed: 'NumberOfBoli',
- x300a00ee: 'CompensatorType',
- x300a00f0: 'NumberOfBlocks',
- x300a00f2: 'TotalBlockTrayFactor',
- x300a00f3: 'TotalBlockTrayWaterEquivThickness',
- x300a00f4: 'BlockSequence',
- x300a00f5: 'BlockTrayID',
- x300a00f6: 'SourceToBlockTrayDistance',
- x300a00f7: 'IsocenterToBlockTrayDistance',
- x300a00f8: 'BlockType',
- x300a00f9: 'AccessoryCode',
- x300a00fa: 'BlockDivergence',
- x300a00fb: 'BlockMountingPosition',
- x300a00fc: 'BlockNumber',
- x300a00fe: 'BlockName',
- x300a0100: 'BlockThickness',
- x300a0102: 'BlockTransmission',
- x300a0104: 'BlockNumberOfPoints',
- x300a0106: 'BlockData',
- x300a0107: 'ApplicatorSequence',
- x300a0108: 'ApplicatorID',
- x300a0109: 'ApplicatorType',
- x300a010a: 'ApplicatorDescription',
- x300a010c: 'CumulativeDoseReferenceCoefficient',
- x300a010e: 'FinalCumulativeMetersetWeight',
- x300a0110: 'NumberOfControlPoints',
- x300a0111: 'ControlPointSequence',
- x300a0112: 'ControlPointIndex',
- x300a0114: 'NominalBeamEnergy',
- x300a0115: 'DoseRateSet',
- x300a0116: 'WedgePositionSequence',
- x300a0118: 'WedgePosition',
- x300a011a: 'BeamLimitingDevicePositionSequence',
- x300a011c: 'LeafJawPositions',
- x300a011e: 'GantryAngle',
- x300a011f: 'GantryRotationDirection',
- x300a0120: 'BeamLimitingDeviceAngle',
- x300a0121: 'BeamLimitingDeviceRotateDirection',
- x300a0122: 'PatientSupportAngle',
- x300a0123: 'PatientSupportRotationDirection',
- x300a0124: 'TableTopEccentricAxisDistance',
- x300a0125: 'TableTopEccentricAngle',
- x300a0126: 'TableTopEccentricRotateDirection',
- x300a0128: 'TableTopVerticalPosition',
- x300a0129: 'TableTopLongitudinalPosition',
- x300a012a: 'TableTopLateralPosition',
- x300a012c: 'IsocenterPosition',
- x300a012e: 'SurfaceEntryPoint',
- x300a0130: 'SourceToSurfaceDistance',
- x300a0134: 'CumulativeMetersetWeight',
- x300a0140: 'TableTopPitchAngle',
- x300a0142: 'TableTopPitchRotationDirection',
- x300a0144: 'TableTopRollAngle',
- x300a0146: 'TableTopRollRotationDirection',
- x300a0148: 'HeadFixationAngle',
- x300a014a: 'GantryPitchAngle',
- x300a014c: 'GantryPitchRotationDirection',
- x300a014e: 'GantryPitchAngleTolerance',
- x300a0180: 'PatientSetupSequence',
- x300a0182: 'PatientSetupNumber',
- x300a0183: 'PatientSetupLabel',
- x300a0184: 'PatientAdditionalPosition',
- x300a0190: 'FixationDeviceSequence',
- x300a0192: 'FixationDeviceType',
- x300a0194: 'FixationDeviceLabel',
- x300a0196: 'FixationDeviceDescription',
- x300a0198: 'FixationDevicePosition',
- x300a0199: 'FixationDevicePitchAngle',
- x300a019a: 'FixationDeviceRollAngle',
- x300a01a0: 'ShieldingDeviceSequence',
- x300a01a2: 'ShieldingDeviceType',
- x300a01a4: 'ShieldingDeviceLabel',
- x300a01a6: 'ShieldingDeviceDescription',
- x300a01a8: 'ShieldingDevicePosition',
- x300a01b0: 'SetupTechnique',
- x300a01b2: 'SetupTechniqueDescription',
- x300a01b4: 'SetupDeviceSequence',
- x300a01b6: 'SetupDeviceType',
- x300a01b8: 'SetupDeviceLabel',
- x300a01ba: 'SetupDeviceDescription',
- x300a01bc: 'SetupDeviceParameter',
- x300a01d0: 'SetupReferenceDescription',
- x300a01d2: 'TableTopVerticalSetupDisplacement',
- x300a01d4: 'TableTopLongitudinalSetupDisplace',
- x300a01d6: 'TableTopLateralSetupDisplacement',
- x300a0200: 'BrachyTreatmentTechnique',
- x300a0202: 'BrachyTreatmentType',
- x300a0206: 'TreatmentMachineSequence',
- x300a0210: 'SourceSequence',
- x300a0212: 'SourceNumber',
- x300a0214: 'SourceType',
- x300a0216: 'SourceManufacturer',
- x300a0218: 'ActiveSourceDiameter',
- x300a021a: 'ActiveSourceLength',
- x300a0222: 'SourceEncapsulationNomThickness',
- x300a0224: 'SourceEncapsulationNomTransmission',
- x300a0226: 'SourceIsotopeName',
- x300a0228: 'SourceIsotopeHalfLife',
- x300a0229: 'SourceStrengthUnits',
- x300a022a: 'ReferenceAirKermaRate',
- x300a022b: 'SourceStrength',
- x300a022c: 'SourceStrengthReferenceDate',
- x300a022e: 'SourceStrengthReferenceTime',
- x300a0230: 'ApplicationSetupSequence',
- x300a0232: 'ApplicationSetupType',
- x300a0234: 'ApplicationSetupNumber',
- x300a0236: 'ApplicationSetupName',
- x300a0238: 'ApplicationSetupManufacturer',
- x300a0240: 'TemplateNumber',
- x300a0242: 'TemplateType',
- x300a0244: 'TemplateName',
- x300a0250: 'TotalReferenceAirKerma',
- x300a0260: 'BrachyAccessoryDeviceSequence',
- x300a0262: 'BrachyAccessoryDeviceNumber',
- x300a0263: 'BrachyAccessoryDeviceID',
- x300a0264: 'BrachyAccessoryDeviceType',
- x300a0266: 'BrachyAccessoryDeviceName',
- x300a026a: 'BrachyAccessoryDeviceNomThickness',
- x300a026c: 'BrachyAccessoryDevNomTransmission',
- x300a0280: 'ChannelSequence',
- x300a0282: 'ChannelNumber',
- x300a0284: 'ChannelLength',
- x300a0286: 'ChannelTotalTime',
- x300a0288: 'SourceMovementType',
- x300a028a: 'NumberOfPulses',
- x300a028c: 'PulseRepetitionInterval',
- x300a0290: 'SourceApplicatorNumber',
- x300a0291: 'SourceApplicatorID',
- x300a0292: 'SourceApplicatorType',
- x300a0294: 'SourceApplicatorName',
- x300a0296: 'SourceApplicatorLength',
- x300a0298: 'SourceApplicatorManufacturer',
- x300a029c: 'SourceApplicatorWallNomThickness',
- x300a029e: 'SourceApplicatorWallNomTrans',
- x300a02a0: 'SourceApplicatorStepSize',
- x300a02a2: 'TransferTubeNumber',
- x300a02a4: 'TransferTubeLength',
- x300a02b0: 'ChannelShieldSequence',
- x300a02b2: 'ChannelShieldNumber',
- x300a02b3: 'ChannelShieldID',
- x300a02b4: 'ChannelShieldName',
- x300a02b8: 'ChannelShieldNominalThickness',
- x300a02ba: 'ChannelShieldNominalTransmission',
- x300a02c8: 'FinalCumulativeTimeWeight',
- x300a02d0: 'BrachyControlPointSequence',
- x300a02d2: 'ControlPointRelativePosition',
- x300a02d4: 'ControlPoint3DPosition',
- x300a02d6: 'CumulativeTimeWeight',
- x300a02e0: 'CompensatorDivergence',
- x300a02e1: 'CompensatorMountingPosition',
- x300a02e2: 'SourceToCompensatorDistance',
- x300a02e3: 'TotalCompTrayWaterEquivThickness',
- x300a02e4: 'IsocenterToCompensatorTrayDistance',
- x300a02e5: 'CompensatorColumnOffset',
- x300a02e6: 'IsocenterToCompensatorDistances',
- x300a02e7: 'CompensatorRelStoppingPowerRatio',
- x300a02e8: 'CompensatorMillingToolDiameter',
- x300a02ea: 'IonRangeCompensatorSequence',
- x300a02eb: 'CompensatorDescription',
- x300a0302: 'RadiationMassNumber',
- x300a0304: 'RadiationAtomicNumber',
- x300a0306: 'RadiationChargeState',
- x300a0308: 'ScanMode',
- x300a030a: 'VirtualSourceAxisDistances',
- x300a030c: 'SnoutSequence',
- x300a030d: 'SnoutPosition',
- x300a030f: 'SnoutID',
- x300a0312: 'NumberOfRangeShifters',
- x300a0314: 'RangeShifterSequence',
- x300a0316: 'RangeShifterNumber',
- x300a0318: 'RangeShifterID',
- x300a0320: 'RangeShifterType',
- x300a0322: 'RangeShifterDescription',
- x300a0330: 'NumberOfLateralSpreadingDevices',
- x300a0332: 'LateralSpreadingDeviceSequence',
- x300a0334: 'LateralSpreadingDeviceNumber',
- x300a0336: 'LateralSpreadingDeviceID',
- x300a0338: 'LateralSpreadingDeviceType',
- x300a033a: 'LateralSpreadingDeviceDescription',
- x300a033c: 'LateralSpreadingDevWaterEquivThick',
- x300a0340: 'NumberOfRangeModulators',
- x300a0342: 'RangeModulatorSequence',
- x300a0344: 'RangeModulatorNumber',
- x300a0346: 'RangeModulatorID',
- x300a0348: 'RangeModulatorType',
- x300a034a: 'RangeModulatorDescription',
- x300a034c: 'BeamCurrentModulationID',
- x300a0350: 'PatientSupportType',
- x300a0352: 'PatientSupportID',
- x300a0354: 'PatientSupportAccessoryCode',
- x300a0356: 'FixationLightAzimuthalAngle',
- x300a0358: 'FixationLightPolarAngle',
- x300a035a: 'MetersetRate',
- x300a0360: 'RangeShifterSettingsSequence',
- x300a0362: 'RangeShifterSetting',
- x300a0364: 'IsocenterToRangeShifterDistance',
- x300a0366: 'RangeShifterWaterEquivThickness',
- x300a0370: 'LateralSpreadingDeviceSettingsSeq',
- x300a0372: 'LateralSpreadingDeviceSetting',
- x300a0374: 'IsocenterToLateralSpreadingDevDist',
- x300a0380: 'RangeModulatorSettingsSequence',
- x300a0382: 'RangeModulatorGatingStartValue',
- x300a0384: 'RangeModulatorGatingStopValue',
- x300a038a: 'IsocenterToRangeModulatorDistance',
- x300a0390: 'ScanSpotTuneID',
- x300a0392: 'NumberOfScanSpotPositions',
- x300a0394: 'ScanSpotPositionMap',
- x300a0396: 'ScanSpotMetersetWeights',
- x300a0398: 'ScanningSpotSize',
- x300a039a: 'NumberOfPaintings',
- x300a03a0: 'IonToleranceTableSequence',
- x300a03a2: 'IonBeamSequence',
- x300a03a4: 'IonBeamLimitingDeviceSequence',
- x300a03a6: 'IonBlockSequence',
- x300a03a8: 'IonControlPointSequence',
- x300a03aa: 'IonWedgeSequence',
- x300a03ac: 'IonWedgePositionSequence',
- x300a0401: 'ReferencedSetupImageSequence',
- x300a0402: 'SetupImageComment',
- x300a0410: 'MotionSynchronizationSequence',
- x300a0412: 'ControlPointOrientation',
- x300a0420: 'GeneralAccessorySequence',
- x300a0421: 'GeneralAccessoryID',
- x300a0422: 'GeneralAccessoryDescription',
- x300a0423: 'GeneralAccessoryType',
- x300a0424: 'GeneralAccessoryNumber',
- x300c0002: 'ReferencedRTPlanSequence',
- x300c0004: 'ReferencedBeamSequence',
- x300c0006: 'ReferencedBeamNumber',
- x300c0007: 'ReferencedReferenceImageNumber',
- x300c0008: 'StartCumulativeMetersetWeight',
- x300c0009: 'EndCumulativeMetersetWeight',
- x300c000a: 'ReferencedBrachyAppSetupSeq',
- x300c000c: 'ReferencedBrachyAppSetupNumber',
- x300c000e: 'ReferencedSourceNumber',
- x300c0020: 'ReferencedFractionGroupSequence',
- x300c0022: 'ReferencedFractionGroupNumber',
- x300c0040: 'ReferencedVerificationImageSeq',
- x300c0042: 'ReferencedReferenceImageSequence',
- x300c0050: 'ReferencedDoseReferenceSequence',
- x300c0051: 'ReferencedDoseReferenceNumber',
- x300c0055: 'BrachyReferencedDoseReferenceSeq',
- x300c0060: 'ReferencedStructureSetSequence',
- x300c006a: 'ReferencedPatientSetupNumber',
- x300c0080: 'ReferencedDoseSequence',
- x300c00a0: 'ReferencedToleranceTableNumber',
- x300c00b0: 'ReferencedBolusSequence',
- x300c00c0: 'ReferencedWedgeNumber',
- x300c00d0: 'ReferencedCompensatorNumber',
- x300c00e0: 'ReferencedBlockNumber',
- x300c00f0: 'ReferencedControlPointIndex',
- x300c00f2: 'ReferencedControlPointSequence',
- x300c00f4: 'ReferencedStartControlPointIndex',
- x300c00f6: 'ReferencedStopControlPointIndex',
- x300c0100: 'ReferencedRangeShifterNumber',
- x300c0102: 'ReferencedLateralSpreadingDevNum',
- x300c0104: 'ReferencedRangeModulatorNumber',
- x300e0002: 'ApprovalStatus',
- x300e0004: 'ReviewDate',
- x300e0005: 'ReviewTime',
- x300e0008: 'ReviewerName',
- x40000000: 'TextGroupLength',
- x40000010: 'Arbitrary',
- x40004000: 'TextComments',
- x40080040: 'ResultsID',
- x40080042: 'ResultsIDIssuer',
- x40080050: 'ReferencedInterpretationSequence',
- x40080100: 'InterpretationRecordedDate',
- x40080101: 'InterpretationRecordedTime',
- x40080102: 'InterpretationRecorder',
- x40080103: 'ReferenceToRecordedSound',
- x40080108: 'InterpretationTranscriptionDate',
- x40080109: 'InterpretationTranscriptionTime',
- x4008010a: 'InterpretationTranscriber',
- x4008010b: 'InterpretationText',
- x4008010c: 'InterpretationAuthor',
- x40080111: 'InterpretationApproverSequence',
- x40080112: 'InterpretationApprovalDate',
- x40080113: 'InterpretationApprovalTime',
- x40080114: 'PhysicianApprovingInterpretation',
- x40080115: 'InterpretationDiagnosisDescription',
- x40080117: 'InterpretationDiagnosisCodeSeq',
- x40080118: 'ResultsDistributionListSequence',
- x40080119: 'DistributionName',
- x4008011a: 'DistributionAddress',
- x40080200: 'InterpretationID',
- x40080202: 'InterpretationIDIssuer',
- x40080210: 'InterpretationTypeID',
- x40080212: 'InterpretationStatusID',
- x40080300: 'Impressions',
- x40084000: 'ResultsComments',
- x4ffe0001: 'MACParametersSequence',
- x50xx0005: 'CurveDimensions',
- x50xx0010: 'NumberOfPoints',
- x50xx0020: 'TypeOfData',
- x50xx0022: 'CurveDescription',
- x50xx0030: 'AxisUnits',
- x50xx0040: 'AxisLabels',
- x50xx0103: 'DataValueRepresentation',
- x50xx0104: 'MinimumCoordinateValue',
- x50xx0105: 'MaximumCoordinateValue',
- x50xx0106: 'CurveRange',
- x50xx0110: 'CurveDataDescriptor',
- x50xx0112: 'CoordinateStartValue',
- x50xx0114: 'CoordinateStepValue',
- x50xx1001: 'CurveActivationLayer',
- x50xx2000: 'AudioType',
- x50xx2002: 'AudioSampleFormat',
- x50xx2004: 'NumberOfChannels',
- x50xx2006: 'NumberOfSamples',
- x50xx2008: 'SampleRate',
- x50xx200a: 'TotalTime',
- x50xx200c: 'AudioSampleData',
- x50xx200e: 'AudioComments',
- x50xx2500: 'CurveLabel',
- x50xx2600: 'CurveReferencedOverlaySequence',
- x50xx2610: 'ReferencedOverlayGroup',
- x50xx3000: 'CurveData',
- x52009229: 'SharedFunctionalGroupsSequence',
- x52009230: 'PerFrameFunctionalGroupsSequence',
- x54000100: 'WaveformSequence',
- x54000110: 'ChannelMinimumValue',
- x54000112: 'ChannelMaximumValue',
- x54001004: 'WaveformBitsAllocated',
- x54001006: 'WaveformSampleInterpretation',
- x5400100a: 'WaveformPaddingValue',
- x54001010: 'WaveformData',
- x56000010: 'FirstOrderPhaseCorrectionAngle',
- x56000020: 'SpectroscopyData',
- x60000000: 'OverlayGroupLength',
- x60xx0010: 'OverlayRows',
- x60xx0011: 'OverlayColumns',
- x60xx0012: 'OverlayPlanes',
- x60xx0015: 'NumberOfFramesInOverlay',
- x60xx0022: 'OverlayDescription',
- x60xx0040: 'OverlayType',
- x60xx0045: 'OverlaySubtype',
- x60xx0050: 'OverlayOrigin',
- x60xx0051: 'ImageFrameOrigin',
- x60xx0052: 'OverlayPlaneOrigin',
- x60xx0060: 'OverlayCompressionCode',
- x60xx0061: 'OverlayCompressionOriginator',
- x60xx0062: 'OverlayCompressionLabel',
- x60xx0063: 'OverlayCompressionDescription',
- x60xx0066: 'OverlayCompressionStepPointers',
- x60xx0068: 'OverlayRepeatInterval',
- x60xx0069: 'OverlayBitsGrouped',
- x60xx0100: 'OverlayBitsAllocated',
- x60xx0102: 'OverlayBitPosition',
- x60xx0110: 'OverlayFormat',
- x60xx0200: 'OverlayLocation',
- x60xx0800: 'OverlayCodeLabel',
- x60xx0802: 'OverlayNumberOfTables',
- x60xx0803: 'OverlayCodeTableLocation',
- x60xx0804: 'OverlayBitsForCodeWord',
- x60xx1001: 'OverlayActivationLayer',
- x60xx1100: 'OverlayDescriptorGray',
- x60xx1101: 'OverlayDescriptorRed',
- x60xx1102: 'OverlayDescriptorGreen',
- x60xx1103: 'OverlayDescriptorBlue',
- x60xx1200: 'OverlaysGray',
- x60xx1201: 'OverlaysRed',
- x60xx1202: 'OverlaysGreen',
- x60xx1203: 'OverlaysBlue',
- x60xx1301: 'ROIArea',
- x60xx1302: 'ROIMean',
- x60xx1303: 'ROIStandardDeviation',
- x60xx1500: 'OverlayLabel',
- x60xx3000: 'OverlayData',
- x60xx4000: 'OverlayComments',
- x7fxx0000: 'PixelDataGroupLength',
- x7fxx0010: 'PixelData',
- x7fxx0011: 'VariableNextDataGroup',
- x7fxx0020: 'VariableCoefficientsSDVN',
- x7fxx0030: 'VariableCoefficientsSDHN',
- x7fxx0040: 'VariableCoefficientsSDDN',
- xfffafffa: 'DigitalSignaturesSequence',
- xfffcfffc: 'DataSetTrailingPadding',
- xfffee000: 'StartOfItem',
- xfffee00d: 'EndOfItems',
- xfffee0dd: 'EndOfSequence'
-};
-
-DICOMTagDescriptions.init(initialTagDescriptionMap);
-
-// Discard original map...
-initialTagDescriptionMap = null;
-
-export { DICOMTagDescriptions };
diff --git a/src/lib/viewerbase/StackManager.js b/src/lib/viewerbase/StackManager.js
deleted file mode 100644
index 5c8846b..0000000
--- a/src/lib/viewerbase/StackManager.js
+++ /dev/null
@@ -1,147 +0,0 @@
-import { DCMViewer } from '../viewerMain';
-import { getImageId } from './getImageId';
-import { DCMViewerError } from '../DCMViewerError';
-import { DCMViewerLog } from '../DCMViewerLog';
-
-let stackMap = {};
-let configuration = {};
-const stackUpdatedCallbacks = [];
-
-/**
- * Loop through the current series and add metadata to the
- * Cornerstone meta data provider. This will be used to fill information
- * into the viewport overlays, and to calculate reference lines and orientation markers
- * @param {Object} study Study object
- * @param {Object} displaySet The set of images to make the stack from
- * @return {Array} Array with image IDs
- */
-function createAndAddStack(study, displaySet) {
- const { metadataProvider } = DCMViewer.viewer;
- const numImages = displaySet.images.length;
- const imageIds = [];
- let imageId;
-
- displaySet.images.forEach((instance, imageIndex) => {
- const image = instance.getData();
- const metaData = {
- instance: image, // in this context, instance will be the data of the InstanceMetadata object...
- series: displaySet, // TODO: Check this
- study,
- numImages,
- imageIndex: imageIndex + 1
- };
-
- const { numberOfFrames } = image;
- if (numberOfFrames > 1) {
- DCMViewerLog.info('Multiframe image detected');
- for (let i = 0; i < numberOfFrames; i++) {
- metaData.frame = i;
- imageId = getImageId(image, i);
- imageIds.push(imageId);
- metadataProvider.addMetadata(imageId, metaData);
- }
- } else {
- imageId = getImageId(image);
- imageIds.push(imageId);
- metadataProvider.addMetadata(imageId, metaData);
- }
- });
-
- const stack = {
- displaySetInstanceUid: displaySet.displaySetInstanceUid,
- imageIds,
- frameRate: displaySet.frameRate,
- isClip: displaySet.isClip
- };
-
- stackMap[displaySet.displaySetInstanceUid] = stack;
-
- return stack;
-}
-
-configuration = {
- createAndAddStack
-};
-
-/**
- * This object contains all the functions needed for interacting with the stack manager.
- * Generally, findStack is the only function used. If you want to know when new stacks
- * come in, you can register a callback with addStackUpdatedCallback.
- */
-const StackManager = {
- /**
- * Removes all current stacks
- */
- clearStacks() {
- stackMap = {};
- },
- /**
- * Create a stack from an image set, as well as add in the metadata on a per image bases.
- * @param study The study who's metadata will be added
- * @param displaySet The set of images to make the stack from
- * @return {Array} Array with image IDs
- */
- makeAndAddStack(study, displaySet) {
- return configuration.createAndAddStack(study, displaySet, stackUpdatedCallbacks);
- },
- /**
- * Find a stack from the currently created stacks.
- * @param displaySetInstanceUid The UID of the stack to find.
- * @returns {*} undefined if not found, otherwise the stack object is returned.
- */
- findStack(displaySetInstanceUid) {
- return stackMap[displaySetInstanceUid];
- },
- /**
- * Find a stack or reate one if it has not been created yet
- * @param study The study who's metadata will be added
- * @param displaySet The set of images to make the stack from
- * @return {Array} Array with image IDs
- */
- findOrCreateStack(study, displaySet) {
- let stack = this.findStack(displaySet.displaySetInstanceUid);
-
- if (!stack || !stack.imageIds) {
- stack = this.makeAndAddStack(study, displaySet);
- }
-
- return stack;
- },
- /**
- * Gets the underlying map of displaySetInstanceUid to stack object.
- * WARNING: Do not change this object. It directly affects the manager.
- * @returns {{}} map of displaySetInstanceUid -> stack.
- */
- getAllStacks() {
- return stackMap;
- },
- /**
- * Adds in a callback to be called on a stack being added / updated.
- * @param callback must accept at minimum one argument,
- * which is the stack that was added / updated.
- */
- addStackUpdatedCallback(callback) {
- if (typeof callback !== 'function') {
- throw new DCMViewerError('callback must be provided as a function');
- }
- stackUpdatedCallbacks.push(callback);
- },
- /**
- * Return configuration
- */
- getConfiguration() {
- return configuration;
- },
- /**
- * Set configuration, in order to provide compatibility
- * with other systems by overriding this functions
- * @param {Object} config object with functions to be overrided
- *
- * For now, only makeAndAddStack can be overrided
- */
- setConfiguration(config) {
- configuration = config;
- }
-};
-
-export { StackManager };
diff --git a/src/lib/viewerbase/Utils.js b/src/lib/viewerbase/Utils.js
deleted file mode 100644
index 97a5ee5..0000000
--- a/src/lib/viewerbase/Utils.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import $ from 'jquery';
-import _ from 'underscore';
-
-const Utils = {};
-
-Utils.string = {};
-
-// Search for some string inside any object or array
-Utils.string.search = (object, query, property = null, result = []) => {
- // Create the search pattern
- const pattern = new RegExp($.trim(query), 'i');
-
- _.each(object, (item) => {
- // Stop here if item is empty
- if (!item) {
- return;
- }
-
- // Get the value to be compared
- const value = _.isString(property) ? item[property] : item;
-
- // Check if the value match the pattern
- if (_.isString(value) && pattern.test(value)) {
- // Add the current item to the result
- result.push(item);
- }
-
- if (_.isObject(item)) {
- // Search recursively the item if the current item is an object
- Utils.string.search(item, query, property, result);
- }
- });
-
- // Return the found items
- return result;
-};
-
-// Encode any string into a safe format for HTML id attribute
-Utils.string.encodeId = (input) => {
- const string = input && input.toString ? input.toString() : input;
-
- // Return an underscore if the given string is empty or if it's not a string
- if (string === '' || typeof string !== 'string') {
- return '_';
- }
-
- // Create a converter to replace non accepted chars
- const converter = match => `_${match[0].charCodeAt(0).toString(16)}_`;
-
- // Encode the given string and return it
- return string.replace(/[^a-zA-Z0-9-]/g, converter);
-};
-
-
-export { Utils };
diff --git a/src/lib/viewerbase/annotateTextUtils.js b/src/lib/viewerbase/annotateTextUtils.js
deleted file mode 100644
index ddab0ad..0000000
--- a/src/lib/viewerbase/annotateTextUtils.js
+++ /dev/null
@@ -1,124 +0,0 @@
-import $ from 'jquery';
-import { viewportUtils } from './viewportUtils';
-import { isTouchDevice } from './isTouchDevice';
-
-const getTextCallback = (doneChangingTextCallback) => {
- const dialog = $('#annotationDialog');
- if (dialog.get(0).open === true) {
- return;
- }
-
- const getTextInput = $('.annotationTextInput');
-
- const closeHandler = () => {
- dialog.get(0).close();
- doneChangingTextCallback(getTextInput.val());
- // Reset the text value
- getTextInput.val('');
-
- // Reset the focus to the active viewport element
- // This makes the mobile Safari keyboard close
- const element = viewportUtils.getActiveViewportElement();
- $(element).focus();
- };
-
- // This handles the text entry for the annotation tool
- const keyPressHandler = (e) => {
- // If Enter or Esc are pressed, close the dialog
- if (e.which === 13 || e.which === 27) {
- closeHandler();
- }
- };
-
- // Focus on the text input to open the Safari keyboard
- getTextInput.focus();
-
- dialog.get(0).showModal();
-
- const confirm = dialog.find('.annotationDialogConfirm');
- confirm.off('click');
- confirm.on('click', () => {
- closeHandler();
- });
-
- // Use keydown since keypress doesn't handle ESC in Chrome
- dialog.off('keydown');
- dialog.on('keydown', keyPressHandler);
-};
-
-const changeTextCallback = (data, eventData, doneChangingTextCallback) => {
- const dialog = $('#relabelAnnotationDialog');
- if (dialog.get(0).open === true) {
- return;
- }
-
- if (isTouchDevice()) {
- // Center the dialog on screen on touch devices
- dialog.css({
- top: 0,
- left: 0,
- right: 0,
- bottom: 0,
- margin: 'auto'
- });
- } else {
- // Place the dialog above the tool that is being relabelled
- dialog.css({
- top: eventData.currentPoints.page.y - dialog.outerHeight() - 20,
- left: eventData.currentPoints.page.x - (dialog.outerWidth() / 2)
- });
- }
-
- const getTextInput = dialog.find('.annotationTextInput');
- const confirm = dialog.find('.relabelConfirm');
- const remove = dialog.find('.relabelRemove');
-
- getTextInput.val(data.text);
-
- // Focus on the text input to open the Safari keyboard
- getTextInput.focus();
-
- dialog.get(0).showModal();
-
- confirm.off('click');
- confirm.on('click', () => {
- dialog.get(0).close();
- doneChangingTextCallback(data, getTextInput.val());
- });
-
- // If the remove button is clicked, delete this marker
- remove.off('click');
- remove.on('click', () => {
- dialog.get(0).close();
- doneChangingTextCallback(data, undefined, true);
- });
-
- const closeHandler = () => {
- dialog.get(0).close();
- doneChangingTextCallback(data, getTextInput.val());
- // Reset the text value
- getTextInput.val('');
-
- // Reset the focus to the active viewport element
- // This makes the mobile Safari keyboard close
- const element = viewportUtils.getActiveViewportElement();
- $(element).focus();
- };
-
- const keyPressHandler = (e) => {
- // If Enter is pressed, close the dialog
- if (e.which === 13) {
- closeHandler();
- }
- };
-
- dialog.off('keydown');
- dialog.on('keydown', keyPressHandler);
-};
-
-const annotateTextUtils = {
- getTextCallback,
- changeTextCallback
-};
-
-export { annotateTextUtils };
diff --git a/src/lib/viewerbase/captureImageDialog.js b/src/lib/viewerbase/captureImageDialog.js
deleted file mode 100644
index df7beda..0000000
--- a/src/lib/viewerbase/captureImageDialog.js
+++ /dev/null
@@ -1,241 +0,0 @@
-import $ from 'jquery';
-import { cornerstone } from '../cornerstonejs';
-import { viewportUtils } from './viewportUtils';
-import CaptureImageDialog from '../../components/templates/CaptureImageDialog.html';
-
-const DEFAULT_FILENAME = 'image';
-
-const getFormData = () => ({
- $imageViewerViewport: $('.viewport-element-hidden'),
- fileName: $('#viewport-preview-name').val() || DEFAULT_FILENAME,
- imageType: $('#viewport-image-type').val(),
- width: $('#viewport-preview-width').val(),
- height: $('#viewport-preview-height').val(),
- showAnnotations: $('#showAnnotations').prop('checked'),
- quality: $('#viewport-preview-quality').val(),
- keepAspectRatio: $('#keepAspectRatio').data('keep-ratio').toString() === 'true'
-});
-
-const setElementSize = (element, canvas, size, value) => {
- $(element)[size](value);
- canvas[size] = value;
- canvas.style[size] = `${value}px`;
-};
-
-const updateViewportPreview = ($imageViewerViewport, imageType = 'png') => {
- if (!$imageViewerViewport) {
- return;
- }
-
- $imageViewerViewport.one('cornerstoneimagerendered', (event) => {
- const $viewportPreview = $('.viewport-preview');
- const downloadCanvas = $('.viewport-element-hidden').find('canvas')[0];
-
- const type = `image/${imageType}`;
- const src = downloadCanvas.toDataURL(type, 1.0);
-
- const $element = $(event.currentTarget);
- const maxSize = 512;
- let width = $element.width();
- let height = $element.height();
- if (width > maxSize || height > maxSize) {
- const multiplier = maxSize / Math.max(width, height);
- height *= multiplier;
- width *= multiplier;
- }
-
- $viewportPreview.attr('src', src);
-
- $viewportPreview.width(width);
- $viewportPreview.height(height);
- });
-};
-
-const updateViewportElement = (viewportWidth, viewportHeight, annotations = true) => {
- const activeViewport = viewportUtils.getActiveViewportElement();
- const enabledElement = cornerstone.getEnabledElement(activeViewport);
- const $viewportElement = $('.viewport-element-hidden');
- const viewportElement = $viewportElement[0];
-
- const downloadCanvas = $viewportElement.find('canvas')[0];
- cornerstone.loadImage(enabledElement.image.imageId).then((image) => {
- cornerstone.displayImage(viewportElement, image);
- cornerstone.setViewport(viewportElement, enabledElement.viewport);
- cornerstone.resize(viewportElement, true);
-
- viewportUtils.toggleAnnotations(viewportElement, annotations);
-
- const maxSize = 16384;
- const width = Math.min(viewportWidth || image.width, maxSize);
- const height = Math.min(viewportHeight || image.height, maxSize);
- setElementSize(viewportElement, downloadCanvas, 'width', width);
- setElementSize(viewportElement, downloadCanvas, 'height', height);
-
- cornerstone.fitToWindow(viewportElement);
-
- updateViewportPreview($viewportElement, 'png');
- });
-};
-
-const registerImageType = () => {
- $('#viewport-image-type').change(() => {
- const formData = getFormData();
-
- updateViewportPreview(formData.$imageViewerViewport, formData.imageType);
- });
-};
-
-const registerShowAnnotations = () => {
- $('#showAnnotations').change(() => {
- const formData = getFormData();
- const { $imageViewerViewport } = formData;
- const imageViewerViewport = $imageViewerViewport[0];
-
- viewportUtils.toggleAnnotations(imageViewerViewport, formData.showAnnotations);
- updateViewportPreview($imageViewerViewport, formData.imageType);
- });
-};
-
-const registerKeepAspectRatio = () => {
- $('#keepAspectRatio').click((e) => {
- const $this = $(e.currentTarget);
- const keepRatio = $this.data('keep-ratio').toString() === 'true';
-
- if (keepRatio) {
- $this.data('keep-ratio', 'false');
- $this.find('i').removeClass('fa-link').addClass('fa-unlink');
- } else {
- $this.data('keep-ratio', 'true');
- $this.find('i').removeClass('fa-unlink').addClass('fa-link');
- }
-
- $('#viewport-preview-width').trigger('change');
- });
-};
-
-const registerSize = () => {
- $('.js-preview-size').change((e) => {
- const $this = $(e.currentTarget);
- const formData = getFormData();
- const size = $this.data('size');
- const value = size === 'width' ? formData.width : formData.height;
- const maxValue = $this.attr('max');
-
- if (parseInt(value, 10) > parseInt(maxValue, 10)) {
- $this.val(maxValue);
- formData[size] = maxValue;
- }
-
- const viewportElement = formData.$imageViewerViewport[0];
- const downloadCanvas = formData.$imageViewerViewport.find('canvas')[0];
- const enabledElement = cornerstone.getEnabledElement(viewportElement);
-
- if (formData.keepAspectRatio) {
- const { image } = enabledElement;
-
- if (size === 'width') {
- const multiplier = formData.width / enabledElement.image.width;
- formData.height = Math.round(image.height * multiplier);
- setElementSize(viewportElement, downloadCanvas, 'height', formData.height);
-
- $('#viewport-preview-height').val(formData.height);
- } else {
- const multiplier = formData.height / enabledElement.image.height;
- formData.width = Math.round(image.width * multiplier);
- setElementSize(viewportElement, downloadCanvas, 'width', formData.width);
-
- $('#viewport-preview-width').val(formData.width);
- }
- } else {
- setElementSize(viewportElement, downloadCanvas, size, value);
- }
-
- updateViewportElement(formData.width, formData.height, formData.showAnnotations);
- });
-};
-
-const registerDownloadImage = () => {
- $('#downloadImage').click(() => {
- const formData = getFormData();
- const downloadCanvas = formData.$imageViewerViewport.find('canvas')[0];
- const fullFileName = `${formData.fileName}.${formData.imageType}`;
- const quality = formData.imageType === 'png' ? 1 : formData.quality / 100;
- const href = downloadCanvas.toDataURL(`image/${formData.imageType}`, quality);
- const $downloadImage = $(document).find('a.downloadImage');
-
- if ($downloadImage.length) {
- $downloadImage.attr('download', fullFileName);
- $downloadImage.attr('href', href);
- $($downloadImage)[0].click();
-
- return;
- }
-
- // Create a new hyperlink element
- const link = document.createElement('a');
- link.classList.add('downloadImage');
- link.download = fullFileName;
- link.href = href;
- document.body.appendChild(link);
- $(link)[0].click();
- });
-};
-
-// Register Preview Dialog Events
-const registerPreviewDialogEvents = () => {
- registerImageType();
- registerShowAnnotations();
- registerKeepAspectRatio();
- registerSize();
- registerDownloadImage();
-};
-
-const initializeViewport = () => {
- const activeViewport = viewportUtils.getActiveViewportElement();
- const enabledElement = cornerstone.getEnabledElement(activeViewport);
-
- const viewport = Object.assign({}, enabledElement.viewport);
- delete viewport.scale;
- viewport.translation = {
- x: 0,
- y: 0
- };
-
- const $viewportElement = $('.viewport-element-hidden');
- const viewportElement = $viewportElement[0];
-
- cornerstone.enable(viewportElement);
-};
-
-const show = () => {
- const $viewerMain = $('#viewerMain');
-
- if ($viewerMain.find('.modal').length) {
- // Clear previous modal
- $viewerMain.find('.modal').remove();
- }
-
- // Add capture image dialog content
- $viewerMain.append(CaptureImageDialog);
-
- registerPreviewDialogEvents();
- initializeViewport();
-
- // Set initial image size
- const activeViewport = viewportUtils.getActiveViewportElement();
- const enabledElement = cornerstone.getEnabledElement(activeViewport);
-
- updateViewportElement(enabledElement.image.width, enabledElement.image.height);
-
- $('#viewport-preview-width').val(enabledElement.image.width);
- $('#viewport-preview-height').val(enabledElement.image.height);
-
- // Open dialog
- $('.captureImageDialog').modal();
-};
-
-const captureImageDialog = {
- show,
-};
-
-export { captureImageDialog };
diff --git a/src/lib/viewerbase/classes/ImageSet.js b/src/lib/viewerbase/classes/ImageSet.js
deleted file mode 100644
index 8367a9d..0000000
--- a/src/lib/viewerbase/classes/ImageSet.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import RandomID from 'random-id';
-import { DCMViewerError } from '../../DCMViewerError';
-
-const OBJECT = 'object';
-
-/**
- * This class defines an ImageSet object which will be used across the viewer. This object represents
- * a list of images that are associated by any arbitrary criteria being thus content agnostic. Besides the
- * main attributes (images and uid) it allows additional attributes to be appended to it (currently
- * indiscriminately, but this should be changed).
- */
-export class ImageSet {
- constructor(images) {
- if (Array.isArray(images) !== true) {
- throw new DCMViewerError('ImageSet expects an array of images');
- }
-
- // @property "images"
- Object.defineProperty(this, 'images', {
- enumerable: false,
- configurable: false,
- writable: false,
- value: images
- });
-
- // @property "uid"
- Object.defineProperty(this, 'uid', {
- enumerable: false,
- configurable: false,
- writable: false,
- value: RandomID() // Unique ID of the instance
- });
- }
-
- getUID() {
- return this.uid;
- }
-
- setAttribute(attribute, value) {
- this[attribute] = value;
- }
-
- getAttribute(attribute) {
- return this[attribute];
- }
-
- setAttributes(attributes) {
- if (typeof attributes === OBJECT && attributes !== null) {
- const imageSet = this;
-
- Object.keys(attributes).forEach((attribute) => {
- imageSet[attribute] = attributes[attribute];
- });
- }
- }
-
- getImage(index) {
- return this.images[index];
- }
-
- sortBy(sortingCallback) {
- return this.images.sort(sortingCallback);
- }
-}
diff --git a/src/lib/viewerbase/classes/LayoutManager.js b/src/lib/viewerbase/classes/LayoutManager.js
deleted file mode 100644
index f74c335..0000000
--- a/src/lib/viewerbase/classes/LayoutManager.js
+++ /dev/null
@@ -1,656 +0,0 @@
-import $ from 'jquery';
-import _ from 'underscore';
-import { DCMViewer } from '../../viewerMain';
-import { DCMViewerLog } from '../../DCMViewerLog';
-import { DCMViewerManager } from '../../DCMViewerManager';
-
-// Displays Series in Viewports given a Protocol and list of Studies
-export class LayoutManager {
- /**
- * Constructor: initializes a Layout Manager object.
- * @param {DOM element} parentNode DOM element representing the parent node, which wraps the Layout Manager content
- * @param {Array} studies Array of studies objects that will be rendered in the Viewer. Each object will be rendered in a div.imageViewerViewport
- */
- constructor(parentNode, studies, renderLayout) {
- DCMViewerLog.info('LayoutManager constructor');
-
- // this.observer = new Tracker.Dependency();
- this.parentNode = parentNode;
- this.studies = studies;
- this.viewportData = [];
- this.layoutProps = {
- rows: 1,
- columns: 1
- };
- this.layoutClassName = this.getLayoutClass();
-
- this.isZoomed = false;
- this.renderLayout = renderLayout;
- }
-
- /**
- * Returns the number of viewports rendered, based on layoutProps
- * @return {integer} number of viewports
- */
- getNumberOfViewports() {
- return this.layoutProps.rows * this.layoutProps.columns;
- }
-
- /**
- * It creates a new viewport data. This is useful for the first rendering when no viewportData is set yet.
- */
- setDefaultViewportData() {
- DCMViewerLog.info('LayoutManager setDefaultViewportData');
-
- const self = this;
-
- // Get the number of viewports to be rendered
- const viewportsAmount = this.getNumberOfViewports();
-
- // Store the old viewport data and reset the current
- const oldViewportData = self.viewportData;
-
- // Get the studies and display sets sequence map
- const sequenceMap = this.getDisplaySetSequenceMap();
-
- // Check if the display sets are sequenced
- const isSequenced = this.isDisplaySetsSequenced(sequenceMap);
-
- // Define the current viewport index and the viewport data array
- let currentViewportIndex = 0;
- if (viewportsAmount > oldViewportData.length && oldViewportData.length && isSequenced) {
- // Keep the displayed display sets
- self.viewportData = oldViewportData;
- currentViewportIndex = oldViewportData.length;
- } else if (viewportsAmount <= oldViewportData.length) {
- // Reduce the original displayed display sets
- self.viewportData = oldViewportData.slice(0, viewportsAmount);
- return;
- } else {
- // Reset all display sets
- self.viewportData = [];
- }
-
- // Get all the display sets for the viewer studies
- const displaySets = [];
- this.studies.forEach((study) => {
- study.displaySets.forEach(dSet => dSet.images.length && displaySets.push(dSet));
- });
-
- // Get the display sets that will be appended to the current ones
- let appendix;
- const currentLength = self.viewportData.length;
- if (currentLength) {
- // TODO: isolate displaySets array by study (maybe a map?)
- const beginIndex = sequenceMap.values().next().value[0].displaySetIndex + currentLength;
- const endIndex = beginIndex + (viewportsAmount - currentLength);
- appendix = displaySets.slice(beginIndex, endIndex);
- } else {
- // Get available display sets from the first to the grid size
- appendix = displaySets.slice(0, viewportsAmount);
- }
-
- // Generate the additional data based on the appendix
- const additionalData = [];
- appendix.forEach((displaySet, index) => {
- const {
- images, studyInstanceUid, seriesInstanceUid, displaySetInstanceUid
- } = displaySet;
- const sopInstanceUid = images[0] && images[0].getSOPInstanceUID ? images[0].getSOPInstanceUID() : '';
- const viewportIndex = currentViewportIndex + index;
- const data = {
- viewportIndex,
- studyInstanceUid,
- seriesInstanceUid,
- displaySetInstanceUid,
- sopInstanceUid
- };
-
- additionalData.push(data);
- });
-
- // Append the additional data with the viewport data
- self.viewportData = self.viewportData.concat(additionalData);
-
- // Push empty objects if the amount is lesser than the grid size
- while (self.viewportData.length < viewportsAmount) {
- self.viewportData.push({});
- }
- }
-
- /**
- * Returns the name of the class to be added to the parentNode
- * @return {string} class name following the pattern layout--. Ex: layout-1-1, layout-2-2
- */
- getLayoutClass() {
- const { rows, columns } = this.layoutProps;
- const layoutClass = `layout-${rows}-${columns}`;
-
- return layoutClass;
- }
-
- /**
- * Add a class to the parentNode based on the layout configuration.
- * This function is helpful to style the layout of viewports.
- * Besides that, each inner div.viewportContainer will have helpful classes
- * as well. See viewer/components/gridLayout/ component in this ohif-viewerbase package.
- */
- updateLayoutClass() {
- const newLayoutClass = this.getLayoutClass();
-
- // If layout has changed, change its class
- if (this.layoutClassName !== newLayoutClass) {
- this.parentNode.classList.remove(this.layoutClassName);
- }
-
- this.layoutClassName = newLayoutClass;
-
- this.parentNode.classList.add(newLayoutClass);
- }
-
- /**
- * Updates the grid with the new layout props.
- * It iterates over all viewportData to render the studies
- * in the viewports.
- * If no viewportData or no viewports defined, it renders the default viewport data.
- */
- updateViewports() {
- DCMViewerLog.info('LayoutManager updateViewports');
-
- if (!this.viewportData ||
- !this.viewportData.length ||
- this.viewportData.length !== this.getNumberOfViewports()) {
- this.setDefaultViewportData();
- }
-
- // imageViewerViewports occasionally needs relevant layout data in order to set
- // the element style of the viewport in question
- const { layoutProps } = this;
- const data = $.extend({
- viewportData: []
- }, layoutProps);
-
- this.viewportData.forEach((viewportData) => {
- const viewportDataAndLayoutProps = $.extend(viewportData, layoutProps);
- data.viewportData.push(viewportDataAndLayoutProps);
- });
-
- this.isZoomed = false;
-
- this.renderLayout(data.viewportData[0]);
- }
-
- /**
- * This function destroys and re-renders the imageViewerViewport template.
- * It uses the data provided to load a new display set into the produced viewport.
- * @param {integer} viewportIndex index of the viewport to be re-rendered
- * @param {Object} data instance data object
- */
- rerenderViewportWithNewDisplaySet(viewportIndex, viewportData) {
- // Clone the data to prevent changing the original object
- const data = _.clone(viewportData);
-
- DCMViewerLog.info(`LayoutManager rerenderViewportWithNewDisplaySet: ${viewportIndex}`);
-
- // The parent container is identified because it is later removed from the DOM
- const element = $('.imageViewerViewport').eq(viewportIndex);
-
- // Record the current viewportIndex so this can be passed into the re-rendering call
- data.viewportIndex = viewportIndex;
-
- // Update the dictionary of loaded displaySet for the specified viewport
- this.viewportData[viewportIndex] = {
- viewportIndex,
- displaySetInstanceUid: data.displaySetInstanceUid,
- displaySet: data.displaySet,
- seriesInstanceUid: data.seriesInstanceUid,
- studyInstanceUid: data.studyInstanceUid,
- renderedCallback: data.renderedCallback,
- currentImageIdIndex: data.currentImageIdIndex || 0
- };
-
- // Remove the hover styling
- element.find('canvas').not('.magnifyTool').removeClass('faded');
-
- const newViewportContainer = document.createElement('div');
- newViewportContainer.className = 'removable';
-
- this.renderLayout(this.viewportData[viewportIndex]);
- }
-
- /**
- * Enlarge a single viewport. Useful when the layout has more than one viewport
- * @param {integer} viewportIndex Index of the viewport to be enlarged
- */
- enlargeViewport(viewportIndex) {
- DCMViewerLog.info(`LayoutManager enlargeViewport: ${viewportIndex}`);
-
- if (!this.viewportData ||
- !this.viewportData.length) {
- return;
- }
-
- // Clone the array for later
- this.previousViewportData = this.viewportData.slice(0);
-
- const singleViewportData = $.extend({}, this.viewportData[viewportIndex]);
- singleViewportData.rows = 1;
- singleViewportData.columns = 1;
- singleViewportData.viewportIndex = 0;
-
- const data = {
- viewportData: [singleViewportData],
- rows: 1,
- columns: 1
- };
-
- $(this.parentNode).html('');
-
- this.isZoomed = true;
- this.zoomedViewportIndex = viewportIndex;
- this.viewportData = data.viewportData;
-
- this.updateSession();
- }
-
- /**
- * Resets to the previous layout configuration.
- * Useful after enlarging a single viewport.
- */
- resetPreviousLayout() {
- DCMViewerLog.info('LayoutManager resetPreviousLayout');
-
- if (!this.isZoomed) {
- return;
- }
-
- this.previousViewportData[this.zoomedViewportIndex] = $.extend({}, this.viewportData[0]);
- this.previousViewportData[this.zoomedViewportIndex].viewportIndex = this.zoomedViewportIndex;
- this.viewportData = this.previousViewportData;
- this.updateViewports();
- }
-
- /**
- * Toogle viewport enlargement.
- * Useful for user to enlarge or going back to previous layout configurations
- * @param {integer} viewportIndex Index of the viewport to be toggled
- */
- toggleEnlargement(viewportIndex) {
- DCMViewerLog.info(`LayoutManager toggleEnlargement: ${viewportIndex}`);
-
- if (this.isZoomed) {
- this.resetPreviousLayout();
- } else if (this.getNumberOfViewports() > 1) {
- // Don't enlarge the viewport if we only have one Viewport
- // to begin with
- this.enlargeViewport(viewportIndex);
- }
- }
-
- /**
- * Return the display sets map sequence of display sets and viewports
- */
- getDisplaySetSequenceMap() {
- DCMViewerLog.info('LayoutManager getDisplaySetSequenceMap');
-
- // Get the viewport data list
- const viewportDataList = this.viewportData;
-
- // Create a map to control the display set sequence
- const sequenceMap = new Map();
-
- // Iterate over each viewport and register its details on the sequence map
- viewportDataList.forEach((viewportData, viewportIndex) => {
- // Get the current study
- const currentStudy = _.findWhere(this.studies, {
- studyInstanceUid: viewportData.studyInstanceUid
- }) || this.studies[0];
-
- // Get the display sets
- const { displaySets } = currentStudy;
-
- // Get the current display set
- const displaySet = _.findWhere(displaySets, {
- displaySetInstanceUid: viewportData.displaySetInstanceUid
- });
-
- // Get the current instance index (using 9999 to sort greater than -1)
- let displaySetIndex = _.indexOf(displaySets, displaySet);
- displaySetIndex = displaySetIndex < 0 ? 9999 : displaySetIndex;
-
- // Try to get a map entry for current study or create it if not present
- let studyViewports = sequenceMap.get(currentStudy);
- if (!studyViewports) {
- studyViewports = [];
- sequenceMap.set(currentStudy, studyViewports);
- }
-
- // Register the viewport index and the display set index on the map
- studyViewports.push({
- viewportIndex,
- displaySetIndex
- });
- });
-
- // Return the generated sequence map
- return sequenceMap;
- }
-
- /**
- * Check if all the display sets and viewports are sequenced
- * @param {Array} definedSequenceMap Array of display set sequence map
- * @return {Boolean} Returns if the display set sequence map is sequenced or not
- */
- isDisplaySetsSequenced(definedSequenceMap) {
- DCMViewerLog.info('LayoutManager isDisplaySetsSequenced');
-
- let isSequenced = true;
-
- // Get the studies and display sets sequence map
- const sequenceMap = definedSequenceMap || this.getDisplaySetSequenceMap();
-
- sequenceMap.forEach((studyViewports) => {
- let lastDisplaySetIndex = null;
- let lastViewportIndex = null;
- studyViewports.forEach(({ viewportIndex, displaySetIndex }) => {
- // Check if the sequence is wrong
- if (
- displaySetIndex !== 9999 &&
- lastViewportIndex !== null &&
- lastDisplaySetIndex !== null &&
- displaySetIndex !== null &&
- (viewportIndex - 1 !== lastViewportIndex ||
- displaySetIndex - 1 !== lastDisplaySetIndex)
- ) {
- // Set the sequenced flag as false;
- isSequenced = false;
- }
-
- // Update the last viewport index
- lastViewportIndex = viewportIndex;
-
- // Update the last display set index
- lastDisplaySetIndex = displaySetIndex;
- });
- });
-
- return isSequenced;
- }
-
- /**
- * Check if is possible to move display sets on a specific direction.
- * It checks if looping is allowed by DCMViewerManager.uiSettings.displaySetNavigationLoopOverSeries
- * @param {Boolean} isNext Represents the direction
- * @return {Boolean} Returns if display sets can be moved
- */
- canMoveDisplaySets(isNext) {
- DCMViewerLog.info('LayoutManager canMoveDisplaySets');
-
- // Get the setting that defines if the display set navigation is multiple
- const isMultiple = DCMViewerManager.uiSettings.displaySetNavigationMultipleViewports;
-
- // Get the setting that allow display set navigation looping over series
- const allowLooping = DCMViewerManager.uiSettings.displaySetNavigationLoopOverSeries;
-
- // Get the studies and display sets sequence map
- const sequenceMap = this.getDisplaySetSequenceMap();
-
- // Check if the display sets are sequenced
- const isSequenced = this.isDisplaySetsSequenced(sequenceMap);
-
- // Get Active Viewport Index if isMultiple is false
- const activeViewportIndex = !isMultiple ? DCMViewerManager.sessions.activeViewport : null;
-
- // Check if is next and looping is blocked
- if (isNext && !allowLooping) {
- // Check if the end was reached
- let endReached = true;
-
- sequenceMap.forEach((studyViewports, study) => {
- // Get active viewport index if isMultiple is false ortherwise get last
- const studyViewport = studyViewports[activeViewportIndex !== null ? activeViewportIndex : studyViewports.length - 1];
- if (!studyViewport) {
- return;
- }
-
- const viewportIndex = studyViewport.displaySetIndex;
- const layoutViewports = studyViewports.length;
- const amount = study.displaySets.length;
- const move = !isMultiple ? 1 : ((amount % layoutViewports) || layoutViewports);
- const lastStepIndex = amount - move;
-
- // 9999 for index means empty viewport, see getDisplaySetSequenceMap function
- if (viewportIndex !== 9999 && viewportIndex !== lastStepIndex) {
- endReached = false;
- }
- });
-
- // Return false if end is not reached yet
- if ((!isMultiple || isSequenced) && endReached) {
- return false;
- }
- }
-
- // Check if is previous and looping is blocked
- if (!isNext && !allowLooping) {
- // Check if the begin was reached
- let beginReached = true;
-
- if (activeViewportIndex >= 0) {
- sequenceMap.forEach((studyViewports) => {
- // Get active viewport index if isMultiple is false ortherwise get first
- const studyViewport = studyViewports[activeViewportIndex !== null ? activeViewportIndex : 0];
- if (!studyViewport) {
- return;
- }
-
- const viewportIndex = studyViewport.displaySetIndex;
- const layoutViewports = studyViewports.length;
-
- // 9999 for index means empty viewport, see getDisplaySetSequenceMap function
- if (viewportIndex !== 9999 && viewportIndex - layoutViewports !== -layoutViewports) {
- beginReached = false;
- }
- });
- }
-
- // Return false if begin is not reached yet
- if ((!isMultiple || isSequenced) && beginReached) {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Move display sets forward or backward in the given viewport index
- * @param {integer} viewportIndex Index of the viewport to be moved
- * @param {Boolean} isNext Represents the direction (true = forward, false = backward)
- */
- moveSingleViewportDisplaySets(viewportIndex, isNext) {
- DCMViewerLog.info(`LayoutManager moveSingleViewportDisplaySets: ${viewportIndex}`);
-
- // Get the setting that allow display set navigation looping over series
- const allowLooping = DCMViewerManager.uiSettings.displaySetNavigationLoopOverSeries;
-
- // Get the selected viewport data
- const viewportData = this.viewportData[viewportIndex];
-
- // Get the current study
- const currentStudy = _.findWhere(this.studies, {
- studyInstanceUid: viewportData.studyInstanceUid
- }) || this.studies[0];
-
- // Get the display sets
- const { displaySets } = currentStudy;
-
- // Get the current display set
- const currentDisplaySet = _.findWhere(displaySets, {
- displaySetInstanceUid: viewportData.displaySetInstanceUid
- });
-
- // Get the new index and ensure that it will exists in display sets
- let newIndex = _.indexOf(displaySets, currentDisplaySet);
- if (isNext) {
- newIndex++;
- if (newIndex >= displaySets.length) {
- // Stop here if looping is not allowed
- if (!allowLooping) {
- return;
- }
-
- newIndex = 0;
- }
- } else {
- newIndex--;
- if (newIndex < 0) {
- // Stop here if looping is not allowed
- if (!allowLooping) {
- return;
- }
-
- newIndex = displaySets.length - 1;
- }
- }
-
- // Get the display set data for the new index
- const newDisplaySetData = displaySets[newIndex];
-
- // Rerender the viewport using the new display set data
- this.rerenderViewportWithNewDisplaySet(viewportIndex, newDisplaySetData);
- }
-
- /**
- * Move multiple display sets forward or backward in all viewports
- * @param {Boolean} isNext Represents the direction (true = forward, false = backward)
- */
- moveMultipleViewportDisplaySets(isNext) {
- DCMViewerLog.info('LayoutManager moveMultipleViewportDisplaySets');
-
- // Get the setting that allow display set navigation looping over series
- const allowLooping = DCMViewerManager.uiSettings.displaySetNavigationLoopOverSeries;
-
- // Create a map to control the display set sequence
- const sequenceMap = this.getDisplaySetSequenceMap();
-
- // Check if the display sets are sequenced
- const isSequenced = this.isDisplaySetsSequenced(sequenceMap);
-
- const displaySetsToRender = [];
-
- // Iterate over the studies map and move its display sets
- sequenceMap.forEach((studyViewports, study) => {
- // Sort the viewports on the study by the display set index
- studyViewports.sort((a, b) => a.displaySetIndex > b.displaySetIndex);
-
- // Get the study display sets
- const { displaySets } = study;
-
- // Calculate the base index
- const firstIndex = studyViewports[0].displaySetIndex;
- const steps = studyViewports.length;
- const rest = firstIndex % steps;
- let baseIndex = rest ? firstIndex - rest : firstIndex;
- const direction = isNext ? 1 : -1;
- baseIndex += steps * direction;
-
- const amount = displaySets.length;
-
- // Check if the indexes are sequenced or will overflow the array bounds
- if (baseIndex >= amount) {
- const move = (amount % steps) || steps;
- const lastStepIndex = amount - move;
- if (firstIndex + steps !== lastStepIndex + steps) {
- // Reset the index if the display sets are sequenced but shifted
- baseIndex = lastStepIndex;
- } else if (!allowLooping) {
- // Stop here if looping is not allowed
- return;
- } else {
- // Start over the series if looping is allowed
- baseIndex = 0;
- }
- } else if (baseIndex < 0) {
- if (firstIndex > 0) {
- // Reset the index if the display sets are sequenced but shifted
- baseIndex = 0;
- } else if (!allowLooping) {
- // Stop here if looping is not allowed
- return;
- } else {
- // Go to the series' end if looping is allowed
- baseIndex = (amount - 1) - ((amount - 1) % steps);
- }
- } else if (!isSequenced) {
- // Reset the sequence if indexes are not sequenced
- baseIndex = 0;
- }
-
- // Iterate over the current study viewports
- studyViewports.forEach((viewport, index) => {
- // Get the new displaySet index to be rendered in viewport
- const newIndex = baseIndex + index;
-
- // Get the display set data for the new index
- const displaySetData = displaySets[newIndex] || {};
-
- // Add the current display set that on the render list
- displaySetsToRender.push(displaySetData);
- });
- });
-
- // Sort the display sets
- const sortingFunction = DCMViewer.utils.sortBy({
- name: 'studyInstanceUid'
- }, {
- name: 'instanceNumber'
- }, {
- name: 'seriesNumber'
- });
- displaySetsToRender.sort((a, b) => sortingFunction(a, b));
-
- // Iterate over each display set data and render on its respective viewport
- displaySetsToRender.forEach((data, index) => {
- this.rerenderViewportWithNewDisplaySet(index, data);
- });
- }
-
- /**
- * Move display sets forward or backward
- * @param {Boolean} isNext Represents the direction (true = forward, false = backward)
- */
- moveDisplaySets(isNext) {
- DCMViewerLog.info('LayoutManager moveDisplaySets');
-
- // Check if navigation is on a single or multiple viewports
- if (DCMViewerManager.uiSettings.displaySetNavigationMultipleViewports) {
- // Move display sets on multiple viewports
- this.moveMultipleViewportDisplaySets(isNext);
- } else {
- // Get the selected viewport index
- const viewportIndex = DCMViewerManager.sessions.activeViewport;
-
- // Move display sets on a single viewport
- this.moveSingleViewportDisplaySets(viewportIndex, isNext);
- }
- }
-
- /**
- * Check if a study is loaded into a viewport
- * @param {string} studyInstanceUid Study instance Uid string
- * @param {integer} viewportIndex Index of the viewport to be checked
- * @return {Boolean} Returns if the given study is in the given viewport or not
- */
- isStudyLoadedIntoViewport(studyInstanceUid, viewportIndex) {
- return (this.viewportData.find(item => item.studyInstanceUid === studyInstanceUid && item.viewportIndex === viewportIndex) !== undefined);
- }
-
- /**
- * Check if the layout has multiple rows and columns
- * @return {Boolean} Return if the layout has multiple rows and columns or not
- */
- isMultipleLayout() {
- return this.layoutProps.row !== 1 && this.layoutProps.columns !== 1;
- }
-}
diff --git a/src/lib/viewerbase/classes/MetadataProvider.js b/src/lib/viewerbase/classes/MetadataProvider.js
deleted file mode 100644
index d0e3936..0000000
--- a/src/lib/viewerbase/classes/MetadataProvider.js
+++ /dev/null
@@ -1,350 +0,0 @@
-import { cornerstoneMath } from '../../cornerstonejs';
-import { parsingUtils } from '../parsingUtils';
-
-const FUNCTION = 'function';
-
-export class MetadataProvider {
- constructor() {
- // Define the main "metadataLookup" private property as an immutable property.
- Object.defineProperty(this, 'metadataLookup', {
- configurable: false,
- enumerable: false,
- writable: false,
- value: new Map()
- });
-
- // Local reference to provider function bound to current instance.
- Object.defineProperty(this, '_provider', {
- configurable: false,
- enumerable: false,
- writable: true,
- value: null
- });
- }
-
- /**
- * Cornerstone Metadata provider to store image meta data
- * Data from instances, series, and studies are associated with
- * imageIds to facilitate usage of this information by Cornerstone's Tools
- *
- * e.g. the imagePlane metadata object contains instance information about
- * row/column pixel spacing, patient position, and patient orientation. It
- * is used in CornerstoneTools to position reference lines and orientation markers.
- *
- * @param {String} imageId The Cornerstone ImageId
- * @param {Object} data An object containing instance, series, and study metadata
- */
- addMetadata(imageId, data) {
- const instanceMetadata = data.instance;
- const seriesMetadata = data.series;
- const studyMetadata = data.study;
- const { numImages } = data;
-
- const metadata = {};
-
- metadata.study = {
- accessionNumber: studyMetadata.accessionNumber,
- patientId: studyMetadata.patientId,
- studyInstanceUid: studyMetadata.studyInstanceUid,
- studyDate: studyMetadata.studyDate,
- studyTime: studyMetadata.studyTime,
- studyDescription: studyMetadata.studyDescription,
- institutionName: studyMetadata.institutionName,
- patientHistory: studyMetadata.patientHistory
- };
-
- metadata.series = {
- seriesDescription: seriesMetadata.seriesDescription,
- seriesNumber: seriesMetadata.seriesNumber,
- seriesDate: seriesMetadata.seriesDate,
- seriesTime: seriesMetadata.seriesTime,
- modality: seriesMetadata.modality,
- seriesInstanceUid: seriesMetadata.seriesInstanceUid,
- numImages
- };
-
- metadata.instance = instanceMetadata;
-
- metadata.patient = {
- name: studyMetadata.patientName,
- id: studyMetadata.patientId,
- birthDate: studyMetadata.patientBirthDate,
- sex: studyMetadata.patientSex,
- age: studyMetadata.patientAge
- };
-
- // If there is sufficient information, populate
- // the imagePlane object for easier use in the Viewer
- metadata.imagePlane = this.getImagePlane(instanceMetadata);
-
- // Add the metadata to the imageId lookup object
- this.metadataLookup.set(imageId, metadata);
- }
-
- /**
- * Return the metadata for the given imageId
- * @param {String} imageId The Cornerstone ImageId
- * @returns image metadata
- */
- getMetadata(imageId) {
- return this.metadataLookup.get(imageId);
- }
-
- /**
- * Adds a set of metadata to the Cornerstone metadata provider given a specific
- * imageId, type, and dataset
- *
- * @param imageId
- * @param type (e.g. series, instance, tagDisplay)
- * @param data
- */
- addSpecificMetadata(imageId, type, data) {
- const metadata = {};
- metadata[type] = data;
-
- const oldMetadata = this.metadataLookup.get(imageId);
- this.metadataLookup.set(imageId, Object.assign(oldMetadata, metadata));
- }
-
- getFromImage(image, type, tag, attrName, defaultValue) {
- let value;
-
- if (image.data) {
- value = this.getFromDataSet(image.data, type, tag);
- } else {
- value = image.instance[attrName];
- }
-
- return value == null ? defaultValue : value;
- }
-
- getFromDataSet(dataSet, type, tag) {
- if (!dataSet) {
- return;
- }
-
- const fn = dataSet[type];
- if (!fn) {
- return;
- }
-
- return fn.call(dataSet, tag);
- }
-
- getFrameIncrementPointer(image) {
- const dataSet = image.data;
- let frameInstancePointer = '';
-
- if (parsingUtils.isValidDataSet(dataSet)) {
- const frameInstancePointerNames = {
- x00181063: 'frameTime',
- x00181065: 'frameTimeVector'
- };
-
- // (0028,0009) = Frame Increment Pointer
- const frameInstancePointerTag = parsingUtils.attributeTag(dataSet, 'x00280009');
- frameInstancePointer = frameInstancePointerNames[frameInstancePointerTag];
- } else {
- frameInstancePointer = image.instance.frameIncrementPointer;
- }
-
- return frameInstancePointer || '';
- }
-
- getFrameTimeVector(image) {
- const dataSet = image.data;
-
- if (parsingUtils.isValidDataSet(dataSet)) {
- // Frame Increment Pointer points to Frame Time Vector (0018,1065) field
- return parsingUtils.floatArray(dataSet, 'x00181065');
- }
-
- return image.instance.frameTimeVector;
- }
-
- getFrameTime(image) {
- const dataSet = image.data;
-
- if (parsingUtils.isValidDataSet(dataSet)) {
- // Frame Increment Pointer points to Frame Time (0018,1063) field or is not defined (for addtional flexibility).
- // Yet another value is possible for this field (5200,9230 for Multi-frame Functional Groups)
- // but that case is currently not supported.
- return dataSet.floatString('x00181063', -1);
- }
-
- return image.instance.frameTime;
- }
-
- /**
- * Updates the related metadata for missing fields given a specified image
- *
- * @param image
- */
- updateMetadata(image) {
- const imageMetadata = this.metadataLookup.get(image.imageId);
- if (!imageMetadata) {
- return;
- }
-
- imageMetadata.patient.age = imageMetadata.patient.age || this.getFromDataSet(image.data, 'string', 'x00101010');
-
- imageMetadata.instance.rows = imageMetadata.instance.rows || image.rows;
- imageMetadata.instance.columns = imageMetadata.instance.columns || image.columns;
-
- imageMetadata.instance.sopClassUid = imageMetadata.instance.sopClassUid || this.getFromDataSet(image.data, 'string', 'x00080016');
- imageMetadata.instance.sopInstanceUid = imageMetadata.instance.sopInstanceUid || this.getFromDataSet(image.data, 'string', 'x00080018');
-
- imageMetadata.instance.pixelSpacing = imageMetadata.instance.pixelSpacing || this.getFromDataSet(image.data, 'string', 'x00280030');
- imageMetadata.instance.frameOfReferenceUID = imageMetadata.instance.frameOfReferenceUID || this.getFromDataSet(image.data, 'string', 'x00200052');
- imageMetadata.instance.imageOrientationPatient = imageMetadata.instance.imageOrientationPatient || this.getFromDataSet(image.data, 'string', 'x00200037');
- imageMetadata.instance.imagePositionPatient = imageMetadata.instance.imagePositionPatient || this.getFromDataSet(image.data, 'string', 'x00200032');
-
- imageMetadata.instance.sliceThickness = imageMetadata.instance.sliceThickness || this.getFromDataSet(image.data, 'string', 'x00180050');
- imageMetadata.instance.sliceLocation = imageMetadata.instance.sliceLocation || this.getFromDataSet(image.data, 'string', 'x00201041');
- imageMetadata.instance.tablePosition = imageMetadata.instance.tablePosition || this.getFromDataSet(image.data, 'string', 'x00189327');
- imageMetadata.instance.spacingBetweenSlices = imageMetadata.instance.spacingBetweenSlices || this.getFromDataSet(image.data, 'string', 'x00180088');
-
- imageMetadata.instance.lossyImageCompression = imageMetadata.instance.lossyImageCompression || this.getFromDataSet(image.data, 'string', 'x00282110');
- imageMetadata.instance.lossyImageCompressionRatio = imageMetadata.instance.lossyImageCompressionRatio || this.getFromDataSet(image.data, 'string', 'x00282112');
-
- imageMetadata.instance.frameIncrementPointer = imageMetadata.instance.frameIncrementPointer || this.getFromDataSet(image.data, 'string', 'x00280009');
- imageMetadata.instance.frameTime = imageMetadata.instance.frameTime || this.getFromDataSet(image.data, 'string', 'x00181063');
- imageMetadata.instance.frameTimeVector = imageMetadata.instance.frameTimeVector || this.getFromDataSet(image.data, 'string', 'x00181065');
-
- if ((image.data || image.instance) && !imageMetadata.instance.multiframeMetadata) {
- imageMetadata.instance.multiframeMetadata = this.getMultiframeModuleMetadata(image);
- }
-
- imageMetadata.imagePlane = imageMetadata.imagePlane || this.getImagePlane(imageMetadata.instance);
- }
-
- /**
- * Constructs and returns the imagePlane given the metadata instance
- *
- * @param metadataInstance The metadata instance (InstanceMetadata class) containing information to construct imagePlane
- * @returns imagePlane The constructed imagePlane to be used in viewer easily
- */
- getImagePlane(instance) {
- if (!instance.rows || !instance.columns || !instance.pixelSpacing ||
- !instance.frameOfReferenceUID || !instance.imageOrientationPatient ||
- !instance.imagePositionPatient) {
- return;
- }
-
- const imageOrientation = instance.imageOrientationPatient.split('\\');
- const imagePosition = instance.imagePositionPatient.split('\\');
-
- let columnPixelSpacing = 1.0;
- let rowPixelSpacing = 1.0;
- if (instance.pixelSpacing) {
- const split = instance.pixelSpacing.split('\\');
- rowPixelSpacing = parseFloat(split[0]);
- columnPixelSpacing = parseFloat(split[1]);
- }
-
- return {
- frameOfReferenceUID: instance.frameOfReferenceUID,
- rows: instance.rows,
- columns: instance.columns,
- rowCosines:
- new cornerstoneMath.Vector3(parseFloat(imageOrientation[0]), parseFloat(imageOrientation[1]), parseFloat(imageOrientation[2])),
- columnCosines:
- new cornerstoneMath.Vector3(parseFloat(imageOrientation[3]), parseFloat(imageOrientation[4]), parseFloat(imageOrientation[5])),
- imagePositionPatient:
- new cornerstoneMath.Vector3(parseFloat(imagePosition[0]), parseFloat(imagePosition[1]), parseFloat(imagePosition[2])),
- rowPixelSpacing,
- columnPixelSpacing,
- };
- }
-
- /**
- * This function extracts miltiframe information from a dicomParser.DataSet object.
- *
- * @param dataSet {Object} An instance of dicomParser.DataSet object where multiframe information can be found.
- * @return {Object} An object containing multiframe image metadata (frameIncrementPointer, frameTime, frameTimeVector, etc).
- */
- getMultiframeModuleMetadata(image) {
- const imageInfo = {
- isMultiframeImage: false,
- frameIncrementPointer: null,
- numberOfFrames: 0,
- frameTime: 0,
- frameTimeVector: null,
- averageFrameRate: 0 // backwards compatibility only... it might be useless in the future
- };
-
- let frameTime;
-
- const numberOfFrames = this.getFromImage(image, 'intString', 'x00280008', 'numberOfFrames', -1);
-
- if (numberOfFrames > 0) {
- // set multi-frame image indicator
- imageInfo.isMultiframeImage = true;
- imageInfo.numberOfFrames = numberOfFrames;
-
- // (0028,0009) = Frame Increment Pointer
- const frameIncrementPointer = this.getFrameIncrementPointer(image);
-
- if (frameIncrementPointer === 'frameTimeVector') {
- // Frame Increment Pointer points to Frame Time Vector (0018,1065) field
- const frameTimeVector = this.getFrameTimeVector(image);
-
- if (frameTimeVector instanceof Array && frameTimeVector.length > 0) {
- imageInfo.frameIncrementPointer = frameIncrementPointer;
- imageInfo.frameTimeVector = frameTimeVector;
- frameTime = frameTimeVector.reduce((a, b) => a + b) / frameTimeVector.length;
- imageInfo.averageFrameRate = 1000 / frameTime;
- }
- } else if (frameIncrementPointer === 'frameTime' || frameIncrementPointer === '') {
- frameTime = this.getFrameTime(image);
-
- if (frameTime > 0) {
- imageInfo.frameIncrementPointer = frameIncrementPointer;
- imageInfo.frameTime = frameTime;
- imageInfo.averageFrameRate = 1000 / frameTime;
- }
- }
- }
-
- return imageInfo;
- }
-
- /**
- * Get a bound reference to the provider function.
- */
- getProvider() {
- let provider = this._provider;
- if (typeof this._provider !== FUNCTION) {
- provider = this.provider.bind(this);
- this._provider = provider;
- }
-
- return provider;
- }
-
- /**
- * Looks up metadata for Cornerstone Tools given a specified type and imageId
- * A type may be, e.g. 'study', or 'patient', or 'imagePlane'. These types
- * are keys in the stored metadata objects.
- *
- * @param type
- * @param imageId
- * @returns {Object} Relevant metadata of the specified type
- */
- provider(type, imageId) {
- // TODO: Cornerstone Tools use 'imagePlaneModule', but application Metadata Provider uses 'imagePlane'.
- // It must be consistent.
- if (type === 'imagePlaneModule') {
- type = 'imagePlane';
- }
-
- const imageMetadata = this.metadataLookup.get(imageId);
- if (!imageMetadata) {
- return;
- }
-
- if (imageMetadata.hasOwnProperty(type)) {
- return imageMetadata[type];
- }
- }
-}
diff --git a/src/lib/viewerbase/classes/ResizeViewportManager.js b/src/lib/viewerbase/classes/ResizeViewportManager.js
deleted file mode 100644
index 1a21ed9..0000000
--- a/src/lib/viewerbase/classes/ResizeViewportManager.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import $ from 'jquery';
-import { cornerstone } from '../../cornerstonejs';
-import { getInstanceClassDefaultViewport } from '../instanceClassSpecificViewport';
-import { DCMViewerLog } from '../../DCMViewerLog';
-
-// Manage resizing viewports triggered by window resize
-export class ResizeViewportManager {
- constructor() {
- this._resizeHandler = null;
- }
-
- // Relocate dialogs positions
- relocateDialogs() {
- DCMViewerLog.info('ResizeViewportManager relocateDialogs');
-
- const $bottomRightDialogs = $('#annotationDialog, #textMarkerOptionsDialog');
- $bottomRightDialogs.css({
- top: '', // This removes the CSS property completely
- left: '',
- bottom: 0,
- right: 0
- });
-
- const centerDialogs = $('.draggableDialog').not($bottomRightDialogs);
-
- centerDialogs.css({
- top: 0,
- left: 0,
- bottom: 0,
- right: 0
- });
- }
-
- // Resize viewport scrollbars
- resizeScrollbars(element) {
- DCMViewerLog.info('ResizeViewportManager resizeScrollbars');
-
- const $currentOverlay = $(element).siblings('.imageViewerViewportOverlay');
- $currentOverlay.find('.scrollbar').trigger('rescale');
- }
-
- // Resize a single viewport element
- resizeViewportElement(element, fitToWindow = true) {
- let enabledElement;
- try {
- enabledElement = cornerstone.getEnabledElement(element);
- } catch (error) {
- return;
- }
-
- cornerstone.resize(element, fitToWindow);
-
- if (enabledElement.fitToWindow === false) {
- const { imageId } = enabledElement.image;
- const instance = cornerstone.metaData.get('instance', imageId);
- const instanceClassViewport = getInstanceClassDefaultViewport(instance, enabledElement, imageId);
- cornerstone.setViewport(element, instanceClassViewport);
- }
- }
-
- // Resize each viewport element
- resizeViewportElements() {
- this.relocateDialogs();
-
- setTimeout(() => {
- const elements = $('.imageViewerViewport').not('.empty');
- elements.each((index, element) => {
- this.resizeViewportElement(element);
- this.resizeScrollbars(element);
- });
- }, 1);
- }
-
- // Function to override resizeViewportElements function
- setResizeViewportElement(resizeViewportElements) {
- this.resizeViewportElements = resizeViewportElements;
- }
-
- // Avoid doing DOM manipulation during the resize handler
- // because it is fired very often.
- // Resizing is therefore performed 100 ms after the resize event stops.
- handleResize() {
- clearTimeout(this.resizeTimer);
- this.resizeTimer = setTimeout(() => {
- DCMViewerLog.info('ResizeViewportManager resizeViewportElements');
- this.resizeViewportElements();
- }, 100);
- }
-
- /**
- * Returns a unique event handler function associated with a given instance using lazy assignment.
- * @return {function} Returns a unique copy of the event handler of this class.
- */
- getResizeHandler() {
- let resizeHandler = this._resizeHandler;
- if (resizeHandler === null) {
- resizeHandler = this.handleResize.bind(this);
- this._resizeHandler = resizeHandler;
- }
-
- return resizeHandler;
- }
-}
diff --git a/src/lib/viewerbase/classes/StackImagePositionOffsetSynchronizer.js b/src/lib/viewerbase/classes/StackImagePositionOffsetSynchronizer.js
deleted file mode 100644
index ae90191..0000000
--- a/src/lib/viewerbase/classes/StackImagePositionOffsetSynchronizer.js
+++ /dev/null
@@ -1,219 +0,0 @@
-import $ from 'jquery';
-import { cornerstone, cornerstoneTools } from '../../cornerstonejs';
-import { toolManager } from '../toolManager';
-import { DCMViewerLog } from '../../DCMViewerLog';
-import { DCMViewerManager } from '../../DCMViewerManager';
-
-export class StackImagePositionOffsetSynchronizer {
- constructor() {
- this.active = false;
- this.syncedViewports = [];
- this.synchronizer = new cornerstoneTools.Synchronizer('cornerstonenewimage', cornerstoneTools.stackImagePositionOffsetSynchronizer);
- }
-
- static get ELEMENT_DISABLED_EVENT() {
- return 'cornerstoneelementdisabled.StackImagePositionOffsetSynchronizer';
- }
-
- isActive() {
- return this.active;
- }
-
- activate() {
- const viewports = this.getLinkableViewports();
- this.syncViewports(viewports);
- }
-
- activateByViewportIndexes(viewportIndexes) {
- const viewports = this.getViewportByIndexes(viewportIndexes);
- this.syncViewports(viewports);
- }
-
- deactivate() {
- if (!this.isActive()) {
- return;
- }
-
- while (this.syncedViewports.length) {
- const viewport = this.syncedViewports[0];
- this.removeViewport(viewport);
- }
-
- this.active = false;
- toolManager.deactivateCommandButton('linkStackScroll');
- }
-
- update() {
- if (!this.isActive()) {
- return;
- }
-
- const activeViewportElement = this.getActiveViewportElement();
-
- if (this.isViewportSynced(activeViewportElement)) {
- return;
- }
-
- this.deactivate();
- this.activate();
- }
-
- syncViewports(viewports) {
- const viewportIndexes = [];
-
- if (this.isActive() || (viewports.length <= 1)) {
- return;
- }
-
- viewports.forEach((viewport) => {
- this.synchronizer.add(viewport.element);
- this.syncedViewports.push(viewport);
- viewportIndexes.push(viewport.index);
- if (!this.disabledListener) {
- this.disabledListener = this.elementDisabledHandler(this);
- }
-
- viewport.element.addEventListener(StackImagePositionOffsetSynchronizer.ELEMENT_DISABLED_EVENT, this.disabledListener);
- });
-
- this.active = true;
- toolManager.activateCommandButton('linkStackScroll');
-
- DCMViewerManager.sessions.StackImagePositionOffsetSynchronizerLinkedViewports = viewportIndexes;
- }
-
- isViewportSynced(viewportElement) {
- return !!this.getViewportByElement(viewportElement);
- }
-
- getActiveViewportElement() {
- const viewportIndex = DCMViewerManager.sessions.activeViewport || 0;
- return $('.imageViewerViewport').get(viewportIndex);
- }
-
- removeViewport(viewport) {
- const index = this.syncedViewports.indexOf(viewport);
-
- if (index === -1) {
- return;
- }
-
- this.syncedViewports.splice(index, 1);
- this.synchronizer.remove(viewport.element);
- this.removeLinkedViewportFromSession(viewport);
- viewport.element.removeEventListener(StackImagePositionOffsetSynchronizer.ELEMENT_DISABLED_EVENT, this.disabledListener);
- }
-
- getViewportByElement(viewportElement) {
- const { length } = this.syncedViewports;
-
- for (let i = 0; i < length; i++) {
- const viewport = this.syncedViewports[i];
-
- if (viewport.element === viewportElement) {
- return viewport;
- }
- }
- }
-
- removeViewportByElement(viewportElement) {
- const viewport = this.getViewportByElement(viewportElement);
-
- if (viewport) {
- this.removeViewport(viewport);
- }
- }
-
- removeLinkedViewportFromSession(viewport) {
- const linkedViewports = DCMViewerManager.sessions.StackImagePositionOffsetSynchronizerLinkedViewports;
- const index = linkedViewports.indexOf(viewport.index);
-
- if (index !== -1) {
- linkedViewports.splice(index, 1);
- DCMViewerManager.sessions.StackImagePositionOffsetSynchronizerLinkedViewports = linkedViewports;
- }
- }
-
- elementDisabledHandler(context) {
- return e => context.removeViewportByElement(e.detail.element);
- }
-
- getViewportByIndexes(viewportIndexes) {
- const viewports = [];
- const $viewportElements = $('.imageViewerViewport');
-
- viewportIndexes.forEach((index) => {
- const element = $viewportElements.get(index);
-
- if (!element) {
- return;
- }
-
- viewports.push({
- index,
- element
- });
- });
-
- return viewports;
- }
-
- isViewportsLinkable(viewportElementA, viewportElementB) {
- const viewportAImageNormal = this.getViewportImageNormal(viewportElementA);
- const viewportBImageNormal = this.getViewportImageNormal(viewportElementB);
-
- if (viewportAImageNormal && viewportBImageNormal) {
- const angleInRadians = viewportBImageNormal.angleTo(viewportAImageNormal);
-
- // Pi / 12 radians = 15 degrees
- // If the angle between two vectors is Pi, it means they are just inverted
- return angleInRadians < Math.PI / 12 || angleInRadians === Math.PI;
- }
-
- return false;
- }
-
- getLinkableViewports() {
- const activeViewportElement = this.getActiveViewportElement();
- const viewports = [];
-
- $('.imageViewerViewport').each((index, viewportElement) => {
- if (this.isViewportsLinkable(activeViewportElement, viewportElement)) {
- viewports.push({
- index,
- element: viewportElement
- });
- }
- });
-
- return viewports;
- }
-
- getViewportImageNormal(element) {
- if (!element) {
- return;
- }
-
- element = $(element).get(0);
-
- try {
- const enabledElement = cornerstone.getEnabledElement(element);
-
- if (!enabledElement.image) {
- return;
- }
-
- const { imageId } = enabledElement.image;
- const imagePlane = cornerstone.metaData.get('imagePlane', imageId);
-
- if (!imagePlane || !imagePlane.rowCosines || !imagePlane.columnCosines) {
- return;
- }
-
- return imagePlane.rowCosines.clone().cross(imagePlane.columnCosines);
- } catch (error) {
- const errorMessage = error.message || error;
- DCMViewerLog.info(`StackImagePositionOffsetSynchronizer getViewportImageNormal: ${errorMessage}`);
- }
- }
-}
diff --git a/src/lib/viewerbase/classes/StudyLoadingListener.js b/src/lib/viewerbase/classes/StudyLoadingListener.js
deleted file mode 100644
index 54679a1..0000000
--- a/src/lib/viewerbase/classes/StudyLoadingListener.js
+++ /dev/null
@@ -1,400 +0,0 @@
-import { cornerstone, cornerstoneWADOImageLoader } from '../../cornerstonejs';
-import { StackManager } from '../StackManager';
-import { DCMViewerManager } from '../../DCMViewerManager';
-import { DCMViewerLog } from '../../DCMViewerLog';
-
-class BaseLoadingListener {
- constructor(stack, options) {
- options = options || {};
-
- this.id = BaseLoadingListener.getNewId();
- this.stack = stack;
- this.startListening();
- this.statsItemsLimit = options.statsItemsLimit || 2;
- this.stats = {
- items: [],
- total: 0,
- elapsedTime: 0,
- speed: 0
- };
-
- // Register the start point to make it possible to calculate
- // bytes/s or frames/s when the first byte or frame is received
- this._addStatsData(0);
-
- // Update the progress before starting the download
- // to make it possible to update the UI
- this._updateProgress();
- }
-
- _addStatsData(value) {
- const date = new Date();
- const { stats } = this;
- const { items } = stats;
- const newItem = {
- value,
- date
- };
-
- items.push(newItem);
- stats.total += newItem.value;
-
- // Remove items until it gets below the limit
- while (items.length > this.statsItemsLimit) {
- const item = items.shift();
- stats.total -= item.value;
- }
-
- // Update the elapsedTime (seconds) based on first and last
- // elements and recalculate the speed (bytes/s or frames/s)
- if (items.length > 1) {
- const oldestItem = items[0];
- stats.elapsedTime = (newItem.date.getTime() - oldestItem.date.getTime()) / 1000;
- stats.speed = (stats.total - oldestItem.value) / stats.elapsedTime;
- }
- }
-
- _getProgressSessionId() {
- const { displaySetInstanceUid } = this.stack;
- return `StackProgress:${displaySetInstanceUid}`;
- }
-
- _clearSession() {
- const progressSessionId = this._getProgressSessionId();
- DCMViewerManager.sessions[progressSessionId] = undefined;
- delete DCMViewerManager.sessions[progressSessionId];
- }
-
- startListening() {
- throw new Error('`startListening` must be implemented by child clases');
- }
-
- stopListening() {
- throw new Error('`stopListening` must be implemented by child clases');
- }
-
- destroy() {
- this.stopListening();
- this._clearSession();
- }
-
- static getNewId() {
- const timeSlice = (new Date()).getTime().toString().slice(-8);
- const randomNumber = parseInt(Math.random() * 1000000000, 10);
-
- return timeSlice.toString() + randomNumber.toString();
- }
-}
-
-class DICOMFileLoadingListener extends BaseLoadingListener {
- constructor(stack) {
- super(stack);
- this._dataSetUrl = this._getDataSetUrl(stack);
- this._lastLoaded = 0;
-
- // Check how many instances has already been download (cached)
- this._checkCachedData();
- }
-
- _checkCachedData() {
- const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get(this._dataSetUrl);
-
- if (dataSet) {
- const dataSetLength = dataSet.byteArray.length;
-
- this._updateProgress({
- percentComplete: 100,
- loaded: dataSetLength,
- total: dataSetLength
- });
- }
- }
-
- _getImageLoadProgressEventName() {
- return `cornerstoneimageloadprogress.${this.id}`;
- }
-
- startListening() {
- const imageLoadProgressEventName = this._getImageLoadProgressEventName();
- const imageLoadProgressEventHandle = this._imageLoadProgressEventHandle.bind(this);
-
- this.stopListening();
-
- cornerstone.events.addEventListener(imageLoadProgressEventName, imageLoadProgressEventHandle);
- }
-
- stopListening() {
- const imageLoadProgressEventName = this._getImageLoadProgressEventName();
- cornerstone.events.removeEventListener(imageLoadProgressEventName);
- }
-
- _imageLoadProgressEventHandle(e) {
- const eventData = e.detail;
- const dataSetUrl = this._convertImageIdToDataSetUrl(eventData.imageId);
- const bytesDiff = eventData.loaded - this._lastLoaded;
-
- if (!this._dataSetUrl === dataSetUrl) {
- return;
- }
-
- // Add the bytes downloaded to the stats
- this._addStatsData(bytesDiff);
-
- // Update the download progress
- this._updateProgress(eventData);
-
- // Cache the last eventData.loaded value
- this._lastLoaded = eventData.loaded;
- }
-
- _updateProgress(eventData) {
- const progressSessionId = this._getProgressSessionId();
- eventData = eventData || {};
-
- DCMViewerManager.sessions[progressSessionId] = {
- multiFrame: false,
- percentComplete: eventData.percentComplete,
- bytesLoaded: eventData.loaded,
- bytesTotal: eventData.total,
- bytesPerSecond: this.stats.speed
- };
- }
-
- _convertImageIdToDataSetUrl(imageId) {
- // Remove the prefix ("dicomweb:" or "wadouri:"")
- imageId = imageId.replace(/^(dicomweb:|wadouri:)/i, '');
-
- // Remove "frame=999&" from the imageId
- imageId = imageId.replace(/frame=\d+&?/i, '');
-
- // Remove the last "&" like in "http://...?foo=1&bar=2&"
- imageId = imageId.replace(/&$/, '');
-
- return imageId;
- }
-
- _getDataSetUrl(stack) {
- const imageId = stack.imageIds[0];
- return this._convertImageIdToDataSetUrl(imageId);
- }
-}
-
-class StackLoadingListener extends BaseLoadingListener {
- constructor(stack) {
- super(stack, { statsItemsLimit: 20 });
- this.imageDataMap = this._convertImageIdsArrayToMap(stack.imageIds);
- this.framesStatus = this._createArray(stack.imageIds.length, false);
- this.loadedCount = 0;
-
- // Check how many instances has already been download (cached)
- this._checkCachedData();
- }
-
- _convertImageIdsArrayToMap(imageIds) {
- const imageIdsMap = new Map();
-
- for (let i = 0; i < imageIds.length; i++) {
- imageIdsMap.set(imageIds[i], {
- index: i,
- loaded: false
- });
- }
-
- return imageIdsMap;
- }
-
- _createArray(length, defaultValue) {
- // `new Array(length)` is an anti-pattern in javascript because its
- // funny API. Otherwise I would go for `new Array(length).fill(false)`
- const array = [];
-
- for (let i = 0; i < length; i++) {
- array[i] = defaultValue;
- }
-
- return array;
- }
-
- _checkCachedData() {
- // const imageIds = this.stack.imageIds;
-
- // TODO: No way to check status of Promise.
- /* for(let i = 0; i < imageIds.length; i++) {
- const imageId = imageIds[i];
-
- const imagePromise = cornerstone.imageCache.getImageLoadObject(imageId).promise;
-
- if (imagePromise && (imagePromise.state() === 'resolved')) {
- this._updateFrameStatus(imageId, true);
- }
- } */
- }
-
- _getImageLoadedEventName() {
- return `cornerstoneimageloaded.${this.id}`;
- }
-
- _getImageCachePromiseRemoveEventName() {
- return `cornerstoneimagecachepromiseremoved.${this.id}`;
- }
-
- startListening() {
- const imageLoadedEventName = this._getImageLoadedEventName();
- const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();
- const imageLoadedEventHandle = this._imageLoadedEventHandle.bind(this);
- const imageCachePromiseRemovedEventHandle = this._imageCachePromiseRemovedEventHandle.bind(this);
-
- this.stopListening();
-
- cornerstone.events.addEventListener(imageLoadedEventName, imageLoadedEventHandle);
- cornerstone.events.addEventListener(imageCachePromiseRemovedEventName, imageCachePromiseRemovedEventHandle);
- }
-
- stopListening() {
- const imageLoadedEventName = this._getImageLoadedEventName();
- const imageCachePromiseRemovedEventName = this._getImageCachePromiseRemoveEventName();
-
- cornerstone.events.removeEventListener(imageLoadedEventName);
- cornerstone.events.removeEventListener(imageCachePromiseRemovedEventName);
- }
-
- _updateFrameStatus(imageId, loaded) {
- const imageData = this.imageDataMap.get(imageId);
-
- if (!imageData || (imageData.loaded === loaded)) {
- return;
- }
-
- // Add one more frame to the stats
- if (loaded) {
- this._addStatsData(1);
- }
-
- imageData.loaded = loaded;
- this.framesStatus[imageData.index] = loaded;
- this.loadedCount += loaded ? 1 : -1;
- this._updateProgress();
- }
-
- _imageLoadedEventHandle(e) {
- this._updateFrameStatus(e.detail.image.imageId, true);
- }
-
- _imageCachePromiseRemovedEventHandle(e) {
- this._updateFrameStatus(e.detail.imageId, false);
- }
-
- _updateProgress() {
- const totalFramesCount = this.stack.imageIds.length;
- const loadedFramesCount = this.loadedCount;
- const loadingFramesCount = totalFramesCount - loadedFramesCount;
- const percentComplete = Math.round((loadedFramesCount / totalFramesCount) * 100);
- const progressSessionId = this._getProgressSessionId();
-
- DCMViewerManager.sessions[progressSessionId] = {
- multiFrame: true,
- totalFramesCount,
- loadedFramesCount,
- loadingFramesCount,
- percentComplete,
- framesPerSecond: this.stats.speed,
- framesStatus: this.framesStatus
- };
- }
-
- _logProgress() {
- const totalFramesCount = this.stack.imageIds.length;
- const { displaySetInstanceUid } = this.stack;
- let progressBar = '[';
-
- for (let i = 0; i < totalFramesCount; i++) {
- const ch = this.framesStatus[i] ? '|' : '.';
- progressBar += `${ch}`;
- }
-
- progressBar += ']';
-
- DCMViewerLog.info(`${displaySetInstanceUid}: ${progressBar}`);
- }
-}
-
-class StudyLoadingListener {
- constructor() {
- this.listeners = {};
- }
-
- addStack(stack, stackMetaData) {
- const { displaySetInstanceUid } = stack;
-
- if (!this.listeners[displaySetInstanceUid]) {
- const listener = this._createListener(stack, stackMetaData);
- if (listener) {
- this.listeners[displaySetInstanceUid] = listener;
- }
- }
- }
-
- addStudy(study) {
- study.displaySets.forEach((displaySet) => {
- const stack = StackManager.findOrCreateStack(study, displaySet);
- this.addStack(stack, {
- isMultiFrame: displaySet.isMultiFrame
- });
- });
- }
-
- addStudies(studies) {
- if (!studies || !studies.length) {
- return;
- }
-
- for (let i = 0; i < studies.length; i++) {
- this.addStudy(studies[i]);
- }
- }
-
- clear() {
- const displaySetInstanceUids = Object.keys(this.listeners);
- const { length } = displaySetInstanceUids;
-
- for (let i = 0; i < length; i++) {
- const displaySetInstanceUid = displaySetInstanceUids[i];
- const displaySet = this.listeners[displaySetInstanceUid];
-
- displaySet.destroy();
- }
-
- this.listeners = {};
- }
-
- _createListener(stack, stackMetaData) {
- const schema = this._getSchema(stack);
-
- // A StackLoadingListener can be created if it's wadors or not a multiframe
- // wadouri instance (single file) that means "N" files will have to be
- // downloaded where "N" is the number of frames. DICOMFileLoadingListener
- // is created only if it's a single DICOM file and there's no way to know
- // how many frames has already been loaded (bytes/s instead of frames/s).
- if ((schema === 'wadors') || !stackMetaData.isMultiFrame) {
- return new StackLoadingListener(stack);
- }
- return new DICOMFileLoadingListener(stack);
- }
-
- _getSchema(stack) {
- const imageId = stack.imageIds[0];
- const colonIndex = imageId.indexOf(':');
- return imageId.substring(0, colonIndex);
- }
-
- // Singleton
- static getInstance() {
- if (!StudyLoadingListener._instance) {
- StudyLoadingListener._instance = new StudyLoadingListener();
- }
-
- return StudyLoadingListener._instance;
- }
-}
-
-export { StudyLoadingListener, StackLoadingListener, DICOMFileLoadingListener };
diff --git a/src/lib/viewerbase/classes/StudyPrefetcher.js b/src/lib/viewerbase/classes/StudyPrefetcher.js
deleted file mode 100644
index b573782..0000000
--- a/src/lib/viewerbase/classes/StudyPrefetcher.js
+++ /dev/null
@@ -1,317 +0,0 @@
-import $ from 'jquery';
-import _ from 'underscore';
-import { cornerstone, cornerstoneTools } from '../../cornerstonejs';
-import { DCMViewerError } from '../../DCMViewerError';
-import { DCMViewerLog } from '../../DCMViewerLog';
-import { DCMViewer } from '../../viewerMain/index';
-import { DCMViewerManager } from '../../DCMViewerManager';
-import { StackManager } from '../StackManager';
-import { viewportUtils } from '../viewportUtils';
-import { getStudyMetadata } from '../getStudyMetadata';
-import { getImageId } from '../getImageId';
-
-export class StudyPrefetcher {
- constructor(studies) {
- this.studies = studies || [];
- this.prefetchDisplaySetsTimeout = 300;
- this.lastActiveViewportElement = null;
- this.cacheFullHandlerBound = _.bind(this.cacheFullHandler, this);
-
- cornerstone.events.addEventListener('cornerstoneimagecachefull.StudyPrefetcher', this.cacheFullHandlerBound);
- }
-
- destroy() {
- this.stopPrefetching();
- cornerstone.events.removeEventListener('cornerstoneimagecachefull.StudyPrefetcher', this.cacheFullHandlerBound);
- }
-
- static getInstance() {
- if (!StudyPrefetcher.instance) {
- StudyPrefetcher.instance = new StudyPrefetcher();
- }
-
- return StudyPrefetcher.instance;
- }
-
- setStudies(studies) {
- this.stopPrefetching();
- this.studies = studies;
- }
-
- prefetch() {
- if (!this.studies || !this.studies.length) {
- return;
- }
-
- this.stopPrefetching();
- this.prefetchActiveViewport();
- this.prefetchDisplaySets();
- }
-
- stopPrefetching() {
- this.disableViewportPrefetch();
- cornerstoneTools.requestPoolManager.clearRequestStack('prefetch');
- }
-
- prefetchActiveViewport() {
- const activeViewportElement = viewportUtils.getActiveViewportElement();
- this.enablePrefetchOnElement(activeViewportElement);
- this.attachActiveViewportListeners(activeViewportElement);
- }
-
- disableViewportPrefetch() {
- $('.imageViewerViewport').each(() => {
- if (!$(this).find('canvas').length) {
- return;
- }
-
- cornerstoneTools.stackPrefetch.disable(this);
- });
- }
-
- hasStack(element) {
- const stack = cornerstoneTools.getToolState(element, 'stack');
- return stack && stack.data.length && (stack.data[0].imageIds.length > 1);
- }
-
- /**
- * This function enables stack prefetching for a specified element (viewport)
- * It first disables any prefetching currently occurring on any other viewports.
- *
- * @param element {node} DOM Node representing the viewport element
- */
- enablePrefetchOnElement(element) {
- if (!$(element).find('canvas').length) {
- return;
- }
-
- // Make sure there is a stack to fetch
- if (this.hasStack(element)) {
- // Check if this is a clip or not
- const activeViewportIndex = DCMViewerManager.sessions.activeViewport;
- const { displaySetInstanceUid } = DCMViewer.viewerbase.data.loadedSeriesData[activeViewportIndex];
-
- const stack = StackManager.findStack(displaySetInstanceUid);
-
- if (!stack) {
- throw new DCMViewerError(`Requested stack ${displaySetInstanceUid} was not created`);
- }
-
- cornerstoneTools.stackPrefetch.enable(element);
- }
- }
-
- attachActiveViewportListeners(activeViewportElement) {
- function newImageHandler() {
- // It needs to be called asynchronously because cornerstone does it at the same way.
- // All instance urls to be prefetched will be removed again if we add them before
- // Cornerstone callback (see stackPrefetch.onImageUpdated).
- StudyPrefetcher.prefetchDisplaySetsAsync();
- }
-
- if (this.lastActiveViewportElement) {
- this.lastActiveViewportElement.removeEventListener('cornerstonenewimage.StudyPrefetcher', newImageHandler);
- }
-
- activeViewportElement.removeEventListener('cornerstonenewimage.StudyPrefetcher', newImageHandler);
-
- // Cornerstone will not attach an event listener if the element doesn't have a stack
- if (this.hasStack(activeViewportElement)) {
- activeViewportElement.addEventListener('cornerstonenewimage.StudyPrefetcher', newImageHandler);
- }
-
- this.lastActiveViewportElement = activeViewportElement;
- }
-
- prefetchDisplaySetsAsync(timeout) {
- timeout = timeout || this.prefetchDisplaySetsTimeout;
-
- clearTimeout(this.prefetchDisplaySetsHandler);
- this.prefetchDisplaySetsHandler = setTimeout(() => {
- this.prefetchDisplaySets();
- }, timeout);
- }
-
- prefetchDisplaySets() {
- const config = DCMViewerManager.settings.public.prefetch;
- const displaySetsToPrefetch = this.getDisplaySetsToPrefetch(config);
- const imageIds = this.getImageIdsFromDisplaySets(displaySetsToPrefetch);
-
- this.prefetchImageIds(imageIds);
- }
-
- prefetchImageIds(imageIds) {
- const nonCachedImageIds = this.filterCachedImageIds(imageIds);
- const { requestPoolManager } = cornerstoneTools;
- const requestType = 'prefetch';
- const preventCache = false;
- const noop = () => {};
-
- nonCachedImageIds.forEach((imageId) => {
- requestPoolManager.addRequest({}, imageId, requestType, preventCache, noop, noop);
- });
-
- requestPoolManager.startGrabbing();
- }
-
- getActiveViewportImage() {
- const element = viewportUtils.getActiveViewportElement();
-
- if (!element) {
- return;
- }
-
- const enabledElement = cornerstone.getEnabledElement(element);
- return enabledElement.image;
- }
-
- getStudy(image) {
- const studyMetadata = cornerstone.metaData.get('study', image.imageId);
- const Studies = DCMViewer.viewerbase.data.studies;
-
- if (!Studies) {
- return;
- }
- return Studies.find(study => study.studyInstanceUid === studyMetadata.studyInstanceUid);
- }
-
- getSeries(study, image) {
- const seriesMetadata = cornerstone.metaData.get('series', image.imageId);
- const studyMetadata = getStudyMetadata(study);
-
- return studyMetadata.getSeriesByUID(seriesMetadata.seriesInstanceUid);
- }
-
- getInstance(series, image) {
- const instanceMetadata = cornerstone.metaData.get('instance', image.imageId);
- return series.getInstanceByUID(instanceMetadata.sopInstanceUid);
- }
-
- getActiveDisplaySet(displaySets, instance) {
- return _.find(displaySets, displaySet => _.some(displaySet.images, displaySetImage => displaySetImage.sopInstanceUid === instance.sopInstanceUid));
- }
-
- getDisplaySetsToPrefetch(config) {
- const image = this.getActiveViewportImage();
-
- if (!image || !config || !config.displaySetCount) {
- return [];
- }
-
- const study = this.getStudy(image);
- const series = this.getSeries(study, image);
- const instance = this.getInstance(series, image);
- const { displaySets } = study;
- const activeDisplaySet = this.getActiveDisplaySet(displaySets, instance);
- const prefetchMethodMap = {
- topdown: 'getFirstDisplaySets',
- downward: 'getNextDisplaySets',
- closest: 'getClosestDisplaySets'
- };
-
- const prefetchOrder = config.order;
- const methodName = prefetchMethodMap[prefetchOrder];
- const getDisplaySets = this[methodName];
-
- if (!getDisplaySets) {
- if (prefetchOrder) {
- DCMViewerLog.warn(`Invalid prefetch order configuration (${prefetchOrder})`);
- }
-
- return [];
- }
-
- return getDisplaySets.call(this, displaySets, activeDisplaySet, config.displaySetCount);
- }
-
- getFirstDisplaySets(displaySets, activeDisplaySet, displaySetCount) {
- const { length } = displaySets;
- const selectedDisplaySets = [];
-
- for (let i = 0; (i < length) && displaySetCount; i++) {
- const displaySet = displaySets[i];
-
- if (displaySet !== activeDisplaySet) {
- selectedDisplaySets.push(displaySet);
- displaySetCount--;
- }
- }
-
- return selectedDisplaySets;
- }
-
- getNextDisplaySets(displaySets, activeDisplaySet, displaySetCount) {
- const activeDisplaySetIndex = displaySets.indexOf(activeDisplaySet);
- const begin = activeDisplaySetIndex + 1;
- const end = Math.min(begin + displaySetCount, displaySets.length);
-
- return displaySets.slice(begin, end);
- }
-
- getClosestDisplaySets(displaySets, activeDisplaySet, displaySetCount) {
- const activeDisplaySetIndex = displaySets.indexOf(activeDisplaySet);
- const { length } = displaySets;
- const selectedDisplaySets = [];
- let left = activeDisplaySetIndex - 1;
- let right = activeDisplaySetIndex + 1;
-
- while (((left >= 0) || (right < length)) && displaySetCount) {
- if (left >= 0) {
- selectedDisplaySets.push(displaySets[left]);
- displaySetCount--;
- left--;
- }
-
- if ((right < length) && displaySetCount) {
- selectedDisplaySets.push(displaySets[right]);
- displaySetCount--;
- right++;
- }
- }
-
- return selectedDisplaySets;
- }
-
- getImageIdsFromDisplaySets(displaySets) {
- let imageIds = [];
-
- displaySets.forEach((displaySet) => {
- imageIds = imageIds.concat(this.getImageIdsFromDisplaySet(displaySet));
- });
-
- return imageIds;
- }
-
- getImageIdsFromDisplaySet(displaySet) {
- const imageIds = [];
-
- displaySet.images.forEach((image) => {
- const { numFrames } = image;
- if (numFrames > 1) {
- for (let i = 0; i < numFrames; i++) {
- const imageId = getImageId(image, i);
- imageIds.push(imageId);
- }
- } else {
- const imageId = getImageId(image);
- imageIds.push(imageId);
- }
- });
-
- return imageIds;
- }
-
- filterCachedImageIds(imageIds) {
- return _.filter(imageIds, imageId => !this.isImageCached(imageId));
- }
-
- isImageCached(imageId) {
- const image = cornerstone.imageCache.imageCache[imageId];
- return image && image.sizeInBytes;
- }
-
- cacheFullHandler() {
- DCMViewerLog.warn('Cache full');
- this.stopPrefetching();
- }
-}
diff --git a/src/lib/viewerbase/classes/metadata/BaseInstanceMetadata.js b/src/lib/viewerbase/classes/metadata/BaseInstanceMetadata.js
deleted file mode 100644
index daea299..0000000
--- a/src/lib/viewerbase/classes/metadata/BaseInstanceMetadata.js
+++ /dev/null
@@ -1,224 +0,0 @@
-import { Metadata } from './Metadata';
-import { DCMViewerError } from '../../../DCMViewerError';
-
-/**
- * ATTENTION! This class should never depend on StudyMetadata or SeriesMetadata classes as this could
- * possibly cause circular dependency issues.
- */
-
-const UNDEFINED = 'undefined';
-const STRING = 'string';
-const STUDY_INSTANCE_UID = 'x0020000d';
-const SERIES_INSTANCE_UID = 'x0020000e';
-
-export class BaseInstanceMetadata extends Metadata {
- constructor(data, uid) {
- super(data, uid);
- // Initialize Private Properties
- Object.defineProperties(this, {
- _sopInstanceUID: {
- configurable: true, // configurable so that it can be redefined in sub-classes...
- enumerable: false,
- writable: true,
- value: null
- },
- _imageId: {
- configurable: true, // configurable so that it can be redefined in sub-classes...
- enumerable: false,
- writable: true,
- value: null
- }
- });
- // Initialize Public Properties
- this._definePublicProperties();
- }
-
- /**
- * Private Methods
- */
-
- /**
- * Define Public Properties
- * This method should only be called during initialization (inside the class constructor)
- */
- _definePublicProperties() {
- /**
- * Property: this.sopInstanceUID
- * Same as this.getSOPInstanceUID()
- * It's specially useful in contexts where a method call is not suitable like in search criteria. For example:
- * sopInstanceCollection.findBy({
- * sopInstanceUID: '1.2.3.4.5.6.77777.8888888.99999999999.0'
- * });
- */
- Object.defineProperty(this, 'sopInstanceUID', {
- configurable: false,
- enumerable: false,
- get() {
- return this.getSOPInstanceUID();
- }
- });
- }
-
- /**
- * Public Methods
- */
-
- /**
- * Returns the StudyInstanceUID of the current instance. This method is basically a shorthand the full "getTagValue" method call.
- */
- getStudyInstanceUID() {
- return this.getTagValue(STUDY_INSTANCE_UID, null);
- }
-
- /**
- * Returns the SeriesInstanceUID of the current instance. This method is basically a shorthand the full "getTagValue" method call.
- */
- getSeriesInstanceUID() {
- return this.getTagValue(SERIES_INSTANCE_UID, null);
- }
-
- /**
- * Returns the SOPInstanceUID of the current instance.
- */
- getSOPInstanceUID() {
- return this._sopInstanceUID;
- }
-
- // @TODO: Improve this... (E.g.: blob data)
- getStringValue(tagOrProperty, index, defaultValue) {
- let value = this.getTagValue(tagOrProperty, defaultValue);
-
- if (typeof value !== STRING && typeof value !== UNDEFINED) {
- value = value.toString();
- }
-
- return BaseInstanceMetadata.getIndexedValue(value, index, defaultValue);
- }
-
- // @TODO: Improve this... (E.g.: blob data)
- getFloatValue(tagOrProperty, index, defaultValue) {
- let value = this.getTagValue(tagOrProperty, defaultValue);
- value = BaseInstanceMetadata.getIndexedValue(value, index, defaultValue);
-
- if (value instanceof Array) {
- value.forEach((val, idx) => {
- value[idx] = parseFloat(val);
- });
-
- return value;
- }
-
- return typeof value === STRING ? parseFloat(value) : value;
- }
-
- // @TODO: Improve this... (E.g.: blob data)
- getIntValue(tagOrProperty, index, defaultValue) {
- let value = this.getTagValue(tagOrProperty, defaultValue);
- value = BaseInstanceMetadata.getIndexedValue(value, index, defaultValue);
-
- if (value instanceof Array) {
- value.forEach((val, idx) => {
- value[idx] = parseFloat(val);
- });
-
- return value;
- }
-
- return typeof value === STRING ? parseInt(value, 10) : value;
- }
-
- /**
- * @deprecated Please use getTagValue instead.
- */
- getRawValue(tagOrProperty, defaultValue) {
- return this.getTagValue(tagOrProperty, defaultValue);
- }
-
- /**
- * This function should be overriden by specialized classes in order to allow client libraries or viewers to take advantage of the Study Metadata API.
- * @param tagOrProperty
- * @param defaultValue
- */
- getTagValue(tagOrProperty, defaultValue) {
- /**
- * Please override this method on a specialized class.
- */
- throw new DCMViewerError('InstanceMetadata::getTagValue is not overriden. Please, override it in a specialized class. See InstanceMetadata for example', tagOrProperty, defaultValue);
- }
-
- /**
- * Compares the current instance with another one.
- * @param {BaseInstanceMetadata} instance An instance of the InstanceMetadata class.
- * @returns {boolean} Returns true if both instances refer to the same instance.
- */
- equals(instance) {
- const self = this;
- return (
- instance === self ||
- (
- instance instanceof BaseInstanceMetadata &&
- instance.getSOPInstanceUID() === self.getSOPInstanceUID()
- )
- );
- }
-
- /**
- * Check if the tagOrProperty exists
- * @param {String} tagOrProperty tag or property be checked
- * @return {Boolean} True if the tag or property exists or false if doesn't
- */
- tagExists(tagOrProperty) {
- /**
- * Please override this method
- */
- throw new DCMViewerError('InstanceMetadata::tagExists is not overriden. Please, override it in a specialized class. See InstanceMetadata for example', tagOrProperty);
- }
-
- /**
- * Get custom image id of a sop instance
- * @param frame
- * @return {Any} sop instance image id
- */
- getImageId(frame) {
- /**
- * Please override this method
- */
- throw new DCMViewerError('InstanceMetadata::getImageId is not overriden. Please, override it in a specialized class. See InstanceMetadata for example', frame);
- }
-
- /**
- * Static Methods
- */
-
- /**
- * Get an value based that can be index based. This function is called by all getters. See above functions.
- * - If value is a String and has indexes:
- * - If undefined index: returns an array of the split values.
- * - If defined index:
- * - If invalid: returns defaultValue
- * - If valid: returns the indexed value
- * - If value is not a String, returns default value.
- */
- static getIndexedValue(value, index, defaultValue) {
- let result = defaultValue;
-
- if (typeof value === STRING) {
- const hasIndexValues = value.indexOf('\\') !== -1;
-
- result = value;
-
- if (hasIndexValues) {
- const splitValues = value.split('\\');
- if (Metadata.isValidIndex(index)) {
- const indexedValue = splitValues[index];
-
- result = typeof indexedValue !== STRING ? defaultValue : indexedValue;
- } else {
- result = splitValues;
- }
- }
- }
-
- return result;
- }
-}
diff --git a/src/lib/viewerbase/classes/metadata/BaseSeriesMetadata.js b/src/lib/viewerbase/classes/metadata/BaseSeriesMetadata.js
deleted file mode 100644
index 3748f17..0000000
--- a/src/lib/viewerbase/classes/metadata/BaseSeriesMetadata.js
+++ /dev/null
@@ -1,187 +0,0 @@
-import { Metadata } from './Metadata';
-import { BaseInstanceMetadata } from './BaseInstanceMetadata';
-
-export class BaseSeriesMetadata extends Metadata {
- constructor(data, uid) {
- super(data, uid);
- // Initialize Private Properties
- Object.defineProperties(this, {
- _seriesInstanceUID: {
- configurable: true, // configurable so that it can be redefined in sub-classes...
- enumerable: false,
- writable: true,
- value: null
- },
- _instances: {
- configurable: false,
- enumerable: false,
- writable: false,
- value: []
- },
- _firstInstance: {
- configurable: false,
- enumerable: false,
- writable: true,
- value: null
- }
- });
- // Initialize Public Properties
- this._definePublicProperties();
- }
-
- /**
- * Private Methods
- */
-
- /**
- * Define Public Properties
- * This method should only be called during initialization (inside the class constructor)
- */
- _definePublicProperties() {
- /**
- * Property: this.seriesInstanceUID
- * Same as this.getSeriesInstanceUID()
- * It's specially useful in contexts where a method call is not suitable like in search criteria. For example:
- * seriesCollection.findBy({
- * seriesInstanceUID: '1.2.3.4.5.6.77777.8888888.99999999999.0'
- * });
- */
- Object.defineProperty(this, 'seriesInstanceUID', {
- configurable: false,
- enumerable: false,
- get() {
- return this.getSeriesInstanceUID();
- }
- });
- }
-
- /**
- * Public Methods
- */
-
- /**
- * Returns the SeriesInstanceUID of the current series.
- */
- getSeriesInstanceUID() {
- return this._seriesInstanceUID;
- }
-
- /**
- * Append an instance to the current series.
- * @param {BaseInstanceMetadata} instance The instance to be added to the current series.
- * @returns {boolean} Returns true on success, false otherwise.
- */
- addInstance(instance) {
- let result = false;
- if (instance instanceof BaseInstanceMetadata && this.getInstanceByUID(instance.getSOPInstanceUID()) === undefined) {
- this._instances.push(instance);
- result = true;
- }
- return result;
- }
-
- /**
- * Get the first instance of the current series retaining a consistent result across multiple calls.
- * @return {BaseInstanceMetadata} An instance of the InstanceMetadata class or null if it does not exist.
- */
- getFirstInstance() {
- let instance = this._firstInstance;
- if (!(instance instanceof BaseInstanceMetadata)) {
- instance = null;
- const found = this.getInstanceByIndex(0);
- if (found instanceof BaseInstanceMetadata) {
- this._firstInstance = found;
- instance = found;
- }
- }
- return instance;
- }
-
- /**
- * Find an instance by index.
- * @param {number} index An integer representing a list index.
- * @returns {BaseInstanceMetadata} Returns a InstanceMetadata instance when found or undefined otherwise.
- */
- getInstanceByIndex(index) {
- let found; // undefined by default...
- if (Metadata.isValidIndex(index)) {
- found = this._instances[index];
- }
- return found;
- }
-
- /**
- * Find an instance by SOPInstanceUID.
- * @param {string} uid An UID string.
- * @returns {BaseInstanceMetadata} Returns a InstanceMetadata instance when found or undefined otherwise.
- */
- getInstanceByUID(uid) {
- let found; // undefined by default...
- if (Metadata.isValidUID(uid)) {
- found = this._instances.find(instance => instance.getSOPInstanceUID() === uid);
- }
- return found;
- }
-
- /**
- * Retrieve the number of instances within the current series.
- * @returns {number} The number of instances in the current series.
- */
- getInstanceCount() {
- return this._instances.length;
- }
-
- /**
- * Invokes the supplied callback for each instance in the current series passing
- * two arguments: instance (an InstanceMetadata instance) and index (the integer
- * index of the instance within the current series)
- * @param {function} callback The callback function which will be invoked for each instance in the series.
- * @returns {undefined} Nothing is returned.
- */
- forEachInstance(callback) {
- if (Metadata.isValidCallback(callback)) {
- this._instances.forEach((instance, index) => {
- callback.call(null, instance, index);
- });
- }
- }
-
- /**
- * Find the index of an instance inside the series.
- * @param {BaseInstanceMetadata} instance An instance of the SeriesMetadata class.
- * @returns {number} The index of the instance inside the series or -1 if not found.
- */
- indexOfInstance(instance) {
- return this._instances.indexOf(instance);
- }
-
- /**
- * Search the associated instances using the supplied callback as criteria. The callback is passed
- * two arguments: instance (a InstanceMetadata instance) and index (the integer
- * index of the instance within its series)
- * @param {function} callback The callback function which will be invoked for each instance.
- * @returns {BaseInstanceMetadata|undefined} If an instance is found based on callback criteria it
- * returns a InstanceMetadata. "undefined" is returned otherwise
- */
- findInstance(callback) {
- if (Metadata.isValidCallback(callback)) {
- return this._instances.find((instance, index) => callback.call(null, instance, index));
- }
- }
-
- /**
- * Compares the current series with another one.
- * @param {BaseSeriesMetadata} series An instance of the SeriesMetadata class.
- * @returns {boolean} Returns true if both instances refer to the same series.
- */
- equals(series) {
- const self = this;
- return (
- series === self ||
- (
- series instanceof BaseSeriesMetadata &&
- series.getSeriesInstanceUID() === self.getSeriesInstanceUID()
- )
- );
- }
-}
diff --git a/src/lib/viewerbase/classes/metadata/BaseStudyMetadata.js b/src/lib/viewerbase/classes/metadata/BaseStudyMetadata.js
deleted file mode 100644
index da80a9c..0000000
--- a/src/lib/viewerbase/classes/metadata/BaseStudyMetadata.js
+++ /dev/null
@@ -1,387 +0,0 @@
-import { Metadata } from './Metadata';
-import { BaseSeriesMetadata } from './BaseSeriesMetadata';
-import { BaseInstanceMetadata } from './BaseInstanceMetadata';
-import { ImageSet } from '../ImageSet';
-import { DCMViewerError } from '../../../DCMViewerError';
-
-export class BaseStudyMetadata extends Metadata {
- constructor(data, uid) {
- super(data, uid);
- // Initialize Private Properties
- Object.defineProperties(this, {
- _studyInstanceUID: {
- configurable: true, // configurable so that it can be redefined in sub-classes...
- enumerable: false,
- writable: true,
- value: null
- },
- _series: {
- configurable: false,
- enumerable: false,
- writable: false,
- value: []
- },
- _displaySets: {
- configurable: false,
- enumerable: false,
- writable: false,
- value: []
- },
- _firstSeries: {
- configurable: false,
- enumerable: false,
- writable: true,
- value: null
- },
- _firstInstance: {
- configurable: false,
- enumerable: false,
- writable: true,
- value: null
- }
- });
- // Initialize Public Properties
- this._definePublicProperties();
- }
-
- /**
- * Private Methods
- */
-
- /**
- * Define Public Properties
- * This method should only be called during initialization (inside the class constructor)
- */
- _definePublicProperties() {
- /**
- * Property: this.studyInstanceUID
- * Same as this.getStudyInstanceUID()
- * It's specially useful in contexts where a method call is not suitable like in search criteria. For example:
- * studyCollection.findBy({
- * studyInstanceUID: '1.2.3.4.5.6.77777.8888888.99999999999.0'
- * });
- */
- Object.defineProperty(this, 'studyInstanceUID', {
- configurable: false,
- enumerable: false,
- get() {
- return this.getStudyInstanceUID();
- }
- });
- }
-
- /**
- * Public Methods
- */
-
- /**
- * Getter for displaySets
- * @return {Array} Array of display set object
- */
- getDisplaySets() {
- return this._displaySets.slice();
- }
-
- /**
- * Set display sets
- * @param {Array} displaySets Array of display sets (ImageSet[])
- */
- setDisplaySets(displaySets) {
- displaySets.forEach(displaySet => this.addDisplaySet(displaySet));
- }
-
- /**
- * Add a single display set to the list
- * @param {Object} displaySet Display set object
- * @returns {boolean} True on success, false on failure.
- */
- addDisplaySet(displaySet) {
- if (displaySet instanceof ImageSet) {
- this._displaySets.push(displaySet);
- return true;
- }
- return false;
- }
-
- /**
- * Invokes the supplied callback for each display set in the current study passing
- * two arguments: display set (a ImageSet instance) and index (the integer
- * index of the display set within the current study)
- * @param {function} callback The callback function which will be invoked for each display set instance.
- * @returns {undefined} Nothing is returned.
- */
- forEachDisplaySet(callback) {
- if (Metadata.isValidCallback(callback)) {
- this._displaySets.forEach((displaySet, index) => {
- callback.call(null, displaySet, index);
- });
- }
- }
-
- /**
- * Search the associated display sets using the supplied callback as criteria. The callback is passed
- * two arguments: display set (a ImageSet instance) and index (the integer
- * index of the display set within the current study)
- * @param {function} callback The callback function which will be invoked for each display set instance.
- * @returns {undefined} Nothing is returned.
- */
- findDisplaySet(callback) {
- if (Metadata.isValidCallback(callback)) {
- return this._displaySets.find((displaySet, index) => callback.call(null, displaySet, index));
- }
- }
-
- /**
- * Retrieve the number of display sets within the current study.
- * @returns {number} The number of display sets in the current study.
- */
- getDisplaySetCount() {
- return this._displaySets.length;
- }
-
- /**
- * Returns the StudyInstanceUID of the current study.
- */
- getStudyInstanceUID() {
- return this._studyInstanceUID;
- }
-
- /**
- * Getter for series
- * @return {Array} Array of SeriesMetadata object
- */
- getSeries() {
- return this._series.slice();
- }
-
- /**
- * Append a series to the current study.
- * @param {BaseSeriesMetadata} series The series to be added to the current study.
- * @returns {boolean} Returns true on success, false otherwise.
- */
- addSeries(series) {
- let result = false;
- if (series instanceof BaseSeriesMetadata && this.getSeriesByUID(series.getSeriesInstanceUID()) === undefined) {
- this._series.push(series);
- result = true;
- }
- return result;
- }
-
- /**
- * Find a series by index.
- * @param {number} index An integer representing a list index.
- * @returns {BaseSeriesMetadata} Returns a SeriesMetadata instance when found or undefined otherwise.
- */
- getSeriesByIndex(index) {
- let found; // undefined by default...
- if (Metadata.isValidIndex(index)) {
- found = this._series[index];
- }
- return found;
- }
-
- /**
- * Find a series by SeriesInstanceUID.
- * @param {string} uid An UID string.
- * @returns {BaseSeriesMetadata} Returns a SeriesMetadata instance when found or undefined otherwise.
- */
- getSeriesByUID(uid) {
- let found; // undefined by default...
- if (Metadata.isValidUID(uid)) {
- found = this._series.find(series => series.getSeriesInstanceUID() === uid);
- }
- return found;
- }
-
- /**
- * Retrieve the number of series within the current study.
- * @returns {number} The number of series in the current study.
- */
- getSeriesCount() {
- return this._series.length;
- }
-
- /**
- * Retrieve the number of instances within the current study.
- * @returns {number} The number of instances in the current study.
- */
- getInstanceCount() {
- return this._series.reduce((sum, series) => sum + series.getInstanceCount(), 0);
- }
-
- /**
- * Invokes the supplied callback for each series in the current study passing
- * two arguments: series (a SeriesMetadata instance) and index (the integer
- * index of the series within the current study)
- * @param {function} callback The callback function which will be invoked for each series instance.
- * @returns {undefined} Nothing is returned.
- */
- forEachSeries(callback) {
- if (Metadata.isValidCallback(callback)) {
- this._series.forEach((series, index) => {
- callback.call(null, series, index);
- });
- }
- }
-
- /**
- * Find the index of a series inside the study.
- * @param {BaseSeriesMetadata} series An instance of the SeriesMetadata class.
- * @returns {number} The index of the series inside the study or -1 if not found.
- */
- indexOfSeries(series) {
- return this._series.indexOf(series);
- }
-
- /**
- * It sorts the series based on display sets order. Each series must be an instance
- * of SeriesMetadata and each display sets must be an instance of ImageSet.
- * Useful example of usage:
- * Study data provided by backend does not sort series at all and client-side
- * needs series sorted by the same criteria used for sorting display sets.
- */
- sortSeriesByDisplaySets() {
- // Object for mapping display sets' index by seriesInstanceUid
- const displaySetsMapping = {};
-
- // Loop through each display set to create the mapping
- this.forEachDisplaySet((displaySet, index) => {
- if (!(displaySet instanceof ImageSet)) {
- throw new DCMViewerError(`StudyMetadata::sortSeriesByDisplaySets display set at index ${index} is not an instance of ImageSet`);
- }
-
- // In case of multiframe studies, just get the first index occurence
- if (displaySetsMapping[displaySet.seriesInstanceUid] === undefined) {
- displaySetsMapping[displaySet.seriesInstanceUid] = index;
- }
- });
-
- // Clone of actual series
- const actualSeries = this.getSeries();
-
- actualSeries.forEach((series, index) => {
- if (!(series instanceof BaseSeriesMetadata)) {
- throw new DCMViewerError(`StudyMetadata::sortSeriesByDisplaySets series at index ${index} is not an instance of SeriesMetadata`);
- }
-
- // Get the new series index
- const seriesIndex = displaySetsMapping[series.getSeriesInstanceUID()];
-
- // Update the series object with the new series position
- this._series[seriesIndex] = series;
- });
- }
-
- /**
- * Compares the current study instance with another one.
- * @param {BaseStudyMetadata} study An instance of the StudyMetadata class.
- * @returns {boolean} Returns true if both instances refer to the same study.
- */
- equals(study) {
- const self = this;
- return (
- study === self ||
- (
- study instanceof BaseStudyMetadata &&
- study.getStudyInstanceUID() === self.getStudyInstanceUID()
- )
- );
- }
-
- /**
- * Get the first series of the current study retaining a consistent result across multiple calls.
- * @return {BaseSeriesMetadata} An instance of the SeriesMetadata class or null if it does not exist.
- */
- getFirstSeries() {
- let series = this._firstSeries;
- if (!(series instanceof BaseSeriesMetadata)) {
- series = null;
- const found = this.getSeriesByIndex(0);
- if (found instanceof BaseSeriesMetadata) {
- this._firstSeries = found;
- series = found;
- }
- }
- return series;
- }
-
- /**
- * Get the first instance of the current study retaining a consistent result across multiple calls.
- * @return {BaseInstanceMetadata} An instance of the InstanceMetadata class or null if it does not exist.
- */
- getFirstInstance() {
- let instance = this._firstInstance;
- if (!(instance instanceof BaseInstanceMetadata)) {
- instance = null;
- const firstSeries = this.getFirstSeries();
- if (firstSeries instanceof BaseSeriesMetadata) {
- const found = firstSeries.getFirstInstance();
- if (found instanceof BaseInstanceMetadata) {
- this._firstInstance = found;
- instance = found;
- }
- }
- }
- return instance;
- }
-
- /**
- * Search the associated series to find an specific instance using the supplied callback as criteria.
- * The callback is passed two arguments: instance (a InstanceMetadata instance) and index (the integer
- * index of the instance within the current series)
- * @param {function} callback The callback function which will be invoked for each instance instance.
- * @returns {Object} Result object containing series (SeriesMetadata) and instance (InstanceMetadata)
- * objects or an empty object if not found.
- */
- findSeriesAndInstanceByInstance(callback) {
- let result;
-
- if (Metadata.isValidCallback(callback)) {
- let instance;
-
- const series = this._series.find((seriesItem) => {
- instance = seriesItem.findInstance(callback);
- return instance instanceof BaseInstanceMetadata;
- });
-
- // No series found
- if (series instanceof BaseSeriesMetadata) {
- result = {
- series,
- instance
- };
- }
- }
-
- return result || {};
- }
-
- /**
- * Find series by instance using the supplied callback as criteria. The callback is passed
- * two arguments: instance (a InstanceMetadata instance) and index (the integer index of
- * the instance within its series)
- * @param {function} callback The callback function which will be invoked for each instance.
- * @returns {BaseSeriesMetadata|undefined} If a series is found based on callback criteria it
- * returns a SeriesMetadata. "undefined" is returned otherwise
- */
- findSeriesByInstance(callback) {
- const result = this.findSeriesAndInstanceByInstance(callback);
-
- return result.series;
- }
-
- /**
- * Find an instance using the supplied callback as criteria. The callback is passed
- * two arguments: instance (a InstanceMetadata instance) and index (the integer index of
- * the instance within its series)
- * @param {function} callback The callback function which will be invoked for each instance.
- * @returns {BaseInstanceMetadata|undefined} If an instance is found based on callback criteria it
- * returns a InstanceMetadata. "undefined" is returned otherwise
- */
- findInstance(callback) {
- const result = this.findSeriesAndInstanceByInstance(callback);
-
- return result.instance;
- }
-}
diff --git a/src/lib/viewerbase/classes/metadata/Metadata.js b/src/lib/viewerbase/classes/metadata/Metadata.js
deleted file mode 100644
index 4408685..0000000
--- a/src/lib/viewerbase/classes/metadata/Metadata.js
+++ /dev/null
@@ -1,122 +0,0 @@
-
-/**
- * Constants
- */
-
-const STRING = 'string';
-const NUMBER = 'number';
-const FUNCTION = 'function';
-const OBJECT = 'object';
-
-/**
- * Class Definition
- */
-
-export class Metadata {
- /**
- * Constructor and Instance Methods
- */
-
- constructor(data, uid) {
- // Define the main "_data" private property as an immutable property.
- // IMPORTANT: This property can only be set during instance construction.
- Object.defineProperty(this, '_data', {
- configurable: false,
- enumerable: false,
- writable: false,
- value: data
- });
-
- // Define the main "_uid" private property as an immutable property.
- // IMPORTANT: This property can only be set during instance construction.
- Object.defineProperty(this, '_uid', {
- configurable: false,
- enumerable: false,
- writable: false,
- value: uid
- });
-
- // Define "_custom" properties as an immutable property.
- // IMPORTANT: This property can only be set during instance construction.
- Object.defineProperty(this, '_custom', {
- configurable: false,
- enumerable: false,
- writable: false,
- value: Object.create(null)
- });
- }
-
- getData() {
- return this._data;
- }
-
- getDataProperty(propertyName) {
- let propertyValue;
- const { _data } = this;
- if ((_data instanceof Object || typeof _data === OBJECT) && _data !== null) {
- propertyValue = _data[propertyName];
- }
- return propertyValue;
- }
-
- /**
- * Get unique object ID
- */
- getObjectID() {
- return this._uid;
- }
-
- /**
- * Set custom attribute value
- * @param {String} attribute Custom attribute name
- * @param {Any} value Custom attribute value
- */
- setCustomAttribute(attribute, value) {
- this._custom[attribute] = value;
- }
-
- /**
- * Get custom attribute value
- * @param {String} attribute Custom attribute name
- * @return {Any} Custom attribute value
- */
- getCustomAttribute(attribute) {
- return this._custom[attribute];
- }
-
- /**
- * Check if a custom attribute exists
- * @param {String} attribute Custom attribute name
- * @return {Boolean} True if custom attribute exists or false if not
- */
- customAttributeExists(attribute) {
- return attribute in this._custom;
- }
-
- /**
- * Set custom attributes in batch mode.
- * @param {Object} attributeMap An object whose own properties will be used as custom attributes.
- */
- setCustomAttributes(attributeMap) {
- const { _custom } = this;
- Object.keys(attributeMap).forEach((attribute) => {
- _custom[attribute] = attributeMap[attribute];
- });
- }
-
- /**
- * Static Methods
- */
-
- static isValidUID(uid) {
- return typeof uid === STRING && uid.length > 0;
- }
-
- static isValidIndex(index) {
- return typeof index === NUMBER && index >= 0 && (index | 0) === index;
- }
-
- static isValidCallback(callback) {
- return typeof callback === FUNCTION;
- }
-}
diff --git a/src/lib/viewerbase/classes/metadata/viewerMain/InstanceMetadata.js b/src/lib/viewerbase/classes/metadata/viewerMain/InstanceMetadata.js
deleted file mode 100644
index 4842522..0000000
--- a/src/lib/viewerbase/classes/metadata/viewerMain/InstanceMetadata.js
+++ /dev/null
@@ -1,116 +0,0 @@
-import { BaseInstanceMetadata } from '../BaseInstanceMetadata';
-import { getImageId } from '../../../getImageId';
-import { DICOMTagDescriptions } from '../../../DICOMTagDescriptions';
-
-export class InstanceMetadata extends BaseInstanceMetadata {
- /**
- * @param {Object} Instance object.
- */
- constructor(data, series, study, uid) {
- super(data, uid);
- this.init(series, study);
- }
-
- init(series, study) {
- const instance = this.getData();
-
- // Initialize Private Properties
- Object.defineProperties(this, {
- _sopInstanceUID: {
- configurable: false,
- enumerable: false,
- writable: false,
- value: instance.sopInstanceUid
- },
- _study: {
- configurable: false,
- enumerable: false,
- writable: false,
- value: study
- },
- _series: {
- configurable: false,
- enumerable: false,
- writable: false,
- value: series
- },
- _instance: {
- configurable: false,
- enumerable: false,
- writable: false,
- value: instance
- },
- _cache: {
- configurable: false,
- enumerable: false,
- writable: false,
- value: Object.create(null)
- }
- });
- }
-
- // Override
- getTagValue(tagOrProperty, defaultValue, bypassCache) {
- // check if this property has been cached...
- if (tagOrProperty in this._cache && bypassCache !== true) {
- return this._cache[tagOrProperty];
- }
-
- const propertyName = InstanceMetadata.getPropertyName(tagOrProperty);
-
- // Search property value in the whole study metadata chain...
- let rawValue;
- if (propertyName in this._instance) {
- rawValue = this._instance[propertyName];
- } else if (propertyName in this._series) {
- rawValue = this._series[propertyName];
- } else if (propertyName in this._study) {
- rawValue = this._study[propertyName];
- }
-
- if (rawValue !== undefined) {
- // if rawValue value is not undefined, cache result...
- this._cache[tagOrProperty] = rawValue;
- return rawValue;
- }
-
- return defaultValue;
- }
-
- // Override
- tagExists(tagOrProperty) {
- const propertyName = InstanceMetadata.getPropertyName(tagOrProperty);
-
- return (propertyName in this._instance || propertyName in this._series || propertyName in this._study);
- }
-
- // Override
- getImageId(frame, thumbnail) {
- // If _imageID is not cached, create it
- if (this._imageId === null) {
- this._imageId = getImageId(this.getData(), frame, thumbnail);
- }
-
- return this._imageId;
- }
-
- /**
- * Static methods
- */
-
- // @TODO: The current mapping of standard DICOM property names to local property names is not optimal.
- // The inconsistency in property naming makes this function increasingly complex.
- // A possible solution to improve this would be adapt retriveMetadata names to use DICOM standard names as in dicomTagDescriptions.js
- static getPropertyName(tagOrProperty) {
- let propertyName;
- const tagInfo = DICOMTagDescriptions.find(tagOrProperty);
-
- if (tagInfo !== undefined) {
- // This function tries to translate standard DICOM property names into local naming convention.
- propertyName = tagInfo.keyword.replace(/^SOP/, 'sop').replace(/UID$/, 'Uid').replace(/ID$/, 'Id');
- propertyName = propertyName.charAt(0).toLowerCase() + propertyName.substr(1);
- }
-
- return propertyName;
- }
-}
diff --git a/src/lib/viewerbase/classes/metadata/viewerMain/SeriesMetadata.js b/src/lib/viewerbase/classes/metadata/viewerMain/SeriesMetadata.js
deleted file mode 100644
index 22e32fe..0000000
--- a/src/lib/viewerbase/classes/metadata/viewerMain/SeriesMetadata.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import { BaseSeriesMetadata } from '../BaseSeriesMetadata';
-import { InstanceMetadata } from './InstanceMetadata';
-
-export class SeriesMetadata extends BaseSeriesMetadata {
- /**
- * @param {Object} Series object.
- */
- constructor(data, study, uid) {
- super(data, uid);
- this.init(study);
- }
-
- init(study) {
- const series = this.getData();
-
- // define "_seriesInstanceUID" protected property...
- Object.defineProperty(this, '_seriesInstanceUID', {
- configurable: false,
- enumerable: false,
- writable: false,
- value: series.seriesInstanceUid
- });
-
- // populate internal list of instances...
- series.instances.forEach((instance) => {
- this.addInstance(new InstanceMetadata(instance, series, study));
- });
- }
-}
-
diff --git a/src/lib/viewerbase/classes/metadata/viewerMain/StudyMetadata.js b/src/lib/viewerbase/classes/metadata/viewerMain/StudyMetadata.js
deleted file mode 100644
index 2b5f25b..0000000
--- a/src/lib/viewerbase/classes/metadata/viewerMain/StudyMetadata.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import { BaseStudyMetadata } from '../BaseStudyMetadata';
-import { SeriesMetadata } from './SeriesMetadata';
-
-export class StudyMetadata extends BaseStudyMetadata {
- /**
- * @param {Object} Study object.
- */
- constructor(data, uid) {
- super(data, uid);
- this.init();
- }
-
- init() {
- const study = this.getData();
-
- // define "_studyInstanceUID" protected property
- Object.defineProperty(this, '_studyInstanceUID', {
- configurable: false,
- enumerable: false,
- writable: false,
- value: study.studyInstanceUid
- });
-
- // populate internal list of series
- study.seriesList.forEach((series) => {
- this.addSeries(new SeriesMetadata(series, study));
- });
- }
-}
diff --git a/src/lib/viewerbase/createStacks.js b/src/lib/viewerbase/createStacks.js
deleted file mode 100644
index 7033d5d..0000000
--- a/src/lib/viewerbase/createStacks.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import { ImageSet } from './classes/ImageSet';
-import { isImage } from './isImage';
-
-const isMultiFrame = instance =>
- // NumberOfFrames (0028,0008)
- instance.getRawValue('x00280008') > 1;
-const makeDisplaySet = (series, instances) => {
- const instance = instances[0];
-
- const imageSet = new ImageSet(instances);
- const seriesData = series.getData();
-
- // set appropriate attributes to image set...
- imageSet.setAttributes({
- displaySetInstanceUid: imageSet.uid, // create a local alias for the imageSet UID
- seriesDate: seriesData.seriesDate,
- seriesTime: seriesData.seriesTime,
- seriesInstanceUid: series.getSeriesInstanceUID(),
- seriesNumber: instance.getRawValue('x00200011'),
- seriesDescription: instance.getRawValue('x0008103e'),
- numImageFrames: instances.length,
- frameRate: instance.getRawValue('x00181063'),
- modality: instance.getRawValue('x00080060'),
- isMultiFrame: isMultiFrame(instance)
- });
-
- // Sort the images in this series if needed
- imageSet.sortBy((a, b) =>
- // Sort by InstanceNumber (0020,0013)
- (parseInt(a.getRawValue('x00200013', 0), 10) || 0) - (parseInt(b.getRawValue('x00200013', 0), 10) || 0));
-
- // Include the first image instance number (after sorted)
- imageSet.setAttribute('instanceNumber', imageSet.getImage(0).getRawValue('x00200013'));
-
- return imageSet;
-};
-
-const isSingleImageModality = modality => (modality === 'CR' ||
- modality === 'MG' ||
- modality === 'DX');
-
-/**
- * Creates a set of series to be placed in the Study Metadata
- * The series that appear in the Study Metadata must represent
- * imaging modalities.
- *
- * Furthermore, for drag/drop functionality,
- * it is easiest if the stack objects also contain information about
- * which study they are linked to.
- *
- * @param study The study instance metadata to be used
- * @returns {Array} An array of series to be placed in the Study Metadata
- */
-const createStacks = (study) => {
- // Define an empty array of display sets
- const displaySets = [];
-
- if (!study || !study.getSeriesCount()) {
- return displaySets;
- }
-
- // Loop through the series (SeriesMetadata)
- study.forEachSeries((series) => {
- // If the series has no instances, skip it
- if (!series.getInstanceCount()) {
- return;
- }
-
- // Search through the instances (InstanceMedatada object) of this series
- // Split Multi-frame instances and Single-image modalities
- // into their own specific display sets. Place the rest of each
- // series into another display set.
- const stackableInstances = [];
- series.forEachInstance((instance) => {
- // All imaging modalities must have a valid value for sopClassUid (x00080016) or rows (x00280010)
- if (!isImage(instance.getRawValue('x00080016')) && !instance.getRawValue('x00280010')) {
- return;
- }
-
- let displaySet;
- if (isMultiFrame(instance)) {
- displaySet = makeDisplaySet(series, [instance]);
- displaySet.setAttributes({
- isClip: true,
- studyInstanceUid: study.getStudyInstanceUID(), // Include the study instance Uid for drag/drop purposes
- numImageFrames: instance.getRawValue('x00280008'), // Override the default value of instances.length
- instanceNumber: instance.getRawValue('x00200013'), // Include the instance number
- acquisitionDatetime: instance.getRawValue('x0008002a') // Include the acquisition datetime
- });
- displaySets.push(displaySet);
- } else if (isSingleImageModality(instance.modality)) {
- displaySet = makeDisplaySet(series, [instance]);
- displaySet.setAttributes({
- studyInstanceUid: study.getStudyInstanceUID(), // Include the study instance Uid
- instanceNumber: instance.getRawValue('x00200013'), // Include the instance number
- acquisitionDatetime: instance.getRawValue('x0008002a') // Include the acquisition datetime
- });
- displaySets.push(displaySet);
- } else {
- stackableInstances.push(instance);
- }
- });
-
- if (stackableInstances.length) {
- const displaySet = makeDisplaySet(series, stackableInstances);
- displaySet.setAttribute('studyInstanceUid', study.getStudyInstanceUID());
- displaySets.push(displaySet);
- }
- });
-
- return displaySets;
-};
-
-/**
- * Expose "createStacks"...
- */
-
-export { createStacks };
diff --git a/src/lib/viewerbase/crosshairsSynchronizers.js b/src/lib/viewerbase/crosshairsSynchronizers.js
deleted file mode 100644
index a02bbb7..0000000
--- a/src/lib/viewerbase/crosshairsSynchronizers.js
+++ /dev/null
@@ -1,4 +0,0 @@
-
-export const crosshairsSynchronizers = {
- synchronizers: {}
-};
diff --git a/src/lib/viewerbase/getElementIfNotEmpty.js b/src/lib/viewerbase/getElementIfNotEmpty.js
deleted file mode 100644
index 52236c8..0000000
--- a/src/lib/viewerbase/getElementIfNotEmpty.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import $ from 'jquery';
-import { cornerstone } from '../../lib/cornerstonejs';
-
-export function getElementIfNotEmpty(viewportIndex) {
- const imageViewerViewports = $('.imageViewerViewport');
- const element = imageViewerViewports.get(viewportIndex);
- const canvases = imageViewerViewports.eq(viewportIndex).find('canvas');
-
- if (!element || $(element).hasClass('empty') || canvases.length === 0) {
- return;
- }
-
- // Check to make sure the element is enabled.
- try {
- cornerstone.getEnabledElement(element);
- } catch (error) {
- return;
- }
-
- return element;
-}
diff --git a/src/lib/viewerbase/getFrameOfReferenceUID.js b/src/lib/viewerbase/getFrameOfReferenceUID.js
deleted file mode 100644
index 9afdeb2..0000000
--- a/src/lib/viewerbase/getFrameOfReferenceUID.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import { cornerstone } from '../cornerstonejs';
-
-/**
- * Helper function to quickly obtain the frameOfReferenceUID
- * for a given element from the enabled image's metadata.
- *
- * If no image, imagePlane, or frameOfReferenceUID is available,
- * the function will return undefined.
- *
- * @param element
- * @returns {string}
- */
-export function getFrameOfReferenceUID(element) {
- let enabledElement;
- try {
- enabledElement = cornerstone.getEnabledElement(element);
- } catch (error) {
- return;
- }
-
- if (!enabledElement || !enabledElement.image) {
- return;
- }
-
- const { imageId } = enabledElement.image;
- const imagePlane = cornerstone.metaData.get('imagePlane', imageId);
- if (!imagePlane || !imagePlane.frameOfReferenceUID) {
- return;
- }
-
- return imagePlane.frameOfReferenceUID;
-}
diff --git a/src/lib/viewerbase/getImageId.js b/src/lib/viewerbase/getImageId.js
deleted file mode 100644
index 44708db..0000000
--- a/src/lib/viewerbase/getImageId.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import { getWADORSImageId } from './getWADORSImageId';
-
-// https://stackoverflow.com/a/6021027/3895126
-function updateQueryStringParameter(uri, key, value) {
- const regex = new RegExp(`([?&])${key}=.*?(&|$)`, 'i');
- const separator = uri.indexOf('?') !== -1 ? '&' : '?';
- if (uri.match(regex)) {
- return uri.replace(regex, `$1${key}=${value}$2`);
- }
- return `${uri + separator + key}=${value}`;
-}
-
-/**
- * Obtain an imageId for Cornerstone from an image instance
- *
- * @param instance
- * @param frame
- * @param thumbnail
- * @returns {string} The imageId to be used by Cornerstone
- */
-export function getImageId(instance, frame, thumbnail = false) {
- if (!instance) {
- return;
- }
-
- if (typeof instance.getImageId === 'function') {
- return instance.getImageId();
- }
-
- if (instance.url) {
- if (frame !== undefined) {
- instance.url = updateQueryStringParameter(instance.url, 'frame', frame);
- }
-
- return instance.url;
- }
-
- const renderingAttr = thumbnail ? 'thumbnailRendering' : 'imageRendering';
-
- if (!instance[renderingAttr] || instance[renderingAttr] === 'wadouri' || !instance.wadorsuri) {
- let imageId = `dicomweb:${instance.wadouri}`;
- if (frame !== undefined) {
- imageId += `&frame=${frame}`;
- }
-
- return imageId;
- }
- return getWADORSImageId(instance, frame, thumbnail); // WADO-RS Retrieve Frame
-}
diff --git a/src/lib/viewerbase/getStackDataIfNotEmpty.js b/src/lib/viewerbase/getStackDataIfNotEmpty.js
deleted file mode 100644
index eef2f6b..0000000
--- a/src/lib/viewerbase/getStackDataIfNotEmpty.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import { cornerstoneTools } from '../cornerstonejs';
-import { getElementIfNotEmpty } from './getElementIfNotEmpty';
-
-export function getStackDataIfNotEmpty(viewportIndex) {
- const element = getElementIfNotEmpty(viewportIndex);
- if (!element) {
- return;
- }
-
- const stackToolData = cornerstoneTools.getToolState(element, 'stack');
- if (!stackToolData ||
- !stackToolData.data ||
- !stackToolData.data.length) {
- return;
- }
-
- const stack = stackToolData.data[0];
- if (!stack) {
- return;
- }
-
- return stack;
-}
diff --git a/src/lib/viewerbase/getStudyMetadata.js b/src/lib/viewerbase/getStudyMetadata.js
deleted file mode 100644
index 666d404..0000000
--- a/src/lib/viewerbase/getStudyMetadata.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { StudyMetadata } from './classes/metadata/viewerMain/StudyMetadata';
-
-const getStudyMetadata = (study) => {
- let studyMetadata = study;
- if (study && !(studyMetadata instanceof StudyMetadata)) {
- studyMetadata = new StudyMetadata(study, study.studyInstanceUid);
- }
-
- return studyMetadata;
-};
-
-export { getStudyMetadata };
diff --git a/src/lib/viewerbase/getWADORSImageId.js b/src/lib/viewerbase/getWADORSImageId.js
deleted file mode 100644
index 5bd3434..0000000
--- a/src/lib/viewerbase/getWADORSImageId.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import { getWADORSImageUrl } from './getWADORSImageUrl';
-import { DCMViewerLog } from '../DCMViewerLog';
-
-/**
- * Obtain an imageId for Cornerstone based on the WADO-RS scheme
- *
- * @param {object} instanceMetada metadata object (InstanceMetadata)
- * @returns {string} The imageId to be used by Cornerstone
- */
-export function getWADORSImageId(instance, frame) {
- const uri = getWADORSImageUrl(instance, frame);
-
- if (!uri) {
- return;
- }
-
- const imageId = `wadors:${uri}`;
-
- DCMViewerLog.info(`WADO-RS ImageID: ${imageId}`);
-
- return imageId;
-}
diff --git a/src/lib/viewerbase/getWADORSImageUrl.js b/src/lib/viewerbase/getWADORSImageUrl.js
deleted file mode 100644
index 7f81373..0000000
--- a/src/lib/viewerbase/getWADORSImageUrl.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export function getWADORSImageUrl(instance, frame) {
- let { wadorsuri } = instance;
- if (!wadorsuri) {
- return;
- }
-
- // We need to sum 1 because WADO-RS frame number is 1-based
- frame = (frame || 0) + 1;
-
- // Replaces /frame/1 by /frame/{frame}
- wadorsuri = wadorsuri.replace(/(%2Fframes%2F)(\d+)/, `$1${frame}`);
-
- return wadorsuri;
-}
diff --git a/src/lib/viewerbase/index.js b/src/lib/viewerbase/index.js
deleted file mode 100644
index 0144425..0000000
--- a/src/lib/viewerbase/index.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import { ImageSet } from './classes/ImageSet';
-import { BaseInstanceMetadata } from './classes/metadata/BaseInstanceMetadata';
-import { BaseSeriesMetadata } from './classes/metadata/BaseSeriesMetadata';
-import { BaseStudyMetadata } from './classes/metadata/BaseStudyMetadata';
-import { InstanceMetadata } from './classes/metadata/viewerMain/InstanceMetadata';
-import { SeriesMetadata } from './classes/metadata/viewerMain/SeriesMetadata';
-import { StudyMetadata } from './classes/metadata/viewerMain/StudyMetadata';
-import { LayoutManager } from './classes/LayoutManager';
-import { MetadataProvider } from './classes/MetadataProvider';
-import { ResizeViewportManager } from './classes/ResizeViewportManager';
-import { StudyLoadingListener } from './classes/StudyLoadingListener';
-import { StudyPrefetcher } from './classes/StudyPrefetcher';
-import { StackManager } from './StackManager';
-import { DICOMTagDescriptions } from './DICOMTagDescriptions';
-import { sopClassDictionary } from './sopClassDictionary';
-import { isImage } from './isImage';
-import { createStacks } from './createStacks';
-import { getStackDataIfNotEmpty } from './getStackDataIfNotEmpty';
-import { sortingManager } from './sortingManager';
-import { updateOrientationMarkers } from './updateOrientationMarkers';
-import { viewportOverlayUtils } from './viewportOverlayUtils';
-import { viewportUtils } from './viewportUtils';
-import { getStudyMetadata } from './getStudyMetadata';
-import { getInstanceClassDefaultViewport } from './instanceClassSpecificViewport';
-import { toolManager } from './toolManager';
-
-const Viewerbase = {
- metadata: {
- BaseInstanceMetadata,
- BaseSeriesMetadata,
- BaseStudyMetadata,
- InstanceMetadata,
- SeriesMetadata,
- StudyMetadata
- },
- LayoutManager,
- MetadataProvider,
- ResizeViewportManager,
- StudyLoadingListener,
- StudyPrefetcher,
- ImageSet,
- DICOMTagDescriptions,
- StackManager,
- sopClassDictionary,
- isImage,
- createStacks,
- getStackDataIfNotEmpty,
- sortingManager,
- updateOrientationMarkers,
- viewportOverlayUtils,
- viewportUtils,
- getStudyMetadata,
- getInstanceClassDefaultViewport,
- toolManager
-};
-
-export { Viewerbase };
diff --git a/src/lib/viewerbase/instanceClassSpecificViewport.js b/src/lib/viewerbase/instanceClassSpecificViewport.js
deleted file mode 100644
index abc51d1..0000000
--- a/src/lib/viewerbase/instanceClassSpecificViewport.js
+++ /dev/null
@@ -1,18 +0,0 @@
-
-const instanceClassViewportSettingsFunctions = {};
-
-const getInstanceClassDefaultViewport = (series, enabledElement, imageId) => {
- const instanceClass = series.sopClassUid;
-
- if (!instanceClassViewportSettingsFunctions[instanceClass]) {
- return;
- }
-
- return instanceClassViewportSettingsFunctions[instanceClass](series, enabledElement, imageId);
-};
-
-const setInstanceClassDefaultViewportFunction = (instanceClass, fn) => {
- instanceClassViewportSettingsFunctions[instanceClass] = fn;
-};
-
-export { getInstanceClassDefaultViewport, setInstanceClassDefaultViewportFunction };
diff --git a/src/lib/viewerbase/isImage.js b/src/lib/viewerbase/isImage.js
deleted file mode 100644
index f90d26c..0000000
--- a/src/lib/viewerbase/isImage.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import { sopClassDictionary } from './sopClassDictionary';
-
-/**
- * Checks whether dicom files with specified SOP Class UID have image data
- * @param {string} sopClassUid - SOP Class UID to be checked
- * @returns {boolean} - true if it has image data
- */
-export function isImage(sopClassUid) {
- if (sopClassUid === sopClassDictionary.ComputedRadiographyImageStorage
- || sopClassUid === sopClassDictionary.DigitalXRayImageStorageForPresentation
- || sopClassUid === sopClassDictionary.DigitalXRayImageStorageForProcessing
- || sopClassUid === sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation
- || sopClassUid === sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing
- || sopClassUid === sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation
- || sopClassUid === sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing
- || sopClassUid === sopClassDictionary.CTImageStorage
- || sopClassUid === sopClassDictionary.EnhancedCTImageStorage
- || sopClassUid === sopClassDictionary.LegacyConvertedEnhancedCTImageStorage
- || sopClassUid === sopClassDictionary.UltrasoundMultiframeImageStorage
- || sopClassUid === sopClassDictionary.MRImageStorage
- || sopClassUid === sopClassDictionary.EnhancedMRImageStorage
- || sopClassUid === sopClassDictionary.EnhancedMRColorImageStorage
- || sopClassUid === sopClassDictionary.LegacyConvertedEnhancedMRImageStorage
- || sopClassUid === sopClassDictionary.UltrasoundImageStorage
- || sopClassUid === sopClassDictionary.SecondaryCaptureImageStorage
- || sopClassUid === sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage
- || sopClassUid === sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage
- || sopClassUid === sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage
- || sopClassUid === sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage
- || sopClassUid === sopClassDictionary.XRayAngiographicImageStorage
- || sopClassUid === sopClassDictionary.EnhancedXAImageStorage
- || sopClassUid === sopClassDictionary.XRayRadiofluoroscopicImageStorage
- || sopClassUid === sopClassDictionary.EnhancedXRFImageStorage
- || sopClassUid === sopClassDictionary.XRay3DAngiographicImageStorage
- || sopClassUid === sopClassDictionary.XRay3DCraniofacialImageStorage
- || sopClassUid === sopClassDictionary.BreastTomosynthesisImageStorage
- || sopClassUid === sopClassDictionary.BreastProjectionXRayImageStorageForPresentation
- || sopClassUid === sopClassDictionary.BreastProjectionXRayImageStorageForProcessing
- || sopClassUid === sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation
- || sopClassUid === sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing
- || sopClassUid === sopClassDictionary.NuclearMedicineImageStorage
- || sopClassUid === sopClassDictionary.VLEndoscopicImageStorage
- || sopClassUid === sopClassDictionary.VideoEndoscopicImageStorage
- || sopClassUid === sopClassDictionary.VLMicroscopicImageStorage
- || sopClassUid === sopClassDictionary.VideoMicroscopicImageStorage
- || sopClassUid === sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage
- || sopClassUid === sopClassDictionary.VLPhotographicImageStorage
- || sopClassUid === sopClassDictionary.VideoPhotographicImageStorage
- || sopClassUid === sopClassDictionary.OphthalmicPhotography8BitImageStorage
- || sopClassUid === sopClassDictionary.OphthalmicPhotography16BitImageStorage
- || sopClassUid === sopClassDictionary.OphthalmicTomographyImageStorage
- || sopClassUid === sopClassDictionary.VLWholeSlideMicroscopyImageStorage
- || sopClassUid === sopClassDictionary.PositronEmissionTomographyImageStorage
- || sopClassUid === sopClassDictionary.EnhancedPETImageStorage
- || sopClassUid === sopClassDictionary.LegacyConvertedEnhancedPETImageStorage
- || sopClassUid === sopClassDictionary.RTImageStorage) {
- return true;
- }
-
- return false;
-}
diff --git a/src/lib/viewerbase/isTouchDevice.js b/src/lib/viewerbase/isTouchDevice.js
deleted file mode 100644
index ec06a05..0000000
--- a/src/lib/viewerbase/isTouchDevice.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const isTouchDevice = () => (('ontouchstart' in window) ||
- (navigator.MaxTouchPoints > 0) ||
- (navigator.msMaxTouchPoints > 0));
-
-export { isTouchDevice };
diff --git a/src/lib/viewerbase/parsingUtils.js b/src/lib/viewerbase/parsingUtils.js
deleted file mode 100644
index 374a3dd..0000000
--- a/src/lib/viewerbase/parsingUtils.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import { dicomParser } from '../cornerstonejs';
-
-/**
- * A small set of utilities to help parsing DICOM element values.
- * In the future the functionality provided by this library might
- * be incorporated into dicomParser library.
- */
-
-export const parsingUtils = {
-
- /**
- * Check if supplied argument is a valid instance of the dicomParser.DataSet class.
- * @param data {Object} An instance of the dicomParser.DataSet class.
- * @returns {Boolean} Returns true if data is a valid instance of the dicomParser.DataSet class.
- */
- isValidDataSet(data) {
- return (data instanceof dicomParser.DataSet);
- },
-
- /**
- * Parses an element tag according to the 'AT' VR definition.
- * @param data {Object} An instance of the dicomParser.DataSet class.
- * @param tag {String} A DICOM tag with in the format xGGGGEEEE.
- * @returns {String} A string representation of a data element tag or null if the field is not present or data is not long enough.
- */
- attributeTag(data, tag) {
- if (this.isValidDataSet(data) && tag in data.elements) {
- const element = data.elements[tag];
- if (element && element.length === 4) {
- const parser = data.byteArrayParser.readUint16;
- const bytes = data.byteArray;
- const offset = element.dataOffset;
- return `x${(`00000000${(((parser(bytes, offset) * 256) * 256) + parser(bytes, offset + 2)).toString(16)}`).substr(-8)}`;
- }
- }
-
- return null;
- },
-
- /**
- * Parses the string representation of a multi-valued element into an array of strings. If the parser
- * parameter is passed and is a function, it will be applied to each element of the resulting array.
- * @param data {Object} An instance of the dicomParser.DataSet class.
- * @param tag {String} A DICOM tag with in the format xGGGGEEEE.
- * @param parser {Function} An optional parser function that can be applied to each element of the array.
- * @returns {Array} An array of floating point numbers or null if the field is not present or data is not long enough.
- */
- multiValue(data, tag, parser) {
- if (this.isValidDataSet(data) && tag in data.elements) {
- const element = data.elements[tag];
- if (element && element.length > 0) {
- const string = dicomParser.readFixedString(data.byteArray, element.dataOffset, element.length);
- if (typeof string === 'string' && string.length > 0) {
- if (typeof parser !== 'function') {
- parser = null;
- }
-
- return string.split('\\').map((value) => {
- value = value.trim();
- return parser !== null ? parser(value) : value;
- });
- }
- }
- }
-
- return null;
- },
-
- /**
- * Parses a string to an array of floats for a multi-valued element.
- * @param data {Object} An instance of the dicomParser.DataSet class.
- * @param tag {String} A DICOM tag with in the format xGGGGEEEE.
- * @returns {Array} An array of floating point numbers or null if the field is not present or data is not long enough.
- */
- floatArray(data, tag) {
- return this.multiValue(data, tag, parseFloat);
- }
-
-};
diff --git a/src/lib/viewerbase/sopClassDictionary.js b/src/lib/viewerbase/sopClassDictionary.js
deleted file mode 100644
index d9ef259..0000000
--- a/src/lib/viewerbase/sopClassDictionary.js
+++ /dev/null
@@ -1,116 +0,0 @@
-
-export const sopClassDictionary = {
- ComputedRadiographyImageStorage: '1.2.840.10008.5.1.4.1.1.1',
- DigitalXRayImageStorageForPresentation: '1.2.840.10008.5.1.4.1.1.1.1',
- DigitalXRayImageStorageForProcessing: '1.2.840.10008.5.1.4.1.1.1.1.1',
- DigitalMammographyXRayImageStorageForPresentation: '1.2.840.10008.5.1.4.1.1.1.2',
- DigitalMammographyXRayImageStorageForProcessing: '1.2.840.10008.5.1.4.1.1.1.2.1',
- DigitalIntraOralXRayImageStorageForPresentation: '1.2.840.10008.5.1.4.1.1.1.3',
- DigitalIntraOralXRayImageStorageForProcessing: '1.2.840.10008.5.1.4.1.1.1.3.1',
- CTImageStorage: '1.2.840.10008.5.1.4.1.1.2',
- EnhancedCTImageStorage: '1.2.840.10008.5.1.4.1.1.2.1',
- LegacyConvertedEnhancedCTImageStorage: '1.2.840.10008.5.1.4.1.1.2.2',
- UltrasoundMultiframeImageStorage: '1.2.840.10008.5.1.4.1.1.3.1',
- MRImageStorage: '1.2.840.10008.5.1.4.1.1.4',
- EnhancedMRImageStorage: '1.2.840.10008.5.1.4.1.1.4.1',
- MRSpectroscopyStorage: '1.2.840.10008.5.1.4.1.1.4.2',
- EnhancedMRColorImageStorage: '1.2.840.10008.5.1.4.1.1.4.3',
- LegacyConvertedEnhancedMRImageStorage: '1.2.840.10008.5.1.4.1.1.4.4',
- UltrasoundImageStorage: '1.2.840.10008.5.1.4.1.1.6.1',
- EnhancedUSVolumeStorage: '1.2.840.10008.5.1.4.1.1.6.2',
- SecondaryCaptureImageStorage: '1.2.840.10008.5.1.4.1.1.7',
- MultiframeSingleBitSecondaryCaptureImageStorage: '1.2.840.10008.5.1.4.1.1.7.1',
- MultiframeGrayscaleByteSecondaryCaptureImageStorage: '1.2.840.10008.5.1.4.1.1.7.2',
- MultiframeGrayscaleWordSecondaryCaptureImageStorage: '1.2.840.10008.5.1.4.1.1.7.3',
- MultiframeTrueColorSecondaryCaptureImageStorage: '1.2.840.10008.5.1.4.1.1.7.4',
- Sop12LeadECGWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.1.1',
- GeneralECGWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.1.2',
- AmbulatoryECGWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.1.3',
- HemodynamicWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.2.1',
- CardiacElectrophysiologyWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.3.1',
- BasicVoiceAudioWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.4.1',
- GeneralAudioWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.4.2',
- ArterialPulseWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.5.1',
- RespiratoryWaveformStorage: '1.2.840.10008.5.1.4.1.1.9.6.1',
- GrayscaleSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.1',
- ColorSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.2',
- PseudoColorSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.3',
- BlendingSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.4',
- XAXRFGrayscaleSoftcopyPresentationStateStorage: '1.2.840.10008.5.1.4.1.1.11.5',
- XRayAngiographicImageStorage: '1.2.840.10008.5.1.4.1.1.12.1',
- EnhancedXAImageStorage: '1.2.840.10008.5.1.4.1.1.12.1.1',
- XRayRadiofluoroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.12.2',
- EnhancedXRFImageStorage: '1.2.840.10008.5.1.4.1.1.12.2.1',
- XRay3DAngiographicImageStorage: '1.2.840.10008.5.1.4.1.1.13.1.1',
- XRay3DCraniofacialImageStorage: '1.2.840.10008.5.1.4.1.1.13.1.2',
- BreastTomosynthesisImageStorage: '1.2.840.10008.5.1.4.1.1.13.1.3',
- BreastProjectionXRayImageStorageForPresentation: '1.2.840.10008.5.1.4.1.1.13.1.4',
- BreastProjectionXRayImageStorageForProcessing: '1.2.840.10008.5.1.4.1.1.13.1.5',
- IntravascularOpticalCoherenceTomographyImageStorageForPresentation: '1.2.840.10008.5.1.4.1.1.14.1',
- IntravascularOpticalCoherenceTomographyImageStorageForProcessing: '1.2.840.10008.5.1.4.1.1.14.2',
- NuclearMedicineImageStorage: '1.2.840.10008.5.1.4.1.1.20',
- RawDataStorage: '1.2.840.10008.5.1.4.1.1.66',
- SpatialRegistrationStorage: '1.2.840.10008.5.1.4.1.1.66.1',
- SpatialFiducialsStorage: '1.2.840.10008.5.1.4.1.1.66.2',
- DeformableSpatialRegistrationStorage: '1.2.840.10008.5.1.4.1.1.66.3',
- SegmentationStorage: '1.2.840.10008.5.1.4.1.1.66.4',
- SurfaceSegmentationStorage: '1.2.840.10008.5.1.4.1.1.66.5',
- RealWorldValueMappingStorage: '1.2.840.10008.5.1.4.1.1.67',
- SurfaceScanMeshStorage: '1.2.840.10008.5.1.4.1.1.68.1',
- SurfaceScanPointCloudStorage: '1.2.840.10008.5.1.4.1.1.68.2',
- VLEndoscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.1',
- VideoEndoscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.1.1',
- VLMicroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.2',
- VideoMicroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.2.1',
- VLSlideCoordinatesMicroscopicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.3',
- VLPhotographicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.4',
- VideoPhotographicImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.4.1',
- OphthalmicPhotography8BitImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.1',
- OphthalmicPhotography16BitImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.2',
- StereometricRelationshipStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.3',
- OphthalmicTomographyImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.5.4',
- VLWholeSlideMicroscopyImageStorage: '1.2.840.10008.5.1.4.1.1.77.1.6',
- LensometryMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.1',
- AutorefractionMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.2',
- KeratometryMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.3',
- SubjectiveRefractionMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.4',
- VisualAcuityMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.5',
- SpectaclePrescriptionReportStorage: '1.2.840.10008.5.1.4.1.1.78.6',
- OphthalmicAxialMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.78.7',
- IntraocularLensCalculationsStorage: '1.2.840.10008.5.1.4.1.1.78.8',
- MacularGridThicknessandVolumeReport: '1.2.840.10008.5.1.4.1.1.79.1',
- OphthalmicVisualFieldStaticPerimetryMeasurementsStorage: '1.2.840.10008.5.1.4.1.1.80.1',
- OphthalmicThicknessMapStorage: '1.2.840.10008.5.1.4.1.1.81.1',
- CornealTopographyMapStorage: '1.2.840.10008.5.1.4.1.1.82.1',
- BasicTextSR: '1.2.840.10008.5.1.4.1.1.88.11',
- EnhancedSR: '1.2.840.10008.5.1.4.1.1.88.22',
- ComprehensiveSR: '1.2.840.10008.5.1.4.1.1.88.33',
- Comprehensive3DSR: '1.2.840.10008.5.1.4.1.1.88.34',
- ProcedureLog: '1.2.840.10008.5.1.4.1.1.88.40',
- MammographyCADSR: '1.2.840.10008.5.1.4.1.1.88.50',
- KeyObjectSelection: '1.2.840.10008.5.1.4.1.1.88.59',
- ChestCADSR: '1.2.840.10008.5.1.4.1.1.88.65',
- XRayRadiationDoseSR: '1.2.840.10008.5.1.4.1.1.88.67',
- RadiopharmaceuticalRadiationDoseSR: '1.2.840.10008.5.1.4.1.1.88.68',
- ColonCADSR: '1.2.840.10008.5.1.4.1.1.88.69',
- ImplantationPlanSRDocumentStorage: '1.2.840.10008.5.1.4.1.1.88.70',
- EncapsulatedPDFStorage: '1.2.840.10008.5.1.4.1.1.104.1',
- EncapsulatedCDAStorage: '1.2.840.10008.5.1.4.1.1.104.2',
- PositronEmissionTomographyImageStorage: '1.2.840.10008.5.1.4.1.1.128',
- EnhancedPETImageStorage: '1.2.840.10008.5.1.4.1.1.130',
- LegacyConvertedEnhancedPETImageStorage: '1.2.840.10008.5.1.4.1.1.128.1',
- BasicStructuredDisplayStorage: '1.2.840.10008.5.1.4.1.1.131',
- RTImageStorage: '1.2.840.10008.5.1.4.1.1.481.1',
- RTDoseStorage: '1.2.840.10008.5.1.4.1.1.481.2',
- RTStructureSetStorage: '1.2.840.10008.5.1.4.1.1.481.3',
- RTBeamsTreatmentRecordStorage: '1.2.840.10008.5.1.4.1.1.481.4',
- RTPlanStorage: '1.2.840.10008.5.1.4.1.1.481.5',
- RTBrachyTreatmentRecordStorage: '1.2.840.10008.5.1.4.1.1.481.6',
- RTTreatmentSummaryRecordStorage: '1.2.840.10008.5.1.4.1.1.481.7',
- RTIonPlanStorage: '1.2.840.10008.5.1.4.1.1.481.8',
- RTIonBeamsTreatmentRecordStorage: '1.2.840.10008.5.1.4.1.1.481.9',
- RTBeamsDeliveryInstructionStorage: '1.2.840.10008.5.1.4.34.7',
- GenericImplantTemplateStorage: '1.2.840.10008.5.1.4.43.1',
- ImplantAssemblyTemplateStorage: '1.2.840.10008.5.1.4.44.1',
- ImplantTemplateGroupStorage: '1.2.840.10008.5.1.4.45.1'
-};
diff --git a/src/lib/viewerbase/sortingManager.js b/src/lib/viewerbase/sortingManager.js
deleted file mode 100644
index b1bd9f3..0000000
--- a/src/lib/viewerbase/sortingManager.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { createStacks } from './createStacks';
-
-const getDisplaySets = (studyMetadata, seriesNumber, iteratorFunction) => {
- const iteratorFn = typeof iteratorFunction !== 'function' ? createStacks : iteratorFunction;
-
- return iteratorFn(studyMetadata, seriesNumber);
-};
-
-const sortingManager = {
- getDisplaySets
-};
-
-export { sortingManager };
diff --git a/src/lib/viewerbase/textMarkerUtils.js b/src/lib/viewerbase/textMarkerUtils.js
deleted file mode 100644
index 89b0137..0000000
--- a/src/lib/viewerbase/textMarkerUtils.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import $ from 'jquery';
-import { cornerstoneTools } from '../cornerstonejs';
-import { toolManager } from './toolManager';
-import { viewportUtils } from './viewportUtils';
-import { isTouchDevice } from './isTouchDevice';
-
-const changeTextCallback = (data, eventData, doneChangingTextCallback) => {
- const dialog = $('#textMarkerRelabelDialog');
- const select = dialog.find('.relabelSelect');
-
- // Deactivate textMarker tool after editing a spine label & if spine is not active tool
- const deactivateAfterEdit = () => {
- if (toolManager.getActiveTool() !== 'spine') {
- const element = viewportUtils.getActiveViewportElement();
- cornerstoneTools.textMarker.deactivate(element, 1);
- }
- };
-
- const closeHandler = () => {
- dialog.get(0).close();
- doneChangingTextCallback(data, select.val());
- deactivateAfterEdit();
- // Reset the focus to the active viewport element
- // This makes the mobile Safari keyboard close
- const element = viewportUtils.getActiveViewportElement();
- $(element).focus();
- };
-
- // This handles the double-click/long-press event on Spine text marker labels
- const keyPressHandler = (e) => {
- // If Enter or Esc are pressed, close the dialog
- if (e.which === 13 || e.which === 27) {
- closeHandler();
- }
- };
-
- if (isTouchDevice()) {
- // Center the dialog on screen on touch devices
- dialog.css({
- top: 0,
- left: 0,
- right: 0,
- bottom: 0,
- margin: 'auto'
- });
- dialog.find('.dialog.arrow').hide();
- } else {
- // Place the dialog above the tool that is being relabelled
- // TODO = Switch this to the tool coordinates, but put back into
- // page coordinates.
- dialog.css({
- top: eventData.currentPoints.page.y - dialog.outerHeight() - 20,
- left: eventData.currentPoints.page.x - (dialog.outerWidth() / 2)
- });
- dialog.find('.dialog.arrow').show();
- }
-
- const confirm = dialog.find('.relabelConfirm');
- const remove = dialog.find('.relabelRemove');
-
- // If the remove button is clicked, delete this marker
- remove.off('click');
- remove.on('click', () => {
- dialog.get(0).close();
- doneChangingTextCallback(data, undefined, true);
- deactivateAfterEdit();
- });
-
- dialog.get(0).showModal();
- $('.relabelSelect').val(data.text).trigger('change'); // Update selector to the current
-
- confirm.off('click');
- confirm.on('click', () => {
- closeHandler();
- });
-
- // Use keydown since keypress doesn't handle ESC in Chrome
- dialog.off('keydown');
- dialog.on('keydown', keyPressHandler);
-};
-
-const textMarkerUtils = {
- changeTextCallback
-};
-
-export { textMarkerUtils };
diff --git a/src/lib/viewerbase/toolManager.js b/src/lib/viewerbase/toolManager.js
deleted file mode 100644
index 504c405..0000000
--- a/src/lib/viewerbase/toolManager.js
+++ /dev/null
@@ -1,683 +0,0 @@
-import $ from 'jquery';
-import RandomID from 'random-id';
-import { cornerstone, cornerstoneTools } from '../cornerstonejs';
-import { DCMViewerManager } from '../DCMViewerManager';
-import { Utils } from './Utils';
-import { getFrameOfReferenceUID } from './getFrameOfReferenceUID';
-import { updateCrosshairsSynchronizer } from './updateCrosshairsSynchronizer';
-import { crosshairsSynchronizers } from './crosshairsSynchronizers';
-import { annotateTextUtils } from './annotateTextUtils';
-import { textMarkerUtils } from './textMarkerUtils';
-import { isTouchDevice } from './isTouchDevice';
-
-const defaultTool = {
- left: 'wwwc',
- right: 'zoom',
- middle: 'pan'
-};
-let activeTool;
-let defaultMouseButtonTools;
-
-const tools = {};
-
-let gestures = {
- zoomTouchPinch: {
- enabled: true
- },
- panMultiTouch: {
- enabled: true,
- numPointers: 2
- },
- stackScrollMultiTouch: {
- enabled: true,
- numPointers: 3
- },
- doubleTapZoom: {
- enabled: true
- }
-};
-
-let toolDefaultStates = {
- activate: [],
- deactivate: ['length', 'angle', 'annotate', 'ellipticalRoi', 'rectangleRoi', 'spine'],
- enable: [],
- disable: [],
- disabledToolButtons: [],
- shadowConfig: {
- shadow: false,
- shadowColor: '#000000',
- shadowOffsetX: 0,
- shadowOffsetY: 0
- },
- textBoxConfig: {
- centering: {
- x: true,
- y: true
- }
- }
-};
-
-let initialized = false;
-
-/**
- * Exported "toolManager" Singleton
- */
-export const toolManager = {
- init() {
- toolManager.addTool('wwwc', {
- mouse: cornerstoneTools.wwwc,
- touch: cornerstoneTools.wwwcTouchDrag
- });
- toolManager.addTool('zoom', {
- mouse: cornerstoneTools.zoom,
- touch: cornerstoneTools.zoomTouchDrag
- });
- toolManager.addTool('wwwcRegion', {
- mouse: cornerstoneTools.wwwcRegion,
- touch: cornerstoneTools.wwwcRegionTouch
- });
- toolManager.addTool('dragProbe', {
- mouse: cornerstoneTools.dragProbe,
- touch: cornerstoneTools.dragProbeTouch
- });
- toolManager.addTool('pan', {
- mouse: cornerstoneTools.pan,
- touch: cornerstoneTools.panTouchDrag,
- multiTouch: cornerstoneTools.panMultiTouch
- });
- toolManager.addTool('stackScroll', {
- mouse: cornerstoneTools.stackScroll,
- touch: cornerstoneTools.stackScrollTouchDrag,
- multiTouch: cornerstoneTools.stackScrollMultiTouch
- });
- toolManager.addTool('length', {
- mouse: cornerstoneTools.length,
- touch: cornerstoneTools.lengthTouch
- });
- toolManager.addTool('angle', {
- mouse: cornerstoneTools.simpleAngle,
- touch: cornerstoneTools.simpleAngleTouch
- });
- toolManager.addTool('magnify', {
- mouse: cornerstoneTools.magnify,
- touch: cornerstoneTools.magnifyTouchDrag
- });
- toolManager.addTool('ellipticalRoi', {
- mouse: cornerstoneTools.ellipticalRoi,
- touch: cornerstoneTools.ellipticalRoiTouch
- });
- toolManager.addTool('rectangleRoi', {
- mouse: cornerstoneTools.rectangleRoi,
- touch: cornerstoneTools.rectangleRoiTouch
- });
- toolManager.addTool('annotate', {
- mouse: cornerstoneTools.arrowAnnotate,
- touch: cornerstoneTools.arrowAnnotateTouch
- });
- toolManager.addTool('rotate', {
- mouse: cornerstoneTools.rotate,
- touch: cornerstoneTools.rotateTouchDrag
- });
- toolManager.addTool('spine', {
- mouse: cornerstoneTools.textMarker,
- touch: cornerstoneTools.textMarkerTouch
- });
- toolManager.addTool('crosshairs', {
- mouse: cornerstoneTools.crosshairs,
- touch: cornerstoneTools.crosshairsTouch
- });
-
- // if a default tool is globally defined, make it the default tool...
- if (DCMViewerManager.defaultTool) {
- this.setDefaultTool(DCMViewerManager.defaultTool);
- }
-
- defaultMouseButtonTools = DCMViewerManager.settings && DCMViewerManager.settings.public && DCMViewerManager.settings.public.defaultMouseButtonTools;
-
- // Override default tool if defined in settings
- if (defaultMouseButtonTools) {
- if (defaultMouseButtonTools.left) {
- this.setDefaultTool(defaultMouseButtonTools.left);
- }
- if (defaultMouseButtonTools.right) {
- this.setDefaultTool(defaultMouseButtonTools.right, 'right');
- }
- if (defaultMouseButtonTools.middle) {
- this.setDefaultTool(defaultMouseButtonTools.middle, 'middle');
- }
- }
-
- this.configureTools();
- initialized = true;
- },
-
- configureTools() {
- // Get Cornerstone Tools
- const {
- textStyle, toolStyle, toolColors,
- length, arrowAnnotate, zoom, ellipticalRoi,
- textMarker, magnify
- } = cornerstoneTools;
-
- // Set text box background color
- textStyle.setBackgroundColor('transparent');
-
- // Set the tool font and font size
- // context.font = "[style] [variant] [weight] [size]/[line height] [font family]";
- const fontFamily = 'Roboto, OpenSans, HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif';
- textStyle.setFont(`15px ${fontFamily}`);
-
- // Set the tool width
- toolStyle.setToolWidth(2);
-
- // Set color for inactive tools
- toolColors.setToolColor('rgb(255, 255, 0)');
-
- // Set color for active tools
- toolColors.setActiveColor('rgb(0, 255, 0)');
-
- // Set shadow configuration
- const { shadowConfig } = toolManager.getToolDefaultStates();
-
- // Get some tools config to not override them
- const lengthConfig = length.getConfiguration();
- const ellipticalRoiConfig = ellipticalRoi.getConfiguration();
-
- // Add shadow to length tool
- length.setConfiguration(Object.assign({}, lengthConfig, shadowConfig, { drawHandlesOnHover: true }));
-
- // Add shadow to length tool
- ellipticalRoi.setConfiguration(Object.assign({}, ellipticalRoiConfig, shadowConfig));
-
- // Set the configuration values for the Text Marker (Spine Labelling) tool
- const $startFrom = $('#startFrom');
- const $ascending = $('#ascending');
- const textMarkerConfig = {
- markers: ['L5', 'L4', 'L3', 'L2', 'L1', // Lumbar spine
- 'T12', 'T11', 'T10', 'T9', 'T8', 'T7', // Thoracic spine
- 'T6', 'T5', 'T4', 'T3', 'T2', 'T1',
- 'C7', 'C6', 'C5', 'C4', 'C3', 'C2', 'C1', // Cervical spine
- ],
- current: $startFrom.val(),
- ascending: $ascending.is(':checked'),
- loop: true,
- changeTextCallback: textMarkerUtils.changeTextCallback,
- shadow: shadowConfig.shadow,
- shadowColor: shadowConfig.shadowColor,
- shadowOffsetX: shadowConfig.shadowOffsetX,
- shadowOffsetY: shadowConfig.shadowOffsetY
- };
- textMarker.setConfiguration(textMarkerConfig);
-
- // Set the configuration values for the text annotation (Arrow) tool
- const annotateConfig = {
- getTextCallback: annotateTextUtils.getTextCallback,
- changeTextCallback: annotateTextUtils.changeTextCallback,
- drawHandles: false,
- arrowFirst: true
- };
- arrowAnnotate.setConfiguration(annotateConfig);
-
- const zoomConfig = {
- minScale: 0.05,
- maxScale: 10
- };
- zoom.setConfiguration(zoomConfig);
-
- const magnifyConfig = {
- magnifySize: 300,
- magnificationLevel: 3
- };
- magnify.setConfiguration(magnifyConfig);
-
- if (DCMViewerManager.settings && DCMViewerManager.settings.public && DCMViewerManager.settings.public.defaultGestures) {
- gestures.zoomTouchPinch = DCMViewerManager.settings.public.defaultGestures.zoomTouchPinch || gestures.zoomTouchPinch;
- gestures.stackScrollMultiTouch = DCMViewerManager.settings.public.defaultGestures.stackScrollMultiTouch || gestures.stackScrollMultiTouch;
- gestures.panMultiTouch = DCMViewerManager.settings.public.defaultGestures.panMultiTouch || gestures.panMultiTouch;
- gestures.doubleTapZoom = DCMViewerManager.settings.public.defaultGestures.doubleTapZoom || gestures.doubleTapZoom;
- }
-
- // Set number of fingers to stack scroll
- if (gestures.stackScrollMultiTouch.enabled === true && gestures.stackScrollMultiTouch.numPointers) {
- const stackScrollMultiTouchConfig = {
- testPointers(eventData) {
- return (eventData.numPointers === gestures.stackScrollMultiTouch.numPointers);
- }
- };
- cornerstoneTools.stackScrollMultiTouch.setConfiguration(stackScrollMultiTouchConfig);
- }
-
- // Set number of fingers to pan
- if (gestures.panMultiTouch.enabled === true && gestures.panMultiTouch.numPointers) {
- const panMultiTouchConfig = {
- testPointers(eventData) {
- return (eventData.numPointers === gestures.panMultiTouch.numPointers);
- }
- };
- cornerstoneTools.panMultiTouch.setConfiguration(panMultiTouchConfig);
- }
- },
- /**
- * This function searches an object to return the keys that contain a specific value
- *
- * @param object {object} The object to be searched
- * @param value The value to be found
- *
- * @returns {array} The keys for which the object has the specified value
- */
- getKeysByValue(object, value) {
- // http://stackoverflow.com/questions/9907419/javascript-object-get-key-by-value
- return Object.keys(object).filter(key => object[key] === value);
- },
-
- configureLoadProcess() {
- function handleLoadProgress(e) {
- const eventData = e.detail;
- const viewportIndices = toolManager.getKeysByValue(window.ViewportLoading, eventData.imageId);
- viewportIndices.forEach((viewportIndex) => {
- DCMViewerManager.sessions[`CornerstoneLoadProgress${viewportIndex}`] = eventData.percentComplete;
- });
-
- const encodedId = Utils.string.encodeId(eventData.imageId);
- DCMViewerManager.sessions[`CornerstoneThumbnailLoadProgress${encodedId}`] = eventData.percentComplete;
- }
-
- cornerstone.events.removeEventListener('cornerstoneimageloadprogress', handleLoadProgress);
- cornerstone.events.addEventListener('cornerstoneimageloadprogress', handleLoadProgress);
- },
-
- setGestures(newGestures) {
- gestures = newGestures;
- },
-
- getGestures() {
- return gestures;
- },
-
- addTool(name, base) {
- tools[name] = base;
- },
-
- getTools() {
- return tools;
- },
-
- setToolDefaultStates(states) {
- toolDefaultStates = states;
- },
-
- getToolDefaultStates() {
- return toolDefaultStates;
- },
-
- setActiveToolForElement(toolId, element, button) {
- const canvases = $(element).find('canvas');
- if (element.classList.contains('empty') || !canvases.length) {
- return;
- }
-
- // If button is not defined, we should consider it left
- if (!button) {
- button = 'left';
- }
-
- // First, deactivate the current active tool
- tools[activeTool.left].mouse.deactivate(element, 1); // 1 means left mouse button
- tools[activeTool.middle].mouse.deactivate(element, 2); // 2 means middle mouse button
- tools[activeTool.right].mouse.deactivate(element, 4); // 3 means right mouse button
-
- if (tools[activeTool.left].touch) {
- tools[activeTool.left].touch.deactivate(element);
- }
-
- if (tools[activeTool.right].multiTouch) {
- tools[activeTool.right].multiTouch.disable(element);
- }
-
- // Enable tools based on their default states
- Object.keys(toolDefaultStates).forEach((action) => {
- const relevantTools = toolDefaultStates[action];
- if (!relevantTools || !relevantTools.length || action === 'disabledToolButtons') return;
- relevantTools.forEach((toolType) => {
- // the currently active tool has already been deactivated and can be skipped
- if (action === 'deactivate' &&
- (toolType === activeTool.left ||
- toolType === activeTool.middle ||
- toolType === activeTool.right)) {
- return;
- }
-
- tools[toolType].mouse[action](
- element,
- (action === 'activate' || action === 'deactivate' ? 1 : undefined)
- );
-
- if (tools[toolType].touch) {
- tools[toolType].touch[action](element);
- }
-
- if (tools[toolType].multiTouch) {
- tools[toolType].multiTouch[action](element);
- }
- });
- });
-
- // Get the stack toolData
- const toolData = cornerstoneTools.getToolState(element, 'stack');
- if (!toolData || !toolData.data || !toolData.data.length) {
- return;
- }
-
- // Get the imageIds for this element
- const { imageIds } = toolData.data[0];
-
- // Get the mouse button tools
- let newToolIdLeft = activeTool.left;
- if (button === 'left') {
- newToolIdLeft = toolId;
- }
-
- const newCornerstoneToolLeft = tools[newToolIdLeft]; // left mouse tool is used for touch as well
-
- let newToolIdMiddle = activeTool.middle;
- if (button === 'middle') {
- newToolIdMiddle = toolId;
- }
-
- const newCornerstoneToolMiddle = cornerstoneTools[newToolIdMiddle];
-
- let newToolIdRight = activeTool.right;
- if (button === 'right') {
- newToolIdRight = toolId;
- }
-
- const newCornerstoneToolRight = tools[newToolIdRight]; // right mouse tool is used for multi-touch as well
-
- // Deactivate scroll wheel tools
- cornerstoneTools.zoomWheel.deactivate(element);
- cornerstoneTools.stackScrollWheel.deactivate(element);
- cornerstoneTools.panMultiTouch.disable(element);
- cornerstoneTools.zoomTouchPinch.disable(element);
- cornerstoneTools.stackScrollMultiTouch.disable(element);
- cornerstoneTools.doubleTapZoom.disable(element);
-
- // Reactivate the relevant scrollwheel tool for this element
- if (imageIds.length > 1) {
- // scroll is the default tool for middle mouse wheel for stacks
- cornerstoneTools.stackScrollWheel.activate(element);
-
- // 3 or more finger stack scroll
- if (gestures.stackScrollMultiTouch.enabled === true && gestures.stackScrollMultiTouch.numPointers >= 3) {
- const stackScrollMultiTouchConfig = {
- testPointers(eventData) {
- return (eventData.numPointers === gestures.stackScrollMultiTouch.numPointers);
- }
- };
- cornerstoneTools.stackScrollMultiTouch.setConfiguration(stackScrollMultiTouchConfig);
- cornerstoneTools.stackScrollMultiTouch.activate(element);
- }
- } else {
- // zoom is the default tool for middle mouse wheel for single images (non stacks)
- cornerstoneTools.zoomWheel.activate(element);
- }
-
- // 3 or more finger pan
- if (gestures.panMultiTouch.enabled === true && gestures.panMultiTouch.numPointers >= 3) {
- const panMultiTouchConfig = {
- testPointers(eventData) {
- return (eventData.numPointers === gestures.panMultiTouch.numPointers);
- }
- };
- cornerstoneTools.panMultiTouch.setConfiguration(panMultiTouchConfig);
- cornerstoneTools.panMultiTouch.activate(element);
- }
-
- // TODO: Remove this messy approach for adding synchronizer when necessary.
- let leftToolSynchronizer;
- if (newToolIdLeft === 'crosshairs') {
- const currentFrameOfReferenceUID = getFrameOfReferenceUID(element);
- if (currentFrameOfReferenceUID) {
- updateCrosshairsSynchronizer(currentFrameOfReferenceUID);
- leftToolSynchronizer = crosshairsSynchronizers.synchronizers[currentFrameOfReferenceUID];
- }
-
- if (newToolIdLeft === newToolIdMiddle && newToolIdMiddle === newToolIdRight) {
- newCornerstoneToolRight.mouse.activate(element, 7); // 7 means left mouse button, right mouse button and middle mouse button
- } else if (newToolIdLeft === newToolIdMiddle) {
- newCornerstoneToolMiddle.activate(element, 3); // 3 means left mouse button and middle mouse button
- newCornerstoneToolRight.mouse.activate(element, 4); // 4 means right mouse button
- } else if (newToolIdMiddle === newToolIdRight) {
- newCornerstoneToolRight.mouse.activate(element, 6); // 6 means right mouse button and middle mouse button
- newCornerstoneToolLeft.mouse.activate(element, 1, leftToolSynchronizer); // 1 means left mouse button
- } else if (newToolIdLeft === newToolIdRight) {
- newCornerstoneToolMiddle.activate(element, 2); // 2 means middle mouse button
- newCornerstoneToolRight.mouse.activate(element, 5); // 5 means left mouse button and right mouse button
- } else {
- newCornerstoneToolLeft.mouse.activate(element, 1, leftToolSynchronizer); // 1 means left mouse button
- newCornerstoneToolMiddle.activate(element, 2); // 2 means middle mouse button
- newCornerstoneToolRight.mouse.activate(element, 4); // 4 means right mouse button
- }
- } else if (newToolIdLeft === newToolIdMiddle && newToolIdMiddle === newToolIdRight) {
- newCornerstoneToolRight.mouse.activate(element, 7); // 7 means left mouse button, right mouse button and middle mouse button
- } else if (newToolIdLeft === newToolIdMiddle) {
- newCornerstoneToolMiddle.activate(element, 3); // 3 means left mouse button and middle mouse button
- newCornerstoneToolRight.mouse.activate(element, 4); // 4 means right mouse button
- } else if (newToolIdMiddle === newToolIdRight) {
- newCornerstoneToolRight.mouse.activate(element, 6); // 6 means right mouse button and middle mouse button
- newCornerstoneToolLeft.mouse.activate(element, 1); // 1 means left mouse button
- } else if (newToolIdLeft === newToolIdRight) {
- newCornerstoneToolMiddle.activate(element, 2); // 2 means middle mouse button
- newCornerstoneToolRight.mouse.activate(element, 5); // 5 means left mouse button and right mouse button
- } else {
- setTimeout(() => newCornerstoneToolLeft.mouse.activate(element, 1));
- // >>>> TODO Find out why it's working only with a timeout
- // newCornerstoneToolLeft.mouse.activate(element, 1); // 1 means left mouse button
- newCornerstoneToolMiddle.activate(element, 2); // 2 means middle mouse button
- newCornerstoneToolRight.mouse.activate(element, 4); // 4 means right mouse button
- }
-
- // One finger touch
- if (newCornerstoneToolLeft.touch) {
- if (leftToolSynchronizer) {
- newCornerstoneToolLeft.touch.activate(element, leftToolSynchronizer);
- } else {
- newCornerstoneToolLeft.touch.activate(element);
- }
- }
-
- // Two finger swipe
- const twoFingerMultiTouchConfig = {
- testPointers(eventData) {
- return (eventData.numPointers === 2);
- }
- };
- if (newCornerstoneToolRight.multiTouch) {
- newCornerstoneToolRight.multiTouch.setConfiguration(twoFingerMultiTouchConfig);
- newCornerstoneToolRight.multiTouch.activate(element);
- } else if (gestures.panMultiTouch.enabled === true && gestures.panMultiTouch.numPointers === 2) {
- cornerstoneTools.panMultiTouch.setConfiguration(twoFingerMultiTouchConfig);
- cornerstoneTools.panMultiTouch.activate(element);
- } else if (gestures.stackScrollMultiTouch.enabled === true && gestures.stackScrollMultiTouch.numPointers === 2) {
- cornerstoneTools.stackScrollMultiTouch.setConfiguration(twoFingerMultiTouchConfig);
- cornerstoneTools.stackScrollMultiTouch.activate(element);
- }
-
- // Two finger pinch
- if (gestures.zoomTouchPinch.enabled === true) {
- cornerstoneTools.zoomTouchPinch.activate(element);
- }
-
- // Double Tap
- if (gestures.doubleTapZoom.enabled === true) {
- cornerstoneTools.doubleTapZoom.activate(element);
- }
- },
-
- setActiveTool(toolId, elements, button) {
- if (!initialized) {
- toolManager.init();
- }
-
- let $elements;
- if (!elements || !elements.length) {
- $elements = $('.imageViewerViewport');
- } else {
- $elements = $(elements);
- }
-
- const checkElementEnabled = function (allElementsEnabled, element) {
- try {
- cornerstone.getEnabledElement(element);
-
- return allElementsEnabled;
- } catch (error) {
- return true;
- }
- };
-
- if (!activeTool) {
- activeTool = defaultTool;
- }
-
- // If button is not defined, we should consider it left
- if (!button) {
- button = 'left';
- }
-
- const activeToolId = activeTool[button];
-
- const dialog = document.getElementById('textMarkerOptionsDialog');
- if (dialog) {
- if (toolId === 'spine' && activeToolId !== 'spine' && dialog.getAttribute('open') !== 'open') {
- dialog.show();
- } else if (activeToolId !== 'spine' && dialog.getAttribute('open') === 'open') {
- dialog.close();
- }
- }
-
- if (!toolId) {
- toolId = this.getDefaultTool(button);
- }
-
- // Otherwise, set the active tool for all viewport elements
- $elements.each((index, element) => {
- if (checkElementEnabled(element) === false) {
- return;
- }
-
- toolManager.setActiveToolForElement(toolId, element, button);
- });
-
- activeTool[button] = toolId;
-
- // Enable reactivity
- DCMViewerManager.sessions.ToolManagerActiveToolUpdated = RandomID();
- },
-
- getNearbyToolData(element, coords, toolTypes) {
- const allTools = this.getTools();
- const touchDevice = isTouchDevice();
- const nearbyTool = {};
- let pointNearTool = false;
-
- toolTypes.forEach((toolType) => {
- const toolData = cornerstoneTools.getToolState(element, toolType);
- if (!toolData) {
- return;
- }
-
- toolData.data.forEach((data, index) => {
- let toolInterfaceName = toolType;
- let toolInterface;
-
- // Edge cases where the tool is not the same as the typeName
- if (toolType === 'simpleAngle') {
- toolInterfaceName = 'angle';
- } else if (toolType === 'arrowAnnotate') {
- toolInterfaceName = 'annotate';
- }
-
- if (touchDevice) {
- toolInterface = allTools[toolInterfaceName].touch;
- } else {
- toolInterface = allTools[toolInterfaceName].mouse;
- }
-
- if (toolInterface.pointNearTool(element, data, coords)) {
- pointNearTool = true;
- nearbyTool.tool = data;
- nearbyTool.index = index;
- nearbyTool.toolType = toolType;
- }
- });
-
- if (pointNearTool) {
- return false;
- }
- });
-
- return pointNearTool ? nearbyTool : undefined;
- },
-
- getActiveTool(button) {
- if (!initialized) {
- toolManager.init();
- }
-
- // If activeTool is not defined, we should set as defaultTool
- if (!activeTool) {
- activeTool = defaultTool;
- }
-
- // If button is not defined, we should consider it left
- if (!button) {
- button = 'left';
- }
-
- return activeTool[button];
- },
-
- setDefaultTool(tool, button) {
- // If button is not defined, we should consider it left
- if (!button) {
- button = 'left';
- }
-
- defaultTool[button] = tool;
- },
-
- getDefaultTool(button) {
- // If button is not defined, we should consider it left
- if (!button) {
- button = 'left';
- }
-
- return defaultTool[button];
- },
-
- setConfigureTools(configureTools) {
- if (typeof configureTools === 'function') {
- this.configureTools = configureTools;
- }
- },
-
- activateCommandButton(button) {
- const activeCommandButtons = DCMViewerManager.sessions.ToolManagerActiveCommandButtons || [];
-
- if (activeCommandButtons.indexOf(button) === -1) {
- activeCommandButtons.push(button);
-
- DCMViewerManager.sessions.ToolManagerActiveCommandButtons = activeCommandButtons;
- }
- },
-
- deactivateCommandButton(button) {
- const activeCommandButtons = DCMViewerManager.sessions.ToolManagerActiveCommandButtons || [];
- const index = activeCommandButtons.indexOf(button);
-
- if (index !== -1) {
- activeCommandButtons.splice(index, 1);
- DCMViewerManager.sessions.ToolManagerActiveCommandButtons = activeCommandButtons;
- }
- }
-};
diff --git a/src/lib/viewerbase/updateCrosshairsSynchronizer.js b/src/lib/viewerbase/updateCrosshairsSynchronizer.js
deleted file mode 100644
index ed23790..0000000
--- a/src/lib/viewerbase/updateCrosshairsSynchronizer.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import $ from 'jquery';
-import { cornerstoneTools } from '../cornerstonejs';
-import { getFrameOfReferenceUID } from './getFrameOfReferenceUID';
-import { crosshairsSynchronizers } from './crosshairsSynchronizers';
-
-/**
- * This function is used to maintain the updateImageSynchronizers
- * that are using in the Crosshair tool. The function creates
- * (and destroys any currently existing) a new synchronizer for the given
- * frame of reference. It then searches for other viewports that share the same
- * frame of reference, and adds those to the synchronizer. These viewports
- * will now function together when the Crosshair tool is used.
- *
- * @param currentFrameOfReferenceUID
- */
-export function updateCrosshairsSynchronizer(currentFrameOfReferenceUID) {
- // Check if an old synchronizer exists, and if it does, destroy it
- // If not, create a new one
- let synchronizer = crosshairsSynchronizers.synchronizers[currentFrameOfReferenceUID];
- if (synchronizer) {
- // If it already exists, remove all source & target elements
- synchronizer.destroy();
- } else {
- // Create a new synchronizer
- crosshairsSynchronizers.synchronizers[currentFrameOfReferenceUID] = new cornerstoneTools.Synchronizer('cornerstonenewimage', cornerstoneTools.updateImageSynchronizer);
- synchronizer = crosshairsSynchronizers.synchronizers[currentFrameOfReferenceUID];
- }
-
- // Add all elements that stem from the same frame of reference
- $('.imageViewerViewport').each((index, element) => {
- const frameOfReferenceUID = getFrameOfReferenceUID(element);
- if (currentFrameOfReferenceUID !== frameOfReferenceUID) {
- return;
- }
- synchronizer.add(element);
- });
-}
diff --git a/src/lib/viewerbase/updateOrientationMarkers.js b/src/lib/viewerbase/updateOrientationMarkers.js
deleted file mode 100644
index c38fb36..0000000
--- a/src/lib/viewerbase/updateOrientationMarkers.js
+++ /dev/null
@@ -1,65 +0,0 @@
-import $ from 'jquery';
-import { cornerstone, cornerstoneTools } from '../../lib/cornerstonejs';
-
-/**
- * Updates the orientation labels on a Cornerstone-enabled Viewport element
- * when the viewport settings change (e.g. when a horizontal flip or a rotation occurs)
- *
- * @param element The DOM element of the Cornerstone viewport
- * optional
- * @param viewport The current viewport
- */
-export function updateOrientationMarkers(element, viewport) {
- // Get the current viewport settings
- if (!viewport) {
- viewport = cornerstone.getViewport(element);
- }
-
- // Updates the orientation labels on the viewport
- const enabledElement = cornerstone.getEnabledElement(element);
- const imagePlane = cornerstone.metaData.get('imagePlane', enabledElement.image.imageId);
-
- if (!imagePlane || !imagePlane.rowCosines || !imagePlane.columnCosines) {
- return;
- }
-
- const rowString = cornerstoneTools.orientation.getOrientationString(imagePlane.rowCosines);
- const columnString = cornerstoneTools.orientation.getOrientationString(imagePlane.columnCosines);
- const oppositeRowString = cornerstoneTools.orientation.invertOrientationString(rowString);
- const oppositeColumnString = cornerstoneTools.orientation.invertOrientationString(columnString);
-
- const markers = {
- top: oppositeColumnString,
- left: oppositeRowString
- };
-
- // If any vertical or horizontal flips are applied, change the orientation strings ahead of
- // the rotation applications
- if (viewport.vflip) {
- markers.top = cornerstoneTools.orientation.invertOrientationString(markers.top);
- }
-
- if (viewport.hflip) {
- markers.left = cornerstoneTools.orientation.invertOrientationString(markers.left);
- }
-
- // Get the viewport orientation marker DOM elements
- const topMarker = $('.topMid.orientationMarker');
- const leftMarker = $('.leftMid.orientationMarker');
-
- // Swap the labels accordingly if the viewport has been rotated
- // This could be done in a more complex way for intermediate rotation values (e.g. 45 degrees)
- if (viewport.rotation === 90 || viewport.rotation === -270) {
- topMarker.text(markers.left);
- leftMarker.text(cornerstoneTools.orientation.invertOrientationString(markers.top));
- } else if (viewport.rotation === -90 || viewport.rotation === 270) {
- topMarker.text(cornerstoneTools.orientation.invertOrientationString(markers.left));
- leftMarker.text(markers.top);
- } else if (viewport.rotation === 180 || viewport.rotation === -180) {
- topMarker.text(cornerstoneTools.orientation.invertOrientationString(markers.top));
- leftMarker.text(cornerstoneTools.orientation.invertOrientationString(markers.left));
- } else {
- topMarker.text(markers.top);
- leftMarker.text(markers.left);
- }
-}
diff --git a/src/lib/viewerbase/viewportOverlayUtils.js b/src/lib/viewerbase/viewportOverlayUtils.js
deleted file mode 100644
index d95224e..0000000
--- a/src/lib/viewerbase/viewportOverlayUtils.js
+++ /dev/null
@@ -1,101 +0,0 @@
-import { cornerstone } from '../../lib/cornerstonejs';
-import { getElementIfNotEmpty } from './getElementIfNotEmpty';
-
-const getPatient = function (property) {
- if (!this.imageId) {
- return false;
- }
-
- const patient = cornerstone.metaData.get('patient', this.imageId);
- if (!patient) {
- return '';
- }
-
- return patient[property];
-};
-
-const getStudy = function (property) {
- if (!this.imageId) {
- return false;
- }
-
- const study = cornerstone.metaData.get('study', this.imageId);
- if (!study) {
- return '';
- }
-
- return study[property];
-};
-
-const getSeries = function (property) {
- if (!this.imageId) {
- return false;
- }
-
- const series = cornerstone.metaData.get('series', this.imageId);
- if (!series) {
- return '';
- }
-
- return series[property];
-};
-
-const getInstance = function (property) {
- if (!this.imageId) {
- return false;
- }
-
- const instance = cornerstone.metaData.get('instance', this.imageId);
- if (!instance) {
- return '';
- }
-
- return instance[property];
-};
-
-const getTagDisplay = function (property) {
- if (!this.imageId) {
- return false;
- }
-
- const instance = cornerstone.metaData.get('tagDisplay', this.imageId);
- if (!instance) {
- return '';
- }
-
- return instance[property];
-};
-
-const getImage = function (viewportIndex) {
- const element = getElementIfNotEmpty(viewportIndex);
- if (!element) {
- return false;
- }
-
- let enabledElement;
- try {
- enabledElement = cornerstone.getEnabledElement(element);
- } catch (error) {
- return false;
- }
-
- if (!enabledElement || !enabledElement.image) {
- return false;
- }
-
- return enabledElement.image;
-};
-
-const formatDateTime = (date, time) => `${date} ${time}`;
-
-const viewportOverlayUtils = {
- getPatient,
- getStudy,
- getSeries,
- getInstance,
- getTagDisplay,
- getImage,
- formatDateTime
-};
-
-export { viewportOverlayUtils };
diff --git a/src/lib/viewerbase/viewportUtils.js b/src/lib/viewerbase/viewportUtils.js
deleted file mode 100644
index 0aef20f..0000000
--- a/src/lib/viewerbase/viewportUtils.js
+++ /dev/null
@@ -1,416 +0,0 @@
-import $ from 'jquery';
-import _ from 'underscore';
-import { cornerstone, cornerstoneTools } from '../cornerstonejs';
-import { DCMViewerManager } from '../DCMViewerManager';
-import { DCMViewerLog } from '../DCMViewerLog';
-import { updateOrientationMarkers } from './updateOrientationMarkers';
-import { getInstanceClassDefaultViewport } from './instanceClassSpecificViewport';
-import { DCMViewer } from '../viewerMain';
-import { captureImageDialog } from './captureImageDialog';
-
-/**
- * Get a cornerstone enabledElement for a DOM Element
- * @param {DOMElement} element Element to get the enabledElement from Cornerstone
- * @return {Object} Cornerstone's enabledElement object for the given
- * element or undefined if the element is not enabled
- */
-const getEnabledElement = (element) => {
- let enabledElement;
-
- try {
- enabledElement = cornerstone.getEnabledElement(element);
- } catch (error) {
- DCMViewerLog.warn(error);
- }
-
- return enabledElement;
-};
-
-/**
- * Get the active viewport element. It uses activeViewport Session Variable
- * @return {DOMElement} DOMElement of the current active viewport
- */
-const getActiveViewportElement = () => {
- const viewportIndex = DCMViewerManager.sessions.activeViewport || 0;
- return $('.imageViewerViewport').get(viewportIndex);
-};
-
-/**
- * Get a cornerstone enabledElement for the Active Viewport Element
- * @return {Object} Cornerstone's enabledElement object for the active
- * viewport element or undefined if the element
- * is not enabled
- */
-const getEnabledElementForActiveElement = () => {
- const activeViewportElement = getActiveViewportElement();
- const enabledElement = getEnabledElement(activeViewportElement);
-
- return enabledElement;
-};
-
-const getAnnotationTools = () => ['length', 'probe', 'simpleAngle', 'arrowAnnotate', 'ellipticalRoi', 'rectangleRoi'];
-
-const toggleAnnotations = (viewportElement, toggle) => {
- const action = toggle ? 'enable' : 'disable';
- const annotationTools = getAnnotationTools();
- annotationTools.forEach(tool => cornerstoneTools[tool][action](viewportElement));
-};
-
-const zoomIn = () => {
- const element = getActiveViewportElement();
- if (!element) {
- return;
- }
-
- const viewport = cornerstone.getViewport(element);
- const scaleIncrement = 0.15;
- const maximumScale = 10;
- viewport.scale = Math.min(viewport.scale + scaleIncrement, maximumScale);
- cornerstone.setViewport(element, viewport);
-};
-
-const zoomOut = () => {
- const element = getActiveViewportElement();
- if (!element) {
- return;
- }
-
- const viewport = cornerstone.getViewport(element);
- const scaleIncrement = 0.15;
- const minimumScale = 0.05;
- viewport.scale = Math.max(viewport.scale - scaleIncrement, minimumScale);
- cornerstone.setViewport(element, viewport);
-};
-
-const zoomToFit = () => {
- const element = getActiveViewportElement();
- if (!element) {
- return;
- }
-
- cornerstone.fitToWindow(element);
-};
-
-const rotateL = () => {
- const element = getActiveViewportElement();
- if (!element) {
- return;
- }
-
- const viewport = cornerstone.getViewport(element);
- viewport.rotation -= 90;
- cornerstone.setViewport(element, viewport);
- updateOrientationMarkers(element, viewport);
-};
-
-const rotateR = () => {
- const element = getActiveViewportElement();
- if (!element) {
- return;
- }
-
- const viewport = cornerstone.getViewport(element);
- viewport.rotation += 90;
- cornerstone.setViewport(element, viewport);
- updateOrientationMarkers(element, viewport);
-};
-
-const invert = () => {
- const element = getActiveViewportElement();
- if (!element) {
- return;
- }
-
- const viewport = cornerstone.getViewport(element);
- viewport.invert = (viewport.invert === false);
- cornerstone.setViewport(element, viewport);
-};
-
-const flipV = () => {
- const element = getActiveViewportElement();
- const viewport = cornerstone.getViewport(element);
- viewport.vflip = (viewport.vflip === false);
- cornerstone.setViewport(element, viewport);
- updateOrientationMarkers(element, viewport);
-};
-
-const flipH = () => {
- const element = getActiveViewportElement();
- const viewport = cornerstone.getViewport(element);
- viewport.hflip = (viewport.hflip === false);
- cornerstone.setViewport(element, viewport);
- updateOrientationMarkers(element, viewport);
-};
-
-const resetViewportWithElement = (element) => {
- const viewport = cornerstone.getViewport(element);
- const enabledElement = cornerstone.getEnabledElement(element);
- if (enabledElement.fitToWindow === false) {
- const { imageId } = enabledElement.image;
- const instance = cornerstone.metaData.get('instance', imageId);
-
- enabledElement.viewport = cornerstone.getDefaultViewport(enabledElement.canvas, enabledElement.image);
-
- const instanceClassDefaultViewport = getInstanceClassDefaultViewport(instance, enabledElement, imageId);
- cornerstone.setViewport(element, instanceClassDefaultViewport);
- } else {
- cornerstone.reset(element);
- }
-
- updateOrientationMarkers(element, viewport);
-};
-
-const resetViewport = (viewportIndex = null) => {
- if (viewportIndex === null) {
- resetViewportWithElement(getActiveViewportElement());
- } else if (viewportIndex === 'all') {
- $('.imageViewerViewport').each((index, element) => {
- resetViewportWithElement(element);
- });
- } else {
- resetViewportWithElement($('.imageViewerViewport').get(viewportIndex));
- }
-};
-
-const clearTools = () => {
- const element = getActiveViewportElement();
- const toolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager;
- toolStateManager.clear(element);
- cornerstone.updateImage(element);
-};
-
-const toggleCaptureImageDialog = () => {
- captureImageDialog.show();
-};
-
-const linkStackScroll = () => {
- const synchronizer = DCMViewerManager.stackImagePositionOffsetSynchronizer;
-
- if (!synchronizer) {
- return;
- }
-
- if (synchronizer.isActive()) {
- synchronizer.deactivate();
- } else {
- synchronizer.activate();
- }
-};
-
-// This function was originally defined alone inside client/lib/toggleDialog.js
-// and has been moved here to avoid circular dependency issues.
-const toggleDialog = (element, closeAction) => {
- const $element = $(element);
- if ($element.is('dialog')) {
- if (element.hasAttribute('open')) {
- if (closeAction) {
- closeAction();
- }
-
- element.close();
- } else {
- element.show();
- }
- } else {
- const isClosed = $element.hasClass('dialog-open');
- $element.toggleClass('dialog-closed', isClosed);
- $element.toggleClass('dialog-open', !isClosed);
- }
-};
-
-// Check if the clip is playing on the active viewport
-const isPlaying = () => {
- // Create a dependency on LayoutManagerUpdated and UpdateCINE session
- // DCMViewerManager.sessions.UpdateCINE;
- // DCMViewerManager.sessions.LayoutManagerUpdated;
-
- // Get the viewport element and its current playClip tool state
- const element = getActiveViewportElement();
- // Empty Elements throws cornerstore exception
- if (!element || !$(element).find('canvas').length) {
- return;
- }
-
- const toolState = cornerstoneTools.getToolState(element, 'playClip');
-
- // Stop here if the tool state is not defined yet
- if (!toolState) {
- return false;
- }
-
- // Get the clip state
- const clipState = toolState.data[0];
-
- if (clipState) {
- // Return true if the clip is playing
- return !_.isUndefined(clipState.intervalId);
- }
-
- return false;
-};
-
-// Toggle the play/stop state for the cornerstone clip tool
-const toggleCinePlay = () => {
- // Get the active viewport element
- const element = getActiveViewportElement();
-
- // Check if it's playing the clip to toggle it
- if (isPlaying()) {
- cornerstoneTools.stopClip(element);
- } else {
- cornerstoneTools.playClip(element);
- }
-
- // Update the UpdateCINE session property
- DCMViewerManager.sessions.UpdateCINE = Math.random();
-};
-
-// Stop clips on all non-empty elements
-const stopAllClips = () => {
- const elements = $('.imageViewerViewport').not('.empty');
- elements.each((index, element) => {
- if ($(element).find('canvas').length) {
- cornerstoneTools.stopClip(element);
- }
- });
-};
-
-// Show/hide the CINE dialog
-const toggleCineDialog = () => {
- const dialog = document.getElementById('cineDialog');
-
- toggleDialog(dialog, stopAllClips);
- DCMViewerManager.sessions.UpdateCINE = Math.random();
-};
-
-const stopActiveClip = () => {
- const activeElement = getActiveViewportElement();
-
- if ($(activeElement).find('canvas').length) {
- cornerstoneTools.stopClip(activeElement);
- }
-};
-
-const toggleDownloadDialog = () => {
- stopActiveClip();
- const $dialog = $('#imageDownloadDialog');
- if ($dialog.length) {
- $dialog.find('.close:first').click();
- } else {
- DCMViewer.ui.showDialog('imageDownloadDialog');
- }
-};
-
-const isDownloadEnabled = () => {
- const activeViewport = getActiveViewportElement();
-
- return !!activeViewport;
-};
-
-// Check if a study has multiple frames
-const hasMultipleFrames = () => {
- // Its called everytime active viewport and/or layout change
- // DCMViewerManager.sessions.activeViewport;
- // DCMViewerManager.sessions.LayoutManagerUpdated;
-
- const activeViewport = getActiveViewportElement();
-
- // No active viewport yet: disable button
- if (!activeViewport || !$(activeViewport).find('canvas').length) {
- return true;
- }
-
- // Get images in the stack
- const stackToolData = cornerstoneTools.getToolState(activeViewport, 'stack');
-
- // No images in the stack, so disable button
- if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {
- return true;
- }
-
- // Get number of images in the stack
- const stackData = stackToolData.data[0];
- const nImages = stackData.imageIds && stackData.imageIds.length ? stackData.imageIds.length : 1;
-
- // Stack has just one image, so disable button
- if (nImages === 1) {
- return true;
- }
-
- return false;
-};
-
-const isStackScrollLinkingDisabled = () => {
- let linkableViewportsCount = 0;
-
- // Its called everytime active viewport and/or layout change
- // DCMViewerManager.sessions.viewportActivated;
- // DCMViewerManager.sessions.LayoutManagerUpdated;
-
- const synchronizer = DCMViewerManager.stackImagePositionOffsetSynchronizer;
- if (synchronizer) {
- const linkableViewports = synchronizer.getLinkableViewports();
- linkableViewportsCount = linkableViewports.length;
- }
-
- return linkableViewportsCount <= 1;
-};
-
-const isStackScrollLinkingActive = () => {
- let isActive = true;
-
- // Its called everytime active viewport layout changes
- // DCMViewerManager.sessions.LayoutManagerUpdated;
-
- const synchronizer = DCMViewerManager.stackImagePositionOffsetSynchronizer;
- const syncedElements = _.pluck(synchronizer.syncedViewports, 'element');
- const $renderedViewports = $('.imageViewerViewport');
- $renderedViewports.each((index, element) => {
- if (!_.contains(syncedElements, element)) {
- isActive = false;
- }
- });
-
- return isActive;
-};
-
-// Create an event listener to update playing state when a clip stops playing
-window.addEventListener('cornerstonetoolsclipstopped', () => {
- // TODO: Add handler for session
- // DCMViewerManager.sessions.UpdateCINE = Math.random();
-});
-
-/**
- * Export functions inside viewportUtils namespace.
- */
-
-const viewportUtils = {
- getEnabledElementForActiveElement,
- getEnabledElement,
- getActiveViewportElement,
- zoomIn,
- zoomOut,
- zoomToFit,
- rotateL,
- rotateR,
- invert,
- flipV,
- flipH,
- resetViewport,
- clearTools,
- linkStackScroll,
- toggleAnnotations,
- toggleCaptureImageDialog,
- toggleDialog,
- toggleCinePlay,
- toggleCineDialog,
- toggleDownloadDialog,
- isPlaying,
- isDownloadEnabled,
- hasMultipleFrames,
- stopAllClips,
- isStackScrollLinkingDisabled,
- isStackScrollLinkingActive
-};
-
-export { viewportUtils };
diff --git a/src/main.js b/src/main.js
new file mode 100755
index 0000000..be86fea
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,19 @@
+import DICOMView from './views/DICOMView.vue';
+import generateFullUrl from './utils/generateFullUrl';
+import './sidebar';
+
+// Add MimeType Icon
+OC.MimeType._mimeTypeIcons['application/dicom'] = `${generateFullUrl(OC.filePath('dicomviewer', 'img', 'app.svg'))}`;
+
+OCA.Viewer.registerHandler({
+ id: 'dicom',
+
+ mimes: [
+ 'application/dicom',
+ 'application/dcm',
+ ],
+
+ component: DICOMView,
+
+ canCompare: true,
+});
diff --git a/src/package.json b/src/package.json
deleted file mode 100644
index f07bf48..0000000
--- a/src/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "name": "dicomviewer",
- "version": "1.2.5",
- "description": "Place this app in **nextcloud/apps/**",
- "scripts": {
- "lint": "echo TODO",
- "build": "webpack"
- },
- "author": "Aysel Afsar",
- "license": "AGPL-3.0-only",
- "devDependencies": {
- "babel-core": "^6.26.3",
- "babel-loader": "^7.1.5",
- "babel-preset-es2015": "^6.24.1",
- "clean-webpack-plugin": "^0.1.18",
- "copy-webpack-plugin": "^4.6.0",
- "css-loader": "^1.0.0",
- "eslint": "^4.16.0",
- "eslint-config-airbnb-base": "^12.1.0",
- "eslint-plugin-import": "^2.14.0",
- "handlebars": "^4.0.12",
- "handlebars-loader": "^1.7.0",
- "imports-loader": "^0.8.0",
- "style-loader": "^0.22.1",
- "vue-loader": "^15.9.3",
- "vue-template-compiler": "^2.6.12",
- "webpack": "^4.26.1",
- "webpack-cli": "^3.1.2"
- },
- "dependencies": {
- "bootstrap": "^4.1.3",
- "cornerstone-core": "^2.2.8",
- "cornerstone-math": "^0.1.7",
- "cornerstone-tools": "^2.4.0",
- "cornerstone-wado-image-loader": "^2.2.3",
- "dialog-polyfill": "^0.4.10",
- "dicom-parser": "^1.8.3",
- "hammerjs": "^2.0.8",
- "jquery": "^3.3.1",
- "jquery-hammerjs": "^2.0.0",
- "moment": "^2.29.4",
- "popper.js": "^1.14.6",
- "random-id": "^0.0.2",
- "underscore": "^1.13.1",
- "vue": "^2.6.12"
- }
-}
diff --git a/src/public.js b/src/public.js
new file mode 100644
index 0000000..4440389
--- /dev/null
+++ b/src/public.js
@@ -0,0 +1,25 @@
+import { generateUrl } from '@nextcloud/router';
+import isPublicPage from './utils/isPublicPage.js';
+import isDicom from './utils/isDicom.js'
+import getPublicShareToken from './utils/getPublicShareToken';
+import getPublicFileName from './utils/getPublicFileName';
+
+window.addEventListener('DOMContentLoaded', function() {
+ if (!isPublicPage() || !isDicom()) {
+ return;
+ }
+
+ // Support displaying single DICOM file on public
+ const previewElmt = document.getElementById('preview');
+ if (previewElmt) {
+ const shareToken = getPublicShareToken();
+ const fileName = getPublicFileName();
+ const dicomUrl = shareToken && window.location.protocol + '//' + window.location.host + generateUrl(`/apps/dicomviewer/publicdicomjson?file=${shareToken}|${fileName}`);
+ const viewerUrl = generateUrl(`/apps/dicomviewer/ncviewer/viewer/dicomjson?url=${dicomUrl}`);
+
+ const div = document.createElement('div');
+ div.style.marginTop = '10px';
+ div.innerHTML = ` ${' '+t('dicomviewer', 'View')+' '} `;
+ previewElmt.appendChild(div);
+ }
+});
diff --git a/src/components/sidebar/index.js b/src/sidebar.js
old mode 100644
new mode 100755
similarity index 94%
rename from src/components/sidebar/index.js
rename to src/sidebar.js
index 450540a..40977e9
--- a/src/components/sidebar/index.js
+++ b/src/sidebar.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import SidebarPreview from './views/SidebarPreview';
+import configureCodecs from './utils/configureCodecs';
Vue.prototype.t = t;
Vue.prototype.n = n;
@@ -10,6 +11,7 @@ let SidebarPreviewTabInstance = null;
window.addEventListener('DOMContentLoaded', function() {
if (OCA.Files && OCA.Files.Sidebar) {
+ configureCodecs();
OCA.Files.Sidebar.registerTab(new OCA.Files.Sidebar.Tab({
id: 'dicomviewer',
name: t('dicomviewer', 'DICOM'),
diff --git a/src/components/dicomViewer/configureCodecs.js b/src/utils/configureCodecs.js
old mode 100644
new mode 100755
similarity index 85%
rename from src/components/dicomViewer/configureCodecs.js
rename to src/utils/configureCodecs.js
index 48cc742..4936f04
--- a/src/components/dicomViewer/configureCodecs.js
+++ b/src/utils/configureCodecs.js
@@ -1,5 +1,5 @@
-import { cornerstone, cornerstoneWADOImageLoader } from '../../lib/cornerstonejs';
-import generateFullUrl from '../../lib/generateFullUrl';
+import { cornerstone, cornerstoneWADOImageLoader } from './cornerstonejs';
+import generateFullUrl from './generateFullUrl';
/**
* Configure cornerstone codecs and web workers
diff --git a/src/lib/cornerstonejs.js b/src/utils/cornerstonejs.js
old mode 100644
new mode 100755
similarity index 100%
rename from src/lib/cornerstonejs.js
rename to src/utils/cornerstonejs.js
diff --git a/src/lib/dicom/dataDictionary.js b/src/utils/dicom/dataDictionary.js
old mode 100644
new mode 100755
similarity index 100%
rename from src/lib/dicom/dataDictionary.js
rename to src/utils/dicom/dataDictionary.js
diff --git a/src/lib/dicom/getDICOMAttributes.js b/src/utils/dicom/getDICOMAttributes.js
old mode 100644
new mode 100755
similarity index 100%
rename from src/lib/dicom/getDICOMAttributes.js
rename to src/utils/dicom/getDICOMAttributes.js
diff --git a/src/lib/dicom/sopClassUids.js b/src/utils/dicom/sopClassUids.js
old mode 100644
new mode 100755
similarity index 100%
rename from src/lib/dicom/sopClassUids.js
rename to src/utils/dicom/sopClassUids.js
diff --git a/src/lib/generateFullUrl.js b/src/utils/generateFullUrl.js
old mode 100644
new mode 100755
similarity index 100%
rename from src/lib/generateFullUrl.js
rename to src/utils/generateFullUrl.js
diff --git a/src/utils/getPublicFileName.js b/src/utils/getPublicFileName.js
new file mode 100755
index 0000000..a3e25c6
--- /dev/null
+++ b/src/utils/getPublicFileName.js
@@ -0,0 +1,2 @@
+const fileNameElmt = document.getElementById('filename')
+export default () => fileNameElmt && fileNameElmt.value
diff --git a/src/utils/getPublicShareToken.js b/src/utils/getPublicShareToken.js
new file mode 100755
index 0000000..61bda64
--- /dev/null
+++ b/src/utils/getPublicShareToken.js
@@ -0,0 +1,2 @@
+const sharingTokenElmt = document.getElementById('sharingToken')
+export default () => sharingTokenElmt && sharingTokenElmt.value
diff --git a/src/utils/isDicom.js b/src/utils/isDicom.js
new file mode 100755
index 0000000..c2b4b62
--- /dev/null
+++ b/src/utils/isDicom.js
@@ -0,0 +1,2 @@
+const mimetypeElmt = document.getElementById('mimetype')
+export default () => mimetypeElmt && (mimetypeElmt.value === 'application/dicom' || mimetypeElmt.value === 'application/dcm')
diff --git a/src/utils/isPublicPage.js b/src/utils/isPublicPage.js
new file mode 100755
index 0000000..12b3c80
--- /dev/null
+++ b/src/utils/isPublicPage.js
@@ -0,0 +1,2 @@
+const isPublicElmt = document.getElementById('isPublic')
+export default () => !!(isPublicElmt && isPublicElmt.value === '1')
diff --git a/src/views/DICOMView.vue b/src/views/DICOMView.vue
new file mode 100755
index 0000000..61202e7
--- /dev/null
+++ b/src/views/DICOMView.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
diff --git a/src/components/sidebar/views/SidebarPreview.vue b/src/views/SidebarPreview.vue
old mode 100644
new mode 100755
similarity index 93%
rename from src/components/sidebar/views/SidebarPreview.vue
rename to src/views/SidebarPreview.vue
index 3786172..a6fb496
--- a/src/components/sidebar/views/SidebarPreview.vue
+++ b/src/views/SidebarPreview.vue
@@ -45,9 +45,8 @@