From 9a202cc12484da5db2673f590bb5b8d85482ef1e Mon Sep 17 00:00:00 2001 From: J H <2364004+Blu-J@users.noreply.github.com> Date: Wed, 27 Sep 2023 15:46:48 -0600 Subject: [PATCH] Refactor/patch db (#2415) * the only way to begin is by beginning * chore: Convert over 3444 migration * fix imports * wip * feat: convert volume * convert: system.rs * wip(convert): Setup * wip properties * wip notifications * wip * wip migration * wip init * wip auth/control * wip action * wip control * wiip 034 * wip 344 * wip some more versions converted * feat: Reserialize the version of the db * wip rest of the versions * wip s9pk/manifest * wip wifi * chore: net/keys * chore: net/dns * wip net/dhcp * wip manager manager-map * gut dependency errors * wip update/mod * detect breakages locally for updates * wip: manager/mod * wip: manager/health * wip: backup/target/mod * fix: Typo addresses * clean control.rs * fix system package id * switch to btreemap for now * config wip * wip manager/mod * install wip Co-authored-by: J H * chore: Update the last of the errors * feat: Change the prelude de to borrow * feat: Adding in some more things * chore: add to the prelude * chore: Small fixes * chore: Fixing the small errors * wip: Cleaning up check errors * wip: Fix some of the issues * chore: Fix setup * chore:fix version * chore: prelude, mod, http_reader * wip backup_bulk * chore: Last of the errors * upadte package.json * chore: changes needed for a build * chore: Removing some of the linting errors in the manager * chore: Some linting 101 * fix: Wrong order of who owns what * chore: Remove the unstable * chore: Remove the test in the todo * @dr-bonez did a refactoring on the backup * chore: Make sure that there can only be one override guard at a time * resolve most todos * wip: Add some more tracing to debug an error * wip: Use a mv instead of rename * wip: Revert some of the missing code segments found earlier * chore: Make the build * chore: Something about the lib looks like it iis broken * wip: More instrument and dev working * kill netdummy before creating it * better db analysis tools * fixes from testing * fix: Make add start the service * fix status after install * make wormhole * fix missing icon file * fix data url for icons * fix: Bad deser * bugfixes * fix: Backup * fix: Some of the restor * fix: Restoring works * update frontend patch-db types * hack it in (#2424) * hack it in * optimize * slightly cleaner * handle config pointers * dependency config errs * fix compat * cache docker * fix dependency expectation * fix dependency auto-config --------- Co-authored-by: Aiden McClelland Co-authored-by: Matt Hill Co-authored-by: J H Co-authored-by: Matt Hill --- .github/workflows/startos-iso.yaml | 5 + Makefile | 38 +- backend/Cargo.lock | 325 +- backend/Cargo.toml | 3 +- backend/src/action.rs | 24 +- backend/src/auth.rs | 38 +- backend/src/backup/backup_bulk.rs | 241 +- backend/src/backup/mod.rs | 112 +- backend/src/backup/os.rs | 10 +- backend/src/backup/restore.rs | 151 +- backend/src/backup/target/cifs.rs | 10 +- backend/src/backup/target/mod.rs | 18 +- backend/src/config/action.rs | 7 +- backend/src/config/mod.rs | 355 +- backend/src/config/spec.rs | 446 +- backend/src/config/util.rs | 4 +- backend/src/context/rpc.rs | 257 +- backend/src/control.rs | 228 +- backend/src/db/mod.rs | 171 +- backend/src/db/model.rs | 359 +- backend/src/db/package.rs | 91 +- backend/src/db/prelude.rs | 382 + backend/src/dependencies.rs | 1034 +- backend/src/error.rs | 4 +- backend/src/hostname.rs | 8 + backend/src/init.rs | 75 +- backend/src/install/cleanup.rs | 382 +- backend/src/install/mod.rs | 1081 +- backend/src/install/package-icon.png | Bin 0 -> 286500 bytes backend/src/install/progress.rs | 78 +- backend/src/install/update.rs | 89 +- backend/src/lib.rs | 2 +- backend/src/manager/health.rs | 176 +- backend/src/manager/manager_container.rs | 199 +- backend/src/manager/manager_map.rs | 43 +- backend/src/manager/manager_seed.rs | 1 - backend/src/manager/mod.rs | 338 +- backend/src/manager/start_stop.rs | 12 +- backend/src/marketplace.rs | 4 +- backend/src/migration.rs | 7 +- backend/src/net/dhcp.rs | 13 +- backend/src/net/dns.rs | 18 +- backend/src/net/interface.rs | 30 +- backend/src/net/keys.rs | 26 +- backend/src/net/tor.rs | 3 +- backend/src/net/wifi.rs | 64 +- backend/src/notifications.rs | 50 +- backend/src/os_install/mod.rs | 5 +- backend/src/prelude.rs | 6 + backend/src/procedure/docker.rs | 19 +- backend/src/procedure/mod.rs | 2 + backend/src/properties.rs | 21 +- backend/src/s9pk/manifest.rs | 14 +- backend/src/s9pk/mod.rs | 2 +- backend/src/setup.rs | 92 +- backend/src/sound.rs | 2 +- backend/src/status/health_check.rs | 2 +- backend/src/status/mod.rs | 28 +- backend/src/system.rs | 20 +- backend/src/update/mod.rs | 120 +- backend/src/util/config.rs | 7 +- backend/src/util/http_reader.rs | 2 +- backend/src/util/mod.rs | 6 +- backend/src/version/mod.rs | 186 +- backend/src/version/v0_3_0.rs | 37 - backend/src/version/v0_3_0_1.rs | 27 - backend/src/version/v0_3_0_2.rs | 27 - backend/src/version/v0_3_0_3.rs | 27 - backend/src/version/v0_3_1.rs | 28 - backend/src/version/v0_3_1_1.rs | 28 - backend/src/version/v0_3_1_2.rs | 28 - backend/src/version/v0_3_2.rs | 156 - backend/src/version/v0_3_2_1.rs | 26 - backend/src/version/v0_3_3.rs | 156 - backend/src/version/v0_3_4.rs | 175 +- backend/src/version/v0_3_4_1.rs | 7 +- backend/src/version/v0_3_4_2.rs | 7 +- backend/src/version/v0_3_4_3.rs | 15 +- backend/src/version/v0_3_4_4.rs | 32 +- backend/src/volume.rs | 11 +- build/lib/scripts/chroot-and-upgrade | 18 +- compress-uis.sh | 28 +- frontend/package-lock.json | 17478 +++------------- frontend/package.json | 4 +- .../apps-routes/app-list/app-list.page.html | 2 +- .../apps-routes/app-list/package-info.pipe.ts | 17 +- .../apps-routes/app-show/app-show.module.ts | 4 - .../apps-routes/app-show/app-show.page.html | 52 +- .../apps-routes/app-show/app-show.page.ts | 176 +- .../app-show-dependencies.component.ts | 2 +- .../app-show-status.component.ts | 6 +- .../app-show/pipes/to-dependencies.pipe.ts | 149 - .../app-show/pipes/to-status.pipe.ts | 15 - .../marketplace-show-controls.component.ts | 58 +- .../ui/src/app/pages/updates/updates.page.ts | 67 +- .../built-in/health/health.component.ts | 11 +- .../ui/src/app/services/api/api.fixures.ts | 11 +- .../ui/src/app/services/api/api.types.ts | 55 +- .../app/services/api/embassy-api.service.ts | 4 - .../services/api/embassy-live-api.service.ts | 6 - .../services/api/embassy-mock-api.service.ts | 17 - .../ui/src/app/services/api/mock-patch.ts | 10 +- .../ui/src/app/services/dep-error.service.ts | 211 + .../src/app/services/patch-db/data-model.ts | 48 +- .../services/pkg-status-rendering.service.ts | 31 +- .../projects/ui/src/app/util/dry-update.ts | 17 + .../ui/src/app/util/get-package-data.ts | 2 +- .../ui/src/app/util/get-package-info.ts | 8 +- libs/Cargo.lock | 305 +- libs/embassy_container_init/src/main.rs | 15 +- libs/helpers/src/lib.rs | 6 +- libs/js_engine/Cargo.toml | 4 +- libs/models/Cargo.toml | 7 +- libs/models/src/data_url.rs | 171 + libs/models/src/errors.rs | 42 +- .../models/src/{action_id.rs => id/action.rs} | 0 libs/models/src/id/address.rs | 59 + .../health_check.rs} | 0 libs/models/src/{image_id.rs => id/image.rs} | 0 .../src/{interface_id.rs => id/interface.rs} | 19 +- libs/models/src/{ => id}/invalid_id.rs | 0 libs/models/src/{id.rs => id/mod.rs} | 55 +- .../src/{package_id.rs => id/package.rs} | 19 +- .../models/src/{volume_id.rs => id/volume.rs} | 0 libs/models/src/lib.rs | 18 +- libs/models/src/mime.rs | 47 + libs/models/src/version.rs | 4 - patch-db | 2 +- system-images/compat/Cargo.lock | 478 +- system-images/compat/Cargo.toml | 1 + system-images/compat/src/config/mod.rs | 4 +- system-images/compat/src/config/rules.rs | 86 +- 132 files changed, 7641 insertions(+), 20541 deletions(-) create mode 100644 backend/src/db/prelude.rs create mode 100644 backend/src/install/package-icon.png create mode 100644 backend/src/prelude.rs delete mode 100644 backend/src/version/v0_3_0.rs delete mode 100644 backend/src/version/v0_3_0_1.rs delete mode 100644 backend/src/version/v0_3_0_2.rs delete mode 100644 backend/src/version/v0_3_0_3.rs delete mode 100644 backend/src/version/v0_3_1.rs delete mode 100644 backend/src/version/v0_3_1_1.rs delete mode 100644 backend/src/version/v0_3_1_2.rs delete mode 100644 backend/src/version/v0_3_2.rs delete mode 100644 backend/src/version/v0_3_2_1.rs delete mode 100644 backend/src/version/v0_3_3.rs delete mode 100644 frontend/projects/ui/src/app/pages/apps-routes/app-show/pipes/to-dependencies.pipe.ts delete mode 100644 frontend/projects/ui/src/app/pages/apps-routes/app-show/pipes/to-status.pipe.ts create mode 100644 frontend/projects/ui/src/app/services/dep-error.service.ts create mode 100644 frontend/projects/ui/src/app/util/dry-update.ts create mode 100644 libs/models/src/data_url.rs rename libs/models/src/{action_id.rs => id/action.rs} (100%) create mode 100644 libs/models/src/id/address.rs rename libs/models/src/{health_check_id.rs => id/health_check.rs} (100%) rename libs/models/src/{image_id.rs => id/image.rs} (100%) rename libs/models/src/{interface_id.rs => id/interface.rs} (61%) rename libs/models/src/{ => id}/invalid_id.rs (100%) rename libs/models/src/{id.rs => id/mod.rs} (53%) rename libs/models/src/{package_id.rs => id/package.rs} (73%) rename libs/models/src/{volume_id.rs => id/volume.rs} (100%) create mode 100644 libs/models/src/mime.rs diff --git a/.github/workflows/startos-iso.yaml b/.github/workflows/startos-iso.yaml index b495acf5b..c2e568d47 100644 --- a/.github/workflows/startos-iso.yaml +++ b/.github/workflows/startos-iso.yaml @@ -106,6 +106,11 @@ jobs: with: node-version: ${{ env.NODEJS_VERSION }} + - uses: actions/cache@v3 + with: + path: /var/lib/docker + key: ${{ runner.os }}-${{ matrix.platform }}-docker-cache + - name: Get npm cache directory id: npm-cache-dir run: | diff --git a/Makefile b/Makefile index 68ef34f68..a86168488 100644 --- a/Makefile +++ b/Makefile @@ -27,17 +27,24 @@ ifeq ($(REMOTE),) cp = cp -r $1 $2 ln = ln -sf $1 $2 else - mkdir = ssh $(REMOTE) 'sudo mkdir -p $1' - rm = ssh $(REMOTE) 'sudo rm -rf $1' - ln = ssh $(REMOTE) 'sudo ln -sf $1 $2' + ifeq ($(SSHPASS),) + ssh = ssh $(REMOTE) $1 + else + ssh = sshpass -p $(SSHPASS) ssh $(REMOTE) $1 + endif + mkdir = $(call ssh,'sudo mkdir -p $1') + rm = $(call ssh,'sudo rm -rf $1') + ln = $(call ssh,'sudo ln -sf $1 $2') define cp - $(TAR_BIN) --transform "s|^$1|x|" -czv -f- $1 | ssh $(REMOTE) "sudo tar --transform 's|^x|$2|' -xzv -f- -C /" + $(TAR_BIN) --transform "s|^$1|x|" -czv -f- $1 | $(call ssh,"sudo tar --transform 's|^x|$2|' -xzv -f- -C /") endef endif + + .DELETE_ON_ERROR: -.PHONY: all gzip install clean format sdk snapshots frontends ui backend reflash startos_raspberrypi.img sudo +.PHONY: all gzip install clean format sdk snapshots frontends ui backend reflash startos_raspberrypi.img sudo wormhole all: $(ALL_TARGETS) @@ -104,21 +111,24 @@ update-overlay: @echo "\033[33mALL CHANGES WILL BE REVERTED IF YOU RESTART THE DEVICE\033[0m" @if [ -z "$(REMOTE)" ]; then >&2 echo "Must specify REMOTE" && false; fi @if [ "`ssh $(REMOTE) 'cat /usr/lib/embassy/VERSION.txt'`" != "`cat ./VERSION.txt`" ]; then >&2 echo "StartOS requires migrations: update-overlay is unavailable." && false; fi - ssh $(REMOTE) "sudo systemctl stop startd" - $(MAKE) install REMOTE=$(REMOTE) OS_ARCH=$(OS_ARCH) - ssh $(REMOTE) "sudo systemctl start startd" + $(call ssh,"sudo systemctl stop startd") + $(MAKE) install REMOTE=$(REMOTE) SSHPASS=$(SSHPASS) OS_ARCH=$(OS_ARCH) + $(call ssh,"sudo systemctl start startd") + +wormhole: backend/target/$(ARCH)-unknown-linux-gnu/release/startbox + @wormhole send backend/target/$(ARCH)-unknown-linux-gnu/release/startbox 2>&1 | awk -Winteractive '/wormhole receive/ { printf "sudo /usr/lib/embassy/scripts/chroot-and-upgrade \"cd /usr/bin && rm startbox && wormhole receive --accept-file %s && chmod +x startbox\"\n", $$3 }' update: @if [ -z "$(REMOTE)" ]; then >&2 echo "Must specify REMOTE" && false; fi - ssh $(REMOTE) "sudo rsync -a --delete --force --info=progress2 /media/embassy/embassyfs/current/ /media/embassy/next/" - $(MAKE) install REMOTE=$(REMOTE) DESTDIR=/media/embassy/next OS_ARCH=$(OS_ARCH) - ssh $(REMOTE) "sudo touch /media/embassy/config/upgrade && sudo sync && sudo reboot" + $(call ssh,"sudo rsync -a --delete --force --info=progress2 /media/embassy/embassyfs/current/ /media/embassy/next/") + $(MAKE) install REMOTE=$(REMOTE) SSHPASS=$(SSHPASS) DESTDIR=/media/embassy/next OS_ARCH=$(OS_ARCH) + $(call ssh,"sudo touch /media/embassy/config/upgrade && sudo sync && sudo reboot") emulate-reflash: @if [ -z "$(REMOTE)" ]; then >&2 echo "Must specify REMOTE" && false; fi - ssh $(REMOTE) "sudo rsync -a --delete --force --info=progress2 /media/embassy/embassyfs/current/ /media/embassy/next/" - $(MAKE) install REMOTE=$(REMOTE) DESTDIR=/media/embassy/next OS_ARCH=$(OS_ARCH) - ssh $(REMOTE) "sudo touch /media/embassy/config/upgrade && sudo rm -f /media/embassy/config/disk.guid && sudo sync && sudo reboot" + $(call ssh,"sudo rsync -a --delete --force --info=progress2 /media/embassy/embassyfs/current/ /media/embassy/next/") + $(MAKE) install REMOTE=$(REMOTE) SSHPASS=$(SSHPASS) DESTDIR=/media/embassy/next OS_ARCH=$(OS_ARCH) + $(call ssh,"sudo touch /media/embassy/config/upgrade && sudo rm -f /media/embassy/config/disk.guid && sudo sync && sudo reboot") system-images/compat/docker-images/aarch64.tar system-images/compat/docker-images/x86_64.tar: $(COMPAT_SRC) cd system-images/compat && make diff --git a/backend/Cargo.lock b/backend/Cargo.lock index ec983eaf4..9f0683e75 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -58,6 +58,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if 1.0.0", + "getrandom 0.2.10", "once_cell", "version_check", ] @@ -374,15 +375,6 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - [[package]] name = "bitmaps" version = "3.2.0" @@ -437,44 +429,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" -[[package]] -name = "bollard" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82e7850583ead5f8bbef247e2a3c37a19bd576e8420cd262a6711921827e1e5" -dependencies = [ - "base64 0.13.1", - "bollard-stubs", - "bytes", - "futures-core", - "futures-util", - "hex", - "http", - "hyper", - "hyperlocal", - "log", - "pin-project-lite", - "serde", - "serde_derive", - "serde_json", - "serde_urlencoded", - "thiserror", - "tokio", - "tokio-util", - "url", - "winapi", -] - -[[package]] -name = "bollard-stubs" -version = "1.42.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed59b5c00048f48d7af971b71f800fdf23e858844a6f9e4d32ca72e9399e7864" -dependencies = [ - "serde", - "serde_with 1.14.0", -] - [[package]] name = "brotli" version = "3.3.4" @@ -664,7 +618,7 @@ dependencies = [ "indenter", "once_cell", "owo-colors", - "tracing-error 0.2.0", + "tracing-error", ] [[package]] @@ -676,7 +630,7 @@ dependencies = [ "once_cell", "owo-colors", "tracing-core", - "tracing-error 0.2.0", + "tracing-error", ] [[package]] @@ -912,38 +866,14 @@ dependencies = [ "zeroize", ] -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", -] - [[package]] name = "darling" version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ - "darling_core 0.20.3", - "darling_macro 0.20.3", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2 1.0.66", - "quote 1.0.31", - "strsim 0.10.0", - "syn 1.0.109", + "darling_core", + "darling_macro", ] [[package]] @@ -960,24 +890,13 @@ dependencies = [ "syn 2.0.18", ] -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core 0.13.4", - "quote 1.0.31", - "syn 1.0.109", -] - [[package]] name = "darling_macro" version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ - "darling_core 0.20.3", + "darling_core", "quote 1.0.31", "syn 2.0.18", ] @@ -1339,7 +1258,7 @@ dependencies = [ "color-eyre", "futures", "helpers", - "imbl 2.0.0", + "imbl", "nix 0.25.1", "procfs", "serde", @@ -1347,9 +1266,9 @@ dependencies = [ "tokio", "tokio-stream", "tracing", - "tracing-error 0.2.0", + "tracing-error", "tracing-futures", - "tracing-subscriber 0.3.17", + "tracing-subscriber", "yajrc 0.1.0 (git+https://github.com/dr-bonez/yajrc.git?branch=develop)", ] @@ -1400,7 +1319,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2 1.0.66", "quote 1.0.31", "syn 1.0.109", @@ -1821,6 +1740,15 @@ dependencies = [ "ahash 0.7.6", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + [[package]] name = "hashbrown" version = "0.14.0" @@ -1840,15 +1768,6 @@ dependencies = [ "hashbrown 0.14.0", ] -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "heck" version = "0.4.1" @@ -2033,19 +1952,6 @@ dependencies = [ "tokio-tungstenite", ] -[[package]] -name = "hyperlocal" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c" -dependencies = [ - "futures-util", - "hex", - "hyper", - "pin-project", - "tokio", -] - [[package]] name = "iana-time-zone" version = "0.1.57" @@ -2112,30 +2018,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" -[[package]] -name = "imbl" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "543682c9082b25e63d03b5acbd65ad111fd49dd93e70843e5175db4ff81d606b" -dependencies = [ - "bitmaps 2.1.0", - "rand_core 0.6.4", - "rand_xoshiro", - "sized-chunks", - "typenum", - "version_check", -] - [[package]] name = "imbl" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2806b69cd9f4664844027b64465eacb444c67c1db9c778e341adff0c25cdb0d" dependencies = [ - "bitmaps 3.2.0", + "bitmaps", "imbl-sized-chunks", "rand_core 0.6.4", "rand_xoshiro", + "serde", "version_check", ] @@ -2145,7 +2038,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6957ea0b2541c5ca561d3ef4538044af79f8a05a1eb3a3b148936aaceaa1076" dependencies = [ - "bitmaps 3.2.0", + "bitmaps", +] + +[[package]] +name = "imbl-value" +version = "0.1.0" +source = "git+https://github.com/Start9Labs/imbl-value.git#929395141c3a882ac366c12ac9402d0ebaa2201b" +dependencies = [ + "imbl", + "serde", + "serde_json", + "treediff", + "yasi", ] [[package]] @@ -2203,20 +2108,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "internment" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161079c3ad892faa215fcfcf3fd7a6a3c9288df2b06a2c2bad7fbfad4f01d69d" -dependencies = [ - "ahash 0.7.6", - "dashmap", - "hashbrown 0.12.3", - "once_cell", - "parking_lot 0.12.1", - "serde", -] - [[package]] name = "io-lifetimes" version = "1.0.11" @@ -2395,9 +2286,9 @@ dependencies = [ name = "json-patch" version = "0.2.7-alpha.0" dependencies = [ + "imbl-value", "json-ptr", "serde", - "serde_json", "treediff", ] @@ -2405,17 +2296,18 @@ dependencies = [ name = "json-ptr" version = "0.1.0" dependencies = [ + "imbl", + "imbl-value", "serde", - "serde_json", "thiserror", ] [[package]] name = "jsonpath_lib" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" +source = "git+https://github.com/Start9Labs/jsonpath.git#1cacbd64afa2e1941a21fef06bad14317ba92f30" dependencies = [ + "imbl-value", "log", "serde", "serde_json", @@ -2701,6 +2593,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -2737,11 +2638,10 @@ dependencies = [ name = "models" version = "0.1.0" dependencies = [ - "bollard", + "base64 0.21.2", "color-eyre", "ed25519-dalek", "emver", - "internment", "ipnet", "lazy_static", "mbrman", @@ -2749,6 +2649,7 @@ dependencies = [ "patch-db", "rand 0.8.5", "regex", + "reqwest", "rpc-toolkit", "serde", "serde_json", @@ -2758,6 +2659,7 @@ dependencies = [ "tokio", "torut", "tracing", + "yasi", ] [[package]] @@ -2803,19 +2705,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "nix" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset", -] - [[package]] name = "nix" version = "0.24.3" @@ -2825,7 +2714,7 @@ dependencies = [ "bitflags 1.3.2", "cfg-if 1.0.0", "libc", - "memoffset", + "memoffset 0.6.5", ] [[package]] @@ -2838,10 +2727,24 @@ dependencies = [ "bitflags 1.3.2", "cfg-if 1.0.0", "libc", - "memoffset", + "memoffset 0.6.5", "pin-utils", ] +[[package]] +name = "nix" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +dependencies = [ + "bitflags 1.3.2", + "cfg-if 1.0.0", + "libc", + "memoffset 0.7.1", + "pin-utils", + "static_assertions", +] + [[package]] name = "nom" version = "5.1.3" @@ -3211,19 +3114,19 @@ dependencies = [ "async-trait", "fd-lock-rs", "futures", - "imbl 1.0.1", + "imbl", + "imbl-value", "json-patch", "json-ptr", "lazy_static", - "nix 0.23.2", + "nix 0.26.2", "patch-db-macro", "serde", "serde_cbor 0.11.1", - "serde_json", "thiserror", "tokio", "tracing", - "tracing-error 0.1.2", + "tracing-error", ] [[package]] @@ -3239,7 +3142,7 @@ dependencies = [ name = "patch-db-macro-internals" version = "0.1.0" dependencies = [ - "heck 0.3.3", + "heck", "proc-macro2 1.0.66", "quote 1.0.31", "syn 1.0.109", @@ -4237,16 +4140,6 @@ dependencies = [ "v8", ] -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "serde", - "serde_with_macros 1.5.2", -] - [[package]] name = "serde_with" version = "2.3.3" @@ -4259,29 +4152,17 @@ dependencies = [ "indexmap 1.9.3", "serde", "serde_json", - "serde_with_macros 2.3.3", + "serde_with_macros", "time 0.3.23", ] -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling 0.13.4", - "proc-macro2 1.0.66", - "quote 1.0.31", - "syn 1.0.109", -] - [[package]] name = "serde_with_macros" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ - "darling 0.20.3", + "darling", "proc-macro2 1.0.66", "quote 1.0.31", "syn 2.0.18", @@ -4419,16 +4300,6 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps 2.1.0", - "typenum", -] - [[package]] name = "slab" version = "0.4.8" @@ -4579,7 +4450,7 @@ checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9" dependencies = [ "dotenvy", "either", - "heck 0.4.1", + "heck", "hex", "once_cell", "proc-macro2 1.0.66", @@ -4690,7 +4561,8 @@ dependencies = [ "http", "hyper", "hyper-ws-listener", - "imbl 2.0.0", + "imbl", + "imbl-value", "include_dir", "indexmap 1.9.3", "ipnet", @@ -4733,7 +4605,7 @@ dependencies = [ "scopeguard", "serde", "serde_json", - "serde_with 2.3.3", + "serde_with", "serde_yaml", "sha2 0.10.7", "sha2 0.9.9", @@ -4753,9 +4625,9 @@ dependencies = [ "toml", "torut", "tracing", - "tracing-error 0.2.0", + "tracing-error", "tracing-futures", - "tracing-subscriber 0.3.17", + "tracing-subscriber", "trust-dns-server", "typed-builder", "url", @@ -4859,7 +4731,7 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2 1.0.66", "quote 1.0.31", "rustversion", @@ -5627,16 +5499,6 @@ dependencies = [ "valuable", ] -[[package]] -name = "tracing-error" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d7c0b83d4a500748fa5879461652b361edf5c9d51ede2a2ac03875ca185e24" -dependencies = [ - "tracing", - "tracing-subscriber 0.2.25", -] - [[package]] name = "tracing-error" version = "0.2.0" @@ -5644,7 +5506,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" dependencies = [ "tracing", - "tracing-subscriber 0.3.17", + "tracing-subscriber", ] [[package]] @@ -5668,17 +5530,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "sharded-slab", - "thread_local", - "tracing-core", -] - [[package]] name = "tracing-subscriber" version = "0.3.17" @@ -6390,6 +6241,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "yasi" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f355ab62ebe30b758c1f4ab096a306722c4b7dbfb9d8c07d18c70d71a945588" +dependencies = [ + "ahash 0.8.3", + "hashbrown 0.13.2", + "lazy_static", + "serde", +] + [[package]] name = "zeroize" version = "1.6.0" diff --git a/backend/Cargo.toml b/backend/Cargo.toml index caf0a7094..d10c011a1 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -78,6 +78,7 @@ http = "0.2.8" hyper = { version = "0.14.20", features = ["full"] } hyper-ws-listener = "0.2.0" imbl = "2.0.0" +imbl-value = { git = "https://github.com/Start9Labs/imbl-value.git" } include_dir = "0.7.3" indexmap = { version = "1.9.1", features = ["serde"] } ipnet = { version = "2.7.1", features = ["serde"] } @@ -88,7 +89,7 @@ jaq-core = "0.10.0" jaq-std = "0.10.0" josekit = "0.8.1" js_engine = { path = '../libs/js_engine', optional = true } -jsonpath_lib = "0.3.0" +jsonpath_lib = { git = "https://github.com/Start9Labs/jsonpath.git" } lazy_static = "1.4.0" libc = "0.2.126" log = "0.4.17" diff --git a/backend/src/action.rs b/backend/src/action.rs index e397e8f2f..07fe1759b 100644 --- a/backend/src/action.rs +++ b/backend/src/action.rs @@ -11,6 +11,7 @@ use tracing::instrument; use crate::config::{Config, ConfigSpec}; use crate::context::RpcContext; +use crate::prelude::*; use crate::procedure::docker::DockerContainers; use crate::procedure::{PackageProcedure, ProcedureName}; use crate::s9pk::manifest::PackageId; @@ -59,7 +60,7 @@ impl Action { #[instrument(skip_all)] pub fn validate( &self, - container: &Option, + _container: &Option, eos_version: &Version, volumes: &Volumes, image_ids: &BTreeSet, @@ -130,18 +131,17 @@ pub async fn action( #[arg(long = "format")] format: Option, ) -> Result { - let mut db = ctx.db.handle(); - let manifest = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&pkg_id) - .and_then(|p| p.installed()) - .expect(&mut db) - .await - .with_kind(crate::ErrorKind::NotFound)? - .manifest() - .get(&mut db) + let manifest = ctx + .db + .peek() .await? - .to_owned(); + .as_package_data() + .as_idx(&pkg_id) + .or_not_found(&pkg_id)? + .as_installed() + .or_not_found(&pkg_id)? + .as_manifest() + .de()?; if let Some(action) = manifest.actions.0.get(&action_id) { action diff --git a/backend/src/auth.rs b/backend/src/auth.rs index 1ccbf81df..132c80ef8 100644 --- a/backend/src/auth.rs +++ b/backend/src/auth.rs @@ -5,7 +5,6 @@ use chrono::{DateTime, Utc}; use clap::ArgMatches; use color_eyre::eyre::eyre; use josekit::jwk::Jwk; -use patch_db::{DbHandle, LockReceipt}; use rpc_toolkit::command; use rpc_toolkit::command_helpers::prelude::{RequestParts, ResponseParts}; use rpc_toolkit::yajrc::RpcError; @@ -17,6 +16,7 @@ use tracing::instrument; use crate::context::{CliContext, RpcContext}; use crate::middleware::auth::{AsLogoutSessionId, HasLoggedOutSessions, HashSessionToken}; use crate::middleware::encrypt::EncryptedWire; +use crate::prelude::*; use crate::util::display_none; use crate::util::serde::{display_serializable, IoFormat}; use crate::{ensure_code, Error, ResultExt}; @@ -343,27 +343,6 @@ async fn cli_reset_password( Ok(()) } -pub struct SetPasswordReceipt(LockReceipt); -impl SetPasswordReceipt { - pub async fn new(db: &mut Db) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - let password_hash = crate::db::DatabaseModel::new() - .server_info() - .password_hash() - .make_locker(patch_db::LockType::Write) - .add_to_keys(locks); - move |skeleton_key| Ok(Self(password_hash.verify(skeleton_key)?)) - } -} - #[command( rename = "reset-password", custom_cli(cli_reset_password(async, context(CliContext))), @@ -389,13 +368,14 @@ pub async fn reset_password( } account.set_password(&new_password)?; account.save(&ctx.secret_store).await?; - crate::db::DatabaseModel::new() - .server_info() - .password_hash() - .put(&mut ctx.db.handle(), &account.password) - .await?; - - Ok(()) + let account_password = &account.password; + ctx.db + .mutate(|d| { + d.as_server_info_mut() + .as_password_hash_mut() + .ser(account_password) + }) + .await } #[command( diff --git a/backend/src/backup/backup_bulk.rs b/backend/src/backup/backup_bulk.rs index c97eeb0d6..5bab4bb78 100644 --- a/backend/src/backup/backup_bulk.rs +++ b/backend/src/backup/backup_bulk.rs @@ -1,4 +1,5 @@ -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeMap; +use std::panic::UnwindSafe; use std::path::{Path, PathBuf}; use std::sync::Arc; @@ -6,9 +7,11 @@ use chrono::Utc; use clap::ArgMatches; use color_eyre::eyre::eyre; use helpers::AtomicFile; -use patch_db::{DbHandle, LockType, PatchDbHandle}; +use imbl::OrdSet; +use models::Version; use rpc_toolkit::command; -use tokio::{io::AsyncWriteExt, sync::Mutex}; +use tokio::io::AsyncWriteExt; +use tokio::sync::Mutex; use tracing::instrument; use super::target::BackupTargetId; @@ -18,26 +21,27 @@ use crate::backup::os::OsBackup; use crate::backup::{BackupReport, ServerBackupReport}; use crate::context::RpcContext; use crate::db::model::BackupProgress; +use crate::db::package::get_packages; use crate::disk::mount::backup::BackupMountGuard; use crate::disk::mount::filesystem::ReadWrite; use crate::disk::mount::guard::TmpMountGuard; use crate::manager::BackupReturn; use crate::notifications::NotificationLevel; +use crate::prelude::*; use crate::s9pk::manifest::PackageId; use crate::util::display_none; use crate::util::io::dir_copy; use crate::util::serde::IoFormat; use crate::version::VersionT; -use crate::{Error, ErrorKind, ResultExt}; -fn parse_comma_separated(arg: &str, _: &ArgMatches) -> Result, Error> { +fn parse_comma_separated(arg: &str, _: &ArgMatches) -> Result, Error> { arg.split(',') - .map(|s| s.trim().parse().map_err(Error::from)) + .map(|s| s.trim().parse::().map_err(Error::from)) .collect() } #[command(rename = "create", display(display_none))] -#[instrument(skip_all)] +#[instrument(skip(ctx, old_password, password))] pub async fn backup_all( #[context] ctx: RpcContext, #[arg(rename = "target-id")] target_id: BackupTargetId, @@ -49,10 +53,10 @@ pub async fn backup_all( long = "package-ids", parse(parse_comma_separated) )] - package_ids: Option>, + package_ids: Option>, #[arg] password: crate::auth::PasswordType, ) -> Result<(), Error> { - let mut db = ctx.db.handle(); + let db = ctx.db.peek().await?; let old_password_decrypted = old_password .as_ref() .unwrap_or(&password) @@ -68,36 +72,33 @@ pub async fn backup_all( &old_password_decrypted, ) .await?; - let all_packages = crate::db::DatabaseModel::new() - .package_data() - .get(&mut db) - .await? - .0 - .keys() - .into_iter() - .cloned() - .collect(); - let package_ids = package_ids.unwrap_or(all_packages); + let package_ids = if let Some(ids) = package_ids { + ids.into_iter() + .flat_map(|package_id| { + let version = db + .as_package_data() + .as_idx(&package_id)? + .as_manifest() + .as_version() + .de() + .ok()?; + Some((package_id, version)) + }) + .collect() + } else { + get_packages(db.clone())?.into_iter().collect() + }; if old_password.is_some() { backup_guard.change_password(&password)?; } - assure_backing_up(&mut db, &package_ids).await?; + assure_backing_up(&ctx.db, &package_ids).await?; tokio::task::spawn(async move { - let backup_res = perform_backup(&ctx, &mut db, backup_guard, &package_ids).await; - let backup_progress = crate::db::DatabaseModel::new() - .server_info() - .status_info() - .backup_progress(); - backup_progress - .clone() - .lock(&mut db, LockType::Write) - .await - .expect("failed to lock server status"); + let backup_res = perform_backup(&ctx, backup_guard, &package_ids).await; match backup_res { Ok(report) if report.iter().all(|(_, rep)| rep.error.is_none()) => ctx .notification_manager .notify( - &mut db, + ctx.db.clone(), None, NotificationLevel::Success, "Backup Complete".to_owned(), @@ -107,7 +108,10 @@ pub async fn backup_all( attempted: true, error: None, }, - packages: report, + packages: report + .into_iter() + .map(|((package_id, _), value)| (package_id, value)) + .collect(), }, None, ) @@ -116,7 +120,7 @@ pub async fn backup_all( Ok(report) => ctx .notification_manager .notify( - &mut db, + ctx.db.clone(), None, NotificationLevel::Warning, "Backup Complete".to_owned(), @@ -126,7 +130,10 @@ pub async fn backup_all( attempted: true, error: None, }, - packages: report, + packages: report + .into_iter() + .map(|((package_id, _), value)| (package_id, value)) + .collect(), }, None, ) @@ -137,7 +144,7 @@ pub async fn backup_all( tracing::debug!("{:?}", e); ctx.notification_manager .notify( - &mut db, + ctx.db.clone(), None, NotificationLevel::Error, "Backup Failed".to_owned(), @@ -155,106 +162,85 @@ pub async fn backup_all( .expect("failed to send notification"); } } - backup_progress - .delete(&mut db) - .await - .expect("failed to change server status"); + ctx.db + .mutate(|v| { + v.as_server_info_mut() + .as_status_info_mut() + .as_backup_progress_mut() + .ser(&None) + }) + .await?; + Ok::<(), Error>(()) }); Ok(()) } -#[instrument(skip_all)] +#[instrument(skip(db, packages))] async fn assure_backing_up( - db: &mut PatchDbHandle, - packages: impl IntoIterator, + db: &PatchDb, + packages: impl IntoIterator + UnwindSafe + Send, ) -> Result<(), Error> { - let mut tx = db.begin().await?; - let mut backing_up = crate::db::DatabaseModel::new() - .server_info() - .status_info() - .backup_progress() - .get_mut(&mut tx) - .await?; - - if backing_up - .iter() - .flat_map(|x| x.values()) - .fold(false, |acc, x| { - if !x.complete { - return true; - } - acc - }) - { - return Err(Error::new( - eyre!("Server is already backing up!"), - crate::ErrorKind::InvalidRequest, - )); - } - *backing_up = Some( - packages - .into_iter() - .map(|x| (x.clone(), BackupProgress { complete: false })) - .collect(), - ); - backing_up.save(&mut tx).await?; - tx.commit().await?; - Ok(()) + db.mutate(|v| { + let backing_up = v + .as_server_info_mut() + .as_status_info_mut() + .as_backup_progress_mut(); + if backing_up + .clone() + .de()? + .iter() + .flat_map(|x| x.values()) + .fold(false, |acc, x| { + if !x.complete { + return true; + } + acc + }) + { + return Err(Error::new( + eyre!("Server is already backing up!"), + ErrorKind::InvalidRequest, + )); + } + backing_up.ser(&Some( + packages + .into_iter() + .map(|(x, _)| (x.clone(), BackupProgress { complete: false })) + .collect(), + ))?; + Ok(()) + }) + .await } -#[instrument(skip_all)] -async fn perform_backup( +#[instrument(skip(ctx, backup_guard))] +async fn perform_backup( ctx: &RpcContext, - mut db: Db, backup_guard: BackupMountGuard, - package_ids: &BTreeSet, -) -> Result, Error> { + package_ids: &OrdSet<(PackageId, Version)>, +) -> Result, Error> { let mut backup_report = BTreeMap::new(); let backup_guard = Arc::new(Mutex::new(backup_guard)); - for package_id in crate::db::DatabaseModel::new() - .package_data() - .keys(&mut db) - .await? - .into_iter() - .filter(|id| package_ids.contains(id)) - { - let mut tx = db.begin().await?; // for lock scope - let installed_model = if let Some(installed_model) = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&package_id) - .and_then(|m| m.installed()) - .check(&mut tx) - .await? - { - installed_model - } else { - continue; - }; - let main_status_model = installed_model.clone().status().main(); - - let manifest = installed_model.clone().manifest().get(&mut tx).await?; - - let (response, report) = match ctx + for package_id in package_ids { + let (response, _report) = match ctx .managers - .get(&(manifest.id.clone(), manifest.version.clone())) + .get(package_id) .await - .ok_or_else(|| { - Error::new(eyre!("Manager not found"), crate::ErrorKind::InvalidRequest) - })? + .ok_or_else(|| Error::new(eyre!("Manager not found"), ErrorKind::InvalidRequest))? .backup(backup_guard.clone()) .await { BackupReturn::Ran { report, res } => (res, report), BackupReturn::AlreadyRunning(report) => { - backup_report.insert(package_id, report); + backup_report.insert(package_id.clone(), report); continue; } BackupReturn::Error(error) => { tracing::warn!("Backup thread error"); tracing::debug!("{error:?}"); backup_report.insert( - package_id, + package_id.clone(), PackageBackupReport { error: Some("Backup thread error".to_owned()), }, @@ -270,42 +256,16 @@ async fn perform_backup( ); if let Ok(pkg_meta) = response { - installed_model - .last_backup() - .put(&mut tx, &Some(pkg_meta.timestamp)) - .await?; backup_guard .lock() .await .metadata .package_backups - .insert(package_id.clone(), pkg_meta); + .insert(package_id.0.clone(), pkg_meta); } - - let mut backup_progress = crate::db::DatabaseModel::new() - .server_info() - .status_info() - .backup_progress() - .get_mut(&mut tx) - .await?; - if backup_progress.is_none() { - *backup_progress = Some(Default::default()); - } - if let Some(mut backup_progress) = backup_progress - .as_mut() - .and_then(|bp| bp.get_mut(&package_id)) - { - (*backup_progress).complete = true; - } - backup_progress.save(&mut tx).await?; - tx.save().await?; } - let ui = crate::db::DatabaseModel::new() - .ui() - .get(&mut db) - .await? - .into_owned(); + let ui = ctx.db.peek().await?.into_ui().de()?; let mut os_backup_file = AtomicFile::new( backup_guard.lock().await.as_ref().join("os-backup.cbor"), @@ -354,10 +314,9 @@ async fn perform_backup( backup_guard.save_and_unmount().await?; - crate::db::DatabaseModel::new() - .server_info() - .last_backup() - .put(&mut db, ×tamp) + ctx.db + .mutate(|v| v.as_server_info_mut().as_last_backup_mut().ser(×tamp)) .await?; + Ok(backup_report) } diff --git a/backend/src/backup/mod.rs b/backend/src/backup/mod.rs index ba890645b..670c01c29 100644 --- a/backend/src/backup/mod.rs +++ b/backend/src/backup/mod.rs @@ -1,11 +1,11 @@ use std::collections::{BTreeMap, BTreeSet}; use std::path::{Path, PathBuf}; +use std::sync::Arc; use chrono::{DateTime, Utc}; use color_eyre::eyre::eyre; use helpers::AtomicFile; -use models::ImageId; -use patch_db::{DbHandle, HasModel}; +use models::{ImageId, OptionExt}; use reqwest::Url; use rpc_toolkit::command; use serde::{Deserialize, Serialize}; @@ -15,10 +15,11 @@ use tracing::instrument; use self::target::PackageBackupInfo; use crate::context::RpcContext; -use crate::dependencies::reconfigure_dependents_with_live_pointers; use crate::install::PKG_ARCHIVE_DIR; -use crate::net::interface::{InterfaceId, Interfaces}; +use crate::manager::manager_seed::ManagerSeed; +use crate::net::interface::InterfaceId; use crate::net::keys::Key; +use crate::prelude::*; use crate::procedure::docker::DockerContainers; use crate::procedure::{NoOutput, PackageProcedure, ProcedureName}; use crate::s9pk::manifest::PackageId; @@ -71,6 +72,7 @@ struct BackupMetadata { } #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] +#[model = "Model"] pub struct BackupActions { pub create: PackageProcedure, pub restore: PackageProcedure, @@ -78,7 +80,7 @@ pub struct BackupActions { impl BackupActions { pub fn validate( &self, - container: &Option, + _container: &Option, eos_version: &Version, volumes: &Volumes, image_ids: &BTreeSet, @@ -93,19 +95,14 @@ impl BackupActions { } #[instrument(skip_all)] - pub async fn create( - &self, - ctx: &RpcContext, - db: &mut Db, - pkg_id: &PackageId, - pkg_title: &str, - pkg_version: &Version, - interfaces: &Interfaces, - volumes: &Volumes, - ) -> Result { - let mut volumes = volumes.to_readonly(); + pub async fn create(&self, seed: Arc) -> Result { + let manifest = &seed.manifest; + let mut volumes = seed.manifest.volumes.to_readonly(); + let ctx = &seed.ctx; + let pkg_id = &manifest.id; + let pkg_version = &manifest.version; volumes.insert(VolumeId::Backup, Volume::Backup { readonly: false }); - let backup_dir = backup_dir(pkg_id); + let backup_dir = backup_dir(&manifest.id); if tokio::fs::metadata(&backup_dir).await.is_err() { tokio::fs::create_dir_all(&backup_dir).await? } @@ -122,29 +119,29 @@ impl BackupActions { .await? .map_err(|e| eyre!("{}", e.1)) .with_kind(crate::ErrorKind::Backup)?; - let (network_keys, tor_keys) = Key::for_package(&ctx.secret_store, pkg_id) + let (network_keys, tor_keys): (Vec<_>, Vec<_>) = + Key::for_package(&ctx.secret_store, pkg_id) + .await? + .into_iter() + .filter_map(|k| { + let interface = k.interface().map(|(_, i)| i)?; + Some(( + (interface.clone(), Base64(k.as_bytes())), + (interface, Base32(k.tor_key().as_bytes())), + )) + }) + .unzip(); + let marketplace_url = ctx + .db + .peek() .await? - .into_iter() - .filter_map(|k| { - let interface = k.interface().map(|(_, i)| i)?; - Some(( - (interface.clone(), Base64(k.as_bytes())), - (interface, Base32(k.tor_key().as_bytes())), - )) - }) - .unzip(); - let marketplace_url = crate::db::DatabaseModel::new() - .package_data() - .idx_model(pkg_id) - .expect(db) - .await? - .installed() - .expect(db) - .await? - .marketplace_url() - .get(db) - .await? - .into_owned(); + .as_package_data() + .as_idx(&pkg_id) + .or_not_found(pkg_id)? + .expect_as_installed()? + .as_installed() + .as_marketplace_url() + .de()?; let tmp_path = Path::new(BACKUP_DIR) .join(pkg_id) .join(format!("{}.s9pk", pkg_id)); @@ -172,6 +169,8 @@ impl BackupActions { let mut outfile = AtomicFile::new(&metadata_path, None::) .await .with_kind(ErrorKind::Filesystem)?; + let network_keys = network_keys.into_iter().collect(); + let tor_keys = tor_keys.into_iter().collect(); outfile .write_all(&IoFormat::Cbor.to_vec(&BackupMetadata { timestamp, @@ -183,22 +182,20 @@ impl BackupActions { outfile.save().await.with_kind(ErrorKind::Filesystem)?; Ok(PackageBackupInfo { os_version: Current::new().semver().into(), - title: pkg_title.to_owned(), + title: manifest.title.clone(), version: pkg_version.clone(), timestamp, }) } #[instrument(skip_all)] - pub async fn restore( + pub async fn restore( &self, ctx: &RpcContext, - db: &mut Db, pkg_id: &PackageId, pkg_version: &Version, - interfaces: &Interfaces, volumes: &Volumes, - ) -> Result<(), Error> { + ) -> Result, Error> { let mut volumes = volumes.clone(); volumes.insert(VolumeId::Backup, Volume::Backup { readonly: true }); self.restore @@ -223,32 +220,7 @@ impl BackupActions { ) })?, )?; - let pde = crate::db::DatabaseModel::new() - .package_data() - .idx_model(pkg_id) - .expect(db) - .await? - .installed() - .expect(db) - .await?; - pde.marketplace_url() - .put(db, &metadata.marketplace_url) - .await?; - let entry = crate::db::DatabaseModel::new() - .package_data() - .idx_model(pkg_id) - .expect(db) - .await? - .installed() - .expect(db) - .await? - .get(db) - .await?; - - let receipts = crate::config::ConfigReceipts::new(db).await?; - reconfigure_dependents_with_live_pointers(ctx, db, &receipts, &entry).await?; - - Ok(()) + Ok(metadata.marketplace_url) } } diff --git a/backend/src/backup/os.rs b/backend/src/backup/os.rs index 74498452c..5ab8bd12e 100644 --- a/backend/src/backup/os.rs +++ b/backend/src/backup/os.rs @@ -1,13 +1,13 @@ use openssl::pkey::PKey; use openssl::x509::X509; +use patch_db::Value; use serde::{Deserialize, Serialize}; -use serde_json::Value; use crate::account::AccountInfo; use crate::hostname::{generate_hostname, generate_id, Hostname}; use crate::net::keys::Key; +use crate::prelude::*; use crate::util::serde::Base64; -use crate::Error; pub struct OsBackup { pub account: AccountInfo, @@ -20,11 +20,11 @@ impl<'de> Deserialize<'de> for OsBackup { { let tagged = OsBackupSerDe::deserialize(deserializer)?; match tagged.version { - 0 => serde_json::from_value::(tagged.rest) + 0 => patch_db::value::from_value::(tagged.rest) .map_err(serde::de::Error::custom)? .project() .map_err(serde::de::Error::custom), - 1 => serde_json::from_value::(tagged.rest) + 1 => patch_db::value::from_value::(tagged.rest) .map_err(serde::de::Error::custom)? .project() .map_err(serde::de::Error::custom), @@ -41,7 +41,7 @@ impl Serialize for OsBackup { { OsBackupSerDe { version: 1, - rest: serde_json::to_value( + rest: patch_db::value::to_value( &OsBackupV1::unproject(self).map_err(serde::ser::Error::custom)?, ) .map_err(serde::ser::Error::custom)?, diff --git a/backend/src/backup/restore.rs b/backend/src/backup/restore.rs index 1589aabe6..ac8d07f48 100644 --- a/backend/src/backup/restore.rs +++ b/backend/src/backup/restore.rs @@ -5,11 +5,9 @@ use std::sync::Arc; use std::time::Duration; use clap::ArgMatches; -use color_eyre::eyre::eyre; use futures::future::BoxFuture; use futures::{stream, FutureExt, StreamExt}; use openssl::x509::X509; -use patch_db::{DbHandle, PatchDbHandle}; use rpc_toolkit::command; use sqlx::Connection; use tokio::fs::File; @@ -21,7 +19,7 @@ use crate::backup::os::OsBackup; use crate::backup::BackupMetadata; use crate::context::rpc::RpcContextConfig; use crate::context::{RpcContext, SetupContext}; -use crate::db::model::{PackageDataEntry, StaticFiles}; +use crate::db::model::{PackageDataEntry, PackageDataEntryRestoring, StaticFiles}; use crate::disk::mount::backup::{BackupMountGuard, PackageBackupMountGuard}; use crate::disk::mount::filesystem::ReadWrite; use crate::disk::mount::guard::TmpMountGuard; @@ -30,6 +28,7 @@ use crate::init::init; use crate::install::progress::InstallProgress; use crate::install::{download_install_s9pk, PKG_PUBLIC_DIR}; use crate::notifications::NotificationLevel; +use crate::prelude::*; use crate::s9pk::manifest::{Manifest, PackageId}; use crate::s9pk::reader::S9pkReader; use crate::setup::SetupStatus; @@ -37,7 +36,6 @@ use crate::util::display_none; use crate::util::io::dir_size; use crate::util::serde::IoFormat; use crate::volume::{backup_dir, BACKUP_DIR, PKG_VOLUME_DIR}; -use crate::{Error, ResultExt}; fn parse_comma_separated(arg: &str, _: &ArgMatches) -> Result, Error> { arg.split(',') @@ -46,33 +44,31 @@ fn parse_comma_separated(arg: &str, _: &ArgMatches) -> Result, Er } #[command(rename = "restore", display(display_none))] -#[instrument(skip_all)] +#[instrument(skip(ctx, password))] pub async fn restore_packages_rpc( #[context] ctx: RpcContext, #[arg(parse(parse_comma_separated))] ids: Vec, #[arg(rename = "target-id")] target_id: BackupTargetId, #[arg] password: String, ) -> Result<(), Error> { - let mut db = ctx.db.handle(); let fs = target_id .load(&mut ctx.secret_store.acquire().await?) .await?; let backup_guard = BackupMountGuard::mount(TmpMountGuard::mount(&fs, ReadWrite).await?, &password).await?; - let (backup_guard, tasks, _) = restore_packages(&ctx, &mut db, backup_guard, ids).await?; + let (backup_guard, tasks, _) = restore_packages(&ctx, backup_guard, ids).await?; tokio::spawn(async move { stream::iter(tasks.into_iter().map(|x| (x, ctx.clone()))) .for_each_concurrent(5, |(res, ctx)| async move { - let mut db = ctx.db.handle(); match res.await { (Ok(_), _) => (), (Err(err), package_id) => { if let Err(err) = ctx .notification_manager .notify( - &mut db, + ctx.db.clone(), Some(package_id.clone()), NotificationLevel::Error, "Restoration Failure".to_string(), @@ -169,7 +165,7 @@ impl ProgressInfo { } } -#[instrument(skip_all)] +#[instrument(skip(ctx))] pub async fn recover_full_embassy( ctx: SetupContext, disk_guid: Arc, @@ -184,20 +180,18 @@ pub async fn recover_full_embassy( .await?; let os_backup_path = backup_guard.as_ref().join("os-backup.cbor"); - let mut os_backup: OsBackup = - IoFormat::Cbor.from_slice(&tokio::fs::read(&os_backup_path).await.with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - os_backup_path.display().to_string(), - ) - })?)?; + let mut os_backup: OsBackup = IoFormat::Cbor.from_slice( + &tokio::fs::read(&os_backup_path) + .await + .with_ctx(|_| (ErrorKind::Filesystem, os_backup_path.display().to_string()))?, + )?; os_backup.account.password = argon2::hash_encoded( embassy_password.as_bytes(), &rand::random::<[u8; 16]>()[..], &argon2::Config::default(), ) - .with_kind(crate::ErrorKind::PasswordHashGeneration)?; + .with_kind(ErrorKind::PasswordHashGeneration)?; let secret_store = ctx.secret_store().await?; @@ -211,27 +205,24 @@ pub async fn recover_full_embassy( let rpc_ctx = RpcContext::init(ctx.config_path.clone(), disk_guid.clone()).await?; - let mut db = rpc_ctx.db.handle(); - - let ids = backup_guard + let ids: Vec<_> = backup_guard .metadata .package_backups .keys() .cloned() .collect(); let (backup_guard, tasks, progress_info) = - restore_packages(&rpc_ctx, &mut db, backup_guard, ids).await?; + restore_packages(&rpc_ctx, backup_guard, ids).await?; let task_consumer_rpc_ctx = rpc_ctx.clone(); tokio::select! { _ = async move { stream::iter(tasks.into_iter().map(|x| (x, task_consumer_rpc_ctx.clone()))) .for_each_concurrent(5, |(res, ctx)| async move { - let mut db = ctx.db.handle(); match res.await { (Ok(_), _) => (), (Err(err), package_id) => { if let Err(err) = ctx.notification_manager.notify( - &mut db, + ctx.db.clone(), Some(package_id.clone()), NotificationLevel::Error, "Restoration Failure".to_string(), format!("Error restoring package {}: {}", package_id,err), (), None).await{ @@ -261,9 +252,9 @@ pub async fn recover_full_embassy( )) } +#[instrument(skip(ctx, backup_guard))] async fn restore_packages( ctx: &RpcContext, - db: &mut PatchDbHandle, backup_guard: BackupMountGuard, ids: Vec, ) -> Result< @@ -274,7 +265,7 @@ async fn restore_packages( ), Error, > { - let guards = assure_restoring(ctx, db, ids, &backup_guard).await?; + let guards = assure_restoring(ctx, ids, &backup_guard).await?; let mut progress_info = ProgressInfo::default(); @@ -282,7 +273,9 @@ async fn restore_packages( for (manifest, guard) in guards { let id = manifest.id.clone(); let (progress, task) = restore_package(ctx.clone(), manifest, guard).await?; - progress_info.package_installs.insert(id.clone(), progress); + progress_info + .package_installs + .insert(id.clone(), progress.clone()); progress_info .src_volume_size .insert(id.clone(), dir_size(backup_dir(&id), None).await?); @@ -306,23 +299,20 @@ async fn restore_packages( Ok((backup_guard, tasks, progress_info)) } -#[instrument(skip_all)] +#[instrument(skip(ctx, backup_guard))] async fn assure_restoring( ctx: &RpcContext, - db: &mut PatchDbHandle, ids: Vec, backup_guard: &BackupMountGuard, ) -> Result, Error> { - let mut tx = db.begin().await?; - let mut guards = Vec::with_capacity(ids.len()); + let mut insert_packages = BTreeMap::new(); + for id in ids { - let mut model = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&id) - .get_mut(&mut tx) - .await?; + let peek = ctx.db.peek().await?; + + let model = peek.as_package_data().as_idx(&id); if !model.is_none() { return Err(Error::new( @@ -330,14 +320,15 @@ async fn assure_restoring( crate::ErrorKind::InvalidRequest, )); } - let guard = backup_guard.mount_package_backup(&id).await?; let s9pk_path = Path::new(BACKUP_DIR).join(&id).join(format!("{}.s9pk", id)); let mut rdr = S9pkReader::open(&s9pk_path, false).await?; let manifest = rdr.manifest().await?; let version = manifest.version.clone(); - let progress = InstallProgress::new(Some(tokio::fs::metadata(&s9pk_path).await?.len())); + let progress = Arc::new(InstallProgress::new(Some( + tokio::fs::metadata(&s9pk_path).await?.len(), + ))); let public_dir_path = ctx .datadir @@ -361,22 +352,29 @@ async fn assure_restoring( let mut dst = File::create(&icon_path).await?; tokio::io::copy(&mut rdr.icon().await?, &mut dst).await?; dst.sync_all().await?; - - *model = Some(PackageDataEntry::Restoring { - install_progress: progress.clone(), - static_files: StaticFiles::local(&id, &version, manifest.assets.icon_type()), - manifest: manifest.clone(), - }); - model.save(&mut tx).await?; + insert_packages.insert( + id.clone(), + PackageDataEntry::Restoring(PackageDataEntryRestoring { + install_progress: progress.clone(), + static_files: StaticFiles::local(&id, &version, manifest.assets.icon_type()), + manifest: manifest.clone(), + }), + ); guards.push((manifest, guard)); } - - tx.commit().await?; + ctx.db + .mutate(|db| { + for (id, package) in insert_packages { + db.as_package_data_mut().insert(&id, &package)?; + } + Ok(()) + }) + .await?; Ok(guards) } -#[instrument(skip_all)] +#[instrument(skip(ctx, guard))] async fn restore_package<'a>( ctx: RpcContext, manifest: Manifest, @@ -388,13 +386,11 @@ async fn restore_package<'a>( .join(format!("{}.s9pk", id)); let metadata_path = Path::new(BACKUP_DIR).join(&id).join("metadata.cbor"); - let metadata: BackupMetadata = - IoFormat::Cbor.from_slice(&tokio::fs::read(&metadata_path).await.with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - metadata_path.display().to_string(), - ) - })?)?; + let metadata: BackupMetadata = IoFormat::Cbor.from_slice( + &tokio::fs::read(&metadata_path) + .await + .with_ctx(|_| (ErrorKind::Filesystem, metadata_path.display().to_string()))?, + )?; let mut secrets = ctx.secret_store.acquire().await?; let mut secrets_tx = secrets.begin().await?; @@ -402,8 +398,8 @@ async fn restore_package<'a>( let k = key.0.as_slice(); sqlx::query!( "INSERT INTO network_keys (package, interface, key) VALUES ($1, $2, $3) ON CONFLICT (package, interface) DO NOTHING", - *id, - *iface, + id.to_string(), + iface.to_string(), k, ) .execute(&mut secrets_tx).await?; @@ -413,8 +409,8 @@ async fn restore_package<'a>( let k = key.0.as_slice(); sqlx::query!( "INSERT INTO tor (package, interface, key) VALUES ($1, $2, $3) ON CONFLICT (package, interface) DO NOTHING", - *id, - *iface, + id.to_string(), + iface.to_string(), k, ) .execute(&mut secrets_tx).await?; @@ -424,26 +420,37 @@ async fn restore_package<'a>( let len = tokio::fs::metadata(&s9pk_path) .await - .with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - s9pk_path.display().to_string(), - ) - })? + .with_ctx(|_| (ErrorKind::Filesystem, s9pk_path.display().to_string()))? .len(); - let file = File::open(&s9pk_path).await.with_ctx(|_| { - ( - crate::ErrorKind::Filesystem, - s9pk_path.display().to_string(), - ) - })?; + let file = File::open(&s9pk_path) + .await + .with_ctx(|_| (ErrorKind::Filesystem, s9pk_path.display().to_string()))?; let progress = InstallProgress::new(Some(len)); + let marketplace_url = metadata.marketplace_url; + let progress = Arc::new(progress); + + ctx.db + .mutate(|db| { + db.as_package_data_mut().insert( + &id, + &PackageDataEntry::Restoring(PackageDataEntryRestoring { + install_progress: progress.clone(), + static_files: StaticFiles::local( + &id, + &manifest.version, + manifest.assets.icon_type(), + ), + manifest: manifest.clone(), + }), + ) + }) + .await?; Ok(( progress.clone(), async move { - download_install_s9pk(&ctx, &manifest, None, progress, file, None).await?; + download_install_s9pk(ctx, manifest, marketplace_url, progress, file, None).await?; guard.unmount().await?; diff --git a/backend/src/backup/target/cifs.rs b/backend/src/backup/target/cifs.rs index 3c683ad1f..3f3251535 100644 --- a/backend/src/backup/target/cifs.rs +++ b/backend/src/backup/target/cifs.rs @@ -12,9 +12,9 @@ use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::filesystem::ReadOnly; use crate::disk::mount::guard::TmpMountGuard; use crate::disk::util::{recovery_info, EmbassyOsRecoveryInfo}; +use crate::prelude::*; use crate::util::display_none; use crate::util::serde::KeyVal; -use crate::Error; #[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] @@ -84,7 +84,7 @@ pub async fn update( } else { return Err(Error::new( eyre!("Backup Target ID {} Not Found", id), - crate::ErrorKind::NotFound, + ErrorKind::NotFound, )); }; let cifs = Cifs { @@ -112,7 +112,7 @@ pub async fn update( { return Err(Error::new( eyre!("Backup Target ID {} Not Found", BackupTargetId::Cifs { id }), - crate::ErrorKind::NotFound, + ErrorKind::NotFound, )); }; Ok(KeyVal { @@ -134,7 +134,7 @@ pub async fn remove(#[context] ctx: RpcContext, #[arg] id: BackupTargetId) -> Re } else { return Err(Error::new( eyre!("Backup Target ID {} Not Found", id), - crate::ErrorKind::NotFound, + ErrorKind::NotFound, )); }; if sqlx::query!("DELETE FROM cifs_shares WHERE id = $1", id) @@ -145,7 +145,7 @@ pub async fn remove(#[context] ctx: RpcContext, #[arg] id: BackupTargetId) -> Re { return Err(Error::new( eyre!("Backup Target ID {} Not Found", BackupTargetId::Cifs { id }), - crate::ErrorKind::NotFound, + ErrorKind::NotFound, )); }; Ok(()) diff --git a/backend/src/backup/target/mod.rs b/backend/src/backup/target/mod.rs index a17cf8d62..80c4a59c6 100644 --- a/backend/src/backup/target/mod.rs +++ b/backend/src/backup/target/mod.rs @@ -7,7 +7,6 @@ use clap::ArgMatches; use color_eyre::eyre::eyre; use digest::generic_array::GenericArray; use digest::OutputSizeUser; -use lazy_static::lazy_static; use rpc_toolkit::command; use serde::{Deserialize, Serialize}; use sha2::Sha256; @@ -23,10 +22,10 @@ use crate::disk::mount::filesystem::cifs::Cifs; use crate::disk::mount::filesystem::{FileSystem, MountType, ReadWrite}; use crate::disk::mount::guard::TmpMountGuard; use crate::disk::util::PartitionInfo; +use crate::prelude::*; use crate::s9pk::manifest::PackageId; use crate::util::serde::{deserialize_from_str, display_serializable, serialize_display}; use crate::util::{display_none, Version}; -use crate::Error; pub mod cifs; @@ -44,7 +43,7 @@ pub enum BackupTarget { Cifs(CifsBackupTarget), } -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone)] pub enum BackupTargetId { Disk { logicalname: PathBuf }, Cifs { id: i32 }, @@ -73,14 +72,14 @@ impl std::fmt::Display for BackupTargetId { impl std::str::FromStr for BackupTargetId { type Err = Error; fn from_str(s: &str) -> Result { - match s.split_once("-") { + match s.split_once('-') { Some(("disk", logicalname)) => Ok(BackupTargetId::Disk { logicalname: Path::new(logicalname).to_owned(), }), Some(("cifs", id)) => Ok(BackupTargetId::Cifs { id: id.parse()? }), _ => Err(Error::new( eyre!("Invalid Backup Target ID"), - crate::ErrorKind::InvalidBackupTargetId, + ErrorKind::InvalidBackupTargetId, )), } } @@ -214,7 +213,7 @@ fn display_backup_info(info: BackupInfo, matches: &ArgMatches) { ]); for (id, info) in info.package_backups { let row = row![ - id.as_str(), + &*id, info.version.as_str(), info.os_version.as_str(), &info.timestamp.to_string(), @@ -225,7 +224,7 @@ fn display_backup_info(info: BackupInfo, matches: &ArgMatches) { } #[command(display(display_backup_info))] -#[instrument(skip_all)] +#[instrument(skip(ctx, password))] pub async fn info( #[context] ctx: RpcContext, #[arg(rename = "target-id")] target_id: BackupTargetId, @@ -250,7 +249,7 @@ pub async fn info( Ok(res) } -lazy_static! { +lazy_static::lazy_static! { static ref USER_MOUNTS: Mutex>> = Mutex::new(BTreeMap::new()); } @@ -287,11 +286,10 @@ pub async fn mount( Ok(res) } - #[command(display(display_none))] #[instrument(skip_all)] pub async fn umount( - #[context] ctx: RpcContext, + #[context] _ctx: RpcContext, #[arg(rename = "target-id")] target_id: Option, ) -> Result<(), Error> { let mut mounts = USER_MOUNTS.lock().await; diff --git a/backend/src/config/action.rs b/backend/src/config/action.rs index 3d349c846..27cd1683f 100644 --- a/backend/src/config/action.rs +++ b/backend/src/config/action.rs @@ -2,7 +2,6 @@ use std::collections::{BTreeMap, BTreeSet}; use color_eyre::eyre::eyre; use models::ImageId; -use nix::sys::signal::Signal; use patch_db::HasModel; use serde::{Deserialize, Serialize}; use tracing::instrument; @@ -10,6 +9,7 @@ use tracing::instrument; use super::{Config, ConfigSpec}; use crate::context::RpcContext; use crate::dependencies::Dependencies; +use crate::prelude::*; use crate::procedure::docker::DockerContainers; use crate::procedure::{PackageProcedure, ProcedureName}; use crate::s9pk::manifest::PackageId; @@ -18,7 +18,7 @@ use crate::util::Version; use crate::volume::Volumes; use crate::{Error, ResultExt}; -#[derive(Debug, Deserialize, Serialize, HasModel)] +#[derive(Debug, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct ConfigRes { pub config: Option, @@ -26,6 +26,7 @@ pub struct ConfigRes { } #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] +#[model = "Model"] pub struct ConfigActions { pub get: PackageProcedure, pub set: PackageProcedure, @@ -34,7 +35,7 @@ impl ConfigActions { #[instrument(skip_all)] pub fn validate( &self, - container: &Option, + _container: &Option, eos_version: &Version, volumes: &Volumes, image_ids: &BTreeSet, diff --git a/backend/src/config/mod.rs b/backend/src/config/mod.rs index ece30deeb..2d3a30fd7 100644 --- a/backend/src/config/mod.rs +++ b/backend/src/config/mod.rs @@ -1,25 +1,21 @@ use std::collections::BTreeMap; use std::path::PathBuf; +use std::sync::Arc; use std::time::Duration; use color_eyre::eyre::eyre; use indexmap::IndexSet; use itertools::Itertools; -use models::ErrorKind; -use patch_db::{DbHandle, LockReceipt, LockTarget, LockTargetId, LockType, Verifier}; +use models::{ErrorKind, OptionExt}; +use patch_db::value::InternedString; +use patch_db::Value; use regex::Regex; use rpc_toolkit::command; -use serde_json::Value; use tracing::instrument; use crate::context::RpcContext; -use crate::db::model::{CurrentDependencies, CurrentDependents}; -use crate::dependencies::{ - BreakTransitiveReceipts, BreakageRes, Dependencies, DependencyConfig, DependencyErrors, - DependencyReceipt, TaggedDependencyError, TryHealReceipts, -}; -use crate::install::cleanup::UpdateDependencyReceipts; -use crate::procedure::docker::DockerContainers; +use crate::db::model::CurrentDependencies; +use crate::prelude::*; use crate::s9pk::manifest::{Manifest, PackageId}; use crate::util::display_none; use crate::util::serde::{display_serializable, parse_stdin_deserializable, IoFormat}; @@ -32,10 +28,10 @@ pub mod util; pub use spec::{ConfigSpec, Defaultable}; use util::NumRange; -use self::action::{ConfigActions, ConfigRes}; -use self::spec::{ConfigPointerReceipts, ValueSpecPointer}; +use self::action::ConfigRes; +use self::spec::ValueSpecPointer; -pub type Config = serde_json::Map; +pub type Config = patch_db::value::InOMap; pub trait TypeOf { fn type_of(&self) -> &'static str; } @@ -79,7 +75,7 @@ pub struct TimeoutError; #[derive(Clone, Debug, thiserror::Error)] pub struct NoMatchWithPath { - pub path: Vec, + pub path: Vec, pub error: MatchError, } impl NoMatchWithPath { @@ -89,7 +85,7 @@ impl NoMatchWithPath { error, } } - pub fn prepend(mut self, seg: String) -> Self { + pub fn prepend(mut self, seg: InternedString) -> Self { self.path.push(seg); self } @@ -108,9 +104,9 @@ impl From for Error { #[derive(Clone, Debug, thiserror::Error)] pub enum MatchError { #[error("String {0:?} Does Not Match Pattern {1}")] - Pattern(String, Regex), + Pattern(Arc, Regex), #[error("String {0:?} Is Not In Enum {1:?}")] - Enum(String, IndexSet), + Enum(Arc, IndexSet), #[error("Field Is Not Nullable")] NotNullable, #[error("Length Mismatch: expected {0}, actual: {1}")] @@ -122,11 +118,11 @@ pub enum MatchError { #[error("Number Is Not Integral: {0}")] NonIntegral(f64), #[error("Variant {0:?} Is Not In Union {1:?}")] - Union(String, IndexSet), + Union(Arc, IndexSet), #[error("Variant Is Missing Tag {0:?}")] - MissingTag(String), + MissingTag(InternedString), #[error("Property {0:?} Of Variant {1:?} Conflicts With Union Tag")] - PropertyMatchesUnionTag(String, String), + PropertyMatchesUnionTag(InternedString, String), #[error("Name of Property {0:?} Conflicts With Map Tag Name")] PropertyNameMatchesMapTag(String), #[error("Pointer Is Invalid: {0}")] @@ -162,55 +158,6 @@ pub fn config(#[arg] id: PackageId) -> Result { Ok(id) } -pub struct ConfigGetReceipts { - manifest_volumes: LockReceipt, - manifest_version: LockReceipt, - manifest_config: LockReceipt, ()>, -} - -impl ConfigGetReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle, id: &PackageId) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks, id); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - id: &PackageId, - ) -> impl FnOnce(&Verifier) -> Result { - let manifest_version = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.manifest().version()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let manifest_volumes = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.manifest().volumes()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let manifest_config = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.manifest().config()) - .make_locker(LockType::Write) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - manifest_volumes: manifest_volumes.verify(skeleton_key)?, - manifest_version: manifest_version.verify(skeleton_key)?, - manifest_config: manifest_config.verify(skeleton_key)?, - }) - } - } -} - #[command(display(display_serializable))] #[instrument(skip_all)] pub async fn get( @@ -220,16 +167,21 @@ pub async fn get( #[arg(long = "format")] format: Option, ) -> Result { - let mut db = ctx.db.handle(); - let receipts = ConfigGetReceipts::new(&mut db, &id).await?; - let action = receipts - .manifest_config - .get(&mut db) - .await? + let db = ctx.db.peek().await?; + let manifest = db + .as_package_data() + .as_idx(&id) + .or_not_found(&id)? + .as_installed() + .or_not_found(&id)? + .as_manifest(); + let action = manifest + .as_config() + .de()? .ok_or_else(|| Error::new(eyre!("{} has no config", id), crate::ErrorKind::NotFound))?; - let volumes = receipts.manifest_volumes.get(&mut db).await?; - let version = receipts.manifest_version.get(&mut db).await?; + let volumes = manifest.as_volumes().de()?; + let version = manifest.as_version().de()?; action.get(&ctx, &id, &version, &volumes).await } @@ -250,172 +202,12 @@ pub fn set( Ok((id, config, timeout.map(|d| *d))) } -/// So, the new locking finds all the possible locks and lifts them up into a bundle of locks. -/// Then this bundle will be passed down into the functions that will need to touch the db, and -/// instead of doing the locks down in the system, we have already done the locks and can -/// do the operation on the db. -/// An UnlockedLock has two types, the type of setting and getting from the db, and the second type -/// is the keys that we need to insert on getting/setting because we have included wild cards into the paths. -pub struct ConfigReceipts { - pub dependency_receipt: DependencyReceipt, - pub config_receipts: ConfigPointerReceipts, - pub update_dependency_receipts: UpdateDependencyReceipts, - pub try_heal_receipts: TryHealReceipts, - pub break_transitive_receipts: BreakTransitiveReceipts, - pub configured: LockReceipt, - pub config_actions: LockReceipt, - pub dependencies: LockReceipt, - pub volumes: LockReceipt, - pub version: LockReceipt, - pub manifest: LockReceipt, - pub system_pointers: LockReceipt, String>, - pub current_dependents: LockReceipt, - pub current_dependencies: LockReceipt, - pub dependency_errors: LockReceipt, - pub manifest_dependencies_config: LockReceipt, - pub docker_containers: LockReceipt, -} - -impl ConfigReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup(locks: &mut Vec) -> impl FnOnce(&Verifier) -> Result { - let dependency_receipt = DependencyReceipt::setup(locks); - let config_receipts = ConfigPointerReceipts::setup(locks); - let update_dependency_receipts = UpdateDependencyReceipts::setup(locks); - let break_transitive_receipts = BreakTransitiveReceipts::setup(locks); - let try_heal_receipts = TryHealReceipts::setup(locks); - - let configured: LockTarget = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.status().configured()) - .make_locker(LockType::Write) - .add_to_keys(locks); - - let config_actions = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .and_then(|x| x.manifest().config()) - .make_locker(LockType::Read) - .add_to_keys(locks); - - let dependencies = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest().dependencies()) - .make_locker(LockType::Read) - .add_to_keys(locks); - - let volumes = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest().volumes()) - .make_locker(LockType::Read) - .add_to_keys(locks); - - let version = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest().version()) - .make_locker(LockType::Read) - .add_to_keys(locks); - - let manifest = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest()) - .make_locker(LockType::Read) - .add_to_keys(locks); - - let system_pointers = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.system_pointers()) - .make_locker(LockType::Write) - .add_to_keys(locks); - - let current_dependents = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.current_dependents()) - .make_locker(LockType::Write) - .add_to_keys(locks); - - let current_dependencies = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.current_dependencies()) - .make_locker(LockType::Write) - .add_to_keys(locks); - - let dependency_errors = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.status().dependency_errors()) - .make_locker(LockType::Write) - .add_to_keys(locks); - - let manifest_dependencies_config = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .and_then(|x| x.manifest().dependencies().star().config()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let docker_containers = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .and_then(|x| x.manifest().containers()) - .make_locker(LockType::Write) - .add_to_keys(locks); - - move |skeleton_key| { - Ok(Self { - dependency_receipt: dependency_receipt(skeleton_key)?, - config_receipts: config_receipts(skeleton_key)?, - try_heal_receipts: try_heal_receipts(skeleton_key)?, - break_transitive_receipts: break_transitive_receipts(skeleton_key)?, - update_dependency_receipts: update_dependency_receipts(skeleton_key)?, - configured: configured.verify(skeleton_key)?, - config_actions: config_actions.verify(skeleton_key)?, - dependencies: dependencies.verify(skeleton_key)?, - volumes: volumes.verify(skeleton_key)?, - version: version.verify(skeleton_key)?, - manifest: manifest.verify(skeleton_key)?, - system_pointers: system_pointers.verify(skeleton_key)?, - current_dependents: current_dependents.verify(skeleton_key)?, - current_dependencies: current_dependencies.verify(skeleton_key)?, - dependency_errors: dependency_errors.verify(skeleton_key)?, - manifest_dependencies_config: manifest_dependencies_config.verify(skeleton_key)?, - docker_containers: docker_containers.verify(skeleton_key)?, - }) - } - } -} - #[command(rename = "dry", display(display_serializable))] #[instrument(skip_all)] pub async fn set_dry( #[context] ctx: RpcContext, #[parent_data] (id, config, timeout): (PackageId, Option, Option), -) -> Result { +) -> Result, Error> { let breakages = BTreeMap::new(); let overrides = Default::default(); @@ -428,11 +220,11 @@ pub async fn set_dry( }; let breakages = configure(&ctx, &id, configure_context).await?; - Ok(BreakageRes(breakages)) + Ok(breakages) } pub struct ConfigureContext { - pub breakages: BTreeMap, + pub breakages: BTreeMap, pub timeout: Option, pub config: Option, pub overrides: BTreeMap, @@ -463,20 +255,15 @@ pub async fn configure( ctx: &RpcContext, id: &PackageId, configure_context: ConfigureContext, -) -> Result, Error> { - let mut db = ctx.db.handle(); - let version = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .expect(&mut db) - .await? - .installed() - .expect(&mut db) - .await? - .manifest() - .version() - .get(&mut ctx.db.handle()) - .await?; +) -> Result, Error> { + let db = ctx.db.peek().await?; + let package = db + .as_package_data() + .as_idx(id) + .or_not_found(&id)? + .as_installed() + .or_not_found(&id)?; + let version = package.as_manifest().as_version().de()?; ctx.managers .get(&(id.clone(), version.clone())) .await @@ -499,63 +286,3 @@ macro_rules! not_found { }; } pub(crate) use not_found; - -/// We want to have a double check that the paths are what we expect them to be. -/// Found that earlier the paths where not what we expected them to be. -#[tokio::test] -async fn ensure_creation_of_config_paths_makes_sense() { - let mut fake = patch_db::test_utils::NoOpDb(); - let config_locks = ConfigReceipts::new(&mut fake).await.unwrap(); - assert_eq!( - &format!("{}", config_locks.configured.lock.glob), - "/package-data/*/installed/status/configured" - ); - assert_eq!( - &format!("{}", config_locks.config_actions.lock.glob), - "/package-data/*/installed/manifest/config" - ); - assert_eq!( - &format!("{}", config_locks.dependencies.lock.glob), - "/package-data/*/installed/manifest/dependencies" - ); - assert_eq!( - &format!("{}", config_locks.volumes.lock.glob), - "/package-data/*/installed/manifest/volumes" - ); - assert_eq!( - &format!("{}", config_locks.version.lock.glob), - "/package-data/*/installed/manifest/version" - ); - assert_eq!( - &format!("{}", config_locks.volumes.lock.glob), - "/package-data/*/installed/manifest/volumes" - ); - assert_eq!( - &format!("{}", config_locks.manifest.lock.glob), - "/package-data/*/installed/manifest" - ); - assert_eq!( - &format!("{}", config_locks.manifest.lock.glob), - "/package-data/*/installed/manifest" - ); - assert_eq!( - &format!("{}", config_locks.system_pointers.lock.glob), - "/package-data/*/installed/system-pointers" - ); - assert_eq!( - &format!("{}", config_locks.current_dependents.lock.glob), - "/package-data/*/installed/current-dependents" - ); - assert_eq!( - &format!("{}", config_locks.dependency_errors.lock.glob), - "/package-data/*/installed/status/dependency-errors" - ); - assert_eq!( - &format!("{}", config_locks.manifest_dependencies_config.lock.glob), - "/package-data/*/installed/manifest/dependencies/*/config" - ); - assert_eq!( - &format!("{}", config_locks.system_pointers.lock.glob), - "/package-data/*/installed/system-pointers" - ); -} diff --git a/backend/src/config/spec.rs b/backend/src/config/spec.rs index 7aafad1b3..b11cefaf2 100644 --- a/backend/src/config/spec.rs +++ b/backend/src/config/spec.rs @@ -9,15 +9,16 @@ use std::sync::Arc; use std::time::Duration; use async_trait::async_trait; +use imbl::Vector; +use imbl_value::InternedString; use indexmap::{IndexMap, IndexSet}; use itertools::Itertools; use jsonpath_lib::Compiled as CompiledJsonPath; -use patch_db::{DbHandle, LockReceipt, LockType}; +use patch_db::value::{Number, Value}; use rand::{CryptoRng, Rng}; use regex::Regex; use serde::de::{MapAccess, Visitor}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use serde_json::{Number, Value}; use sqlx::PgPool; use super::util::{self, CharSet, NumRange, UniqueBy, STATIC_NULL}; @@ -26,8 +27,8 @@ use crate::config::ConfigurationError; use crate::context::RpcContext; use crate::net::interface::InterfaceId; use crate::net::keys::Key; +use crate::prelude::*; use crate::s9pk::manifest::{Manifest, PackageId}; -use crate::Error; // Config Value Specifications #[async_trait] @@ -39,14 +40,12 @@ pub trait ValueSpec { // since not all inVariant can be checked by the type fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath>; // update is to fill in values for environment pointers recursively - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError>; // returns all pointers that are live in the provided config fn pointers(&self, value: &Value) -> Result, NoMatchWithPath>; @@ -156,17 +155,15 @@ where fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { self.inner.validate(manifest) } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { self.inner - .update(ctx, db, manifest, config_overrides, value, receipts) + .update(ctx, manifest, config_overrides, value) .await } fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { @@ -201,17 +198,15 @@ where fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { self.inner.validate(manifest) } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { self.inner - .update(ctx, db, manifest, config_overrides, value, receipts) + .update(ctx, manifest, config_overrides, value) .await } fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { @@ -279,17 +274,15 @@ where fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { self.inner.validate(manifest) } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { self.inner - .update(ctx, db, manifest, config_overrides, value, receipts) + .update(ctx, manifest, config_overrides, value) .await } fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { @@ -394,48 +387,22 @@ impl ValueSpec for ValueSpecAny { ValueSpecAny::Pointer(a) => a.validate(manifest), } } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { match self { - ValueSpecAny::Boolean(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecAny::Enum(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecAny::List(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecAny::Number(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecAny::Object(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecAny::String(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecAny::Union(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecAny::Pointer(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } + ValueSpecAny::Boolean(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecAny::Enum(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecAny::List(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecAny::Number(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecAny::Object(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecAny::String(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecAny::Union(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecAny::Pointer(a) => a.update(ctx, manifest, config_overrides, value).await, } } fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { @@ -513,14 +480,12 @@ impl ValueSpec for ValueSpecBoolean { fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { Ok(()) } - async fn update( + async fn update( &self, _ctx: &RpcContext, - _db: &mut Db, _manifest: &Manifest, _config_overrides: &BTreeMap, _value: &mut Value, - _receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { Ok(()) } @@ -584,7 +549,7 @@ impl ValueSpec for ValueSpecEnum { fn matches(&self, val: &Value) -> Result<(), NoMatchWithPath> { match val { Value::String(b) => { - if self.values.contains(b) { + if self.values.contains(&**b) { Ok(()) } else { Err(NoMatchWithPath::new(MatchError::Enum( @@ -603,14 +568,12 @@ impl ValueSpec for ValueSpecEnum { fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { Ok(()) } - async fn update( + async fn update( &self, _ctx: &RpcContext, - _db: &mut Db, _manifest: &Manifest, _config_overrides: &BTreeMap, _value: &mut Value, - _receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { Ok(()) } @@ -628,7 +591,7 @@ impl ValueSpec for ValueSpecEnum { } } impl DefaultableWith for ValueSpecEnum { - type DefaultSpec = String; + type DefaultSpec = Arc; type Error = crate::util::Never; fn gen_with( @@ -666,13 +629,13 @@ where .map(|(i, v)| { self.spec .matches(v) - .map_err(|e| e.prepend(format!("{}", i)))?; + .map_err(|e| e.prepend(InternedString::from_display(&i)))?; if l.iter() .enumerate() .any(|(i2, v2)| i != i2 && self.spec.eq(v, v2)) { Err(NoMatchWithPath::new(MatchError::ListUniquenessViolation) - .prepend(format!("{}", i))) + .prepend(InternedString::from_display(&i))) } else { Ok(()) } @@ -690,25 +653,19 @@ where fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { self.spec.validate(manifest) } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { if let Value::Array(ref mut ls) = value { - for (i, val) in ls.into_iter().enumerate() { - match self - .spec - .update(ctx, db, manifest, config_overrides, val, receipts) - .await - { - Err(ConfigurationError::NoMatch(e)) => { - Err(ConfigurationError::NoMatch(e.prepend(format!("{}", i)))) - } + for (i, val) in ls.iter_mut().enumerate() { + match self.spec.update(ctx, manifest, config_overrides, val).await { + Err(ConfigurationError::NoMatch(e)) => Err(ConfigurationError::NoMatch( + e.prepend(InternedString::from_display(&i)), + )), a => a, }?; } @@ -755,9 +712,9 @@ where rng: &mut R, timeout: &Option, ) -> Result { - let mut res = Vec::new(); + let mut res = Vector::new(); for spec_member in spec.iter() { - res.push(self.spec.gen_with(spec_member, rng, timeout)?); + res.push_back(self.spec.gen_with(spec_member, rng, timeout)?); } Ok(Value::Array(res)) } @@ -798,36 +755,19 @@ impl ValueSpec for ValueSpecList { ValueSpecList::Union(a) => a.validate(manifest), } } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { match self { - ValueSpecList::Enum(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecList::Number(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecList::Object(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecList::String(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecList::Union(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } + ValueSpecList::Enum(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecList::Number(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecList::Object(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecList::String(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecList::Union(a) => a.update(ctx, manifest, config_overrides, value).await, } } fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { @@ -885,7 +825,7 @@ impl Defaultable for ValueSpecList { ) .contains(&ret.len()) { - ret.push( + ret.push_back( a.inner .inner .spec @@ -941,14 +881,12 @@ impl ValueSpec for ValueSpecNumber { fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { Ok(()) } - async fn update( + async fn update( &self, _ctx: &RpcContext, - _db: &mut Db, _manifest: &Manifest, _config_overrides: &BTreeMap, _value: &mut Value, - _receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { Ok(()) } @@ -1005,19 +943,15 @@ impl ValueSpec for ValueSpecObject { fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { self.spec.validate(manifest) } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { if let Value::Object(o) = value { - self.spec - .update(ctx, db, manifest, config_overrides, o, receipts) - .await + self.spec.update(ctx, manifest, config_overrides, o).await } else { Err(ConfigurationError::NoMatch(NoMatchWithPath::new( MatchError::InvalidType("object", value.type_of()), @@ -1074,11 +1008,11 @@ impl Defaultable for ValueSpecObject { } #[derive(Clone, Debug, Default, Serialize, Deserialize)] -pub struct ConfigSpec(pub IndexMap); +pub struct ConfigSpec(pub IndexMap); impl ConfigSpec { pub fn matches(&self, value: &Config) -> Result<(), NoMatchWithPath> { for (key, val) in self.0.iter() { - if let Some(v) = value.get(key) { + if let Some(v) = value.get(&**key) { val.matches(v).map_err(|e| e.prepend(key.clone()))?; } else { val.matches(&Value::Null) @@ -1108,27 +1042,21 @@ impl ConfigSpec { Ok(()) } - pub async fn update( + pub async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, cfg: &mut Config, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { for (k, vs) in self.0.iter() { match cfg.get_mut(k) { None => { let mut v = Value::Null; - vs.update(ctx, db, manifest, config_overrides, &mut v, receipts) - .await?; + vs.update(ctx, manifest, config_overrides, &mut v).await?; cfg.insert(k.clone(), v); } - Some(v) => match vs - .update(ctx, db, manifest, config_overrides, v, receipts) - .await - { + Some(v) => match vs.update(ctx, manifest, config_overrides, v).await { Err(ConfigurationError::NoMatch(e)) => { Err(ConfigurationError::NoMatch(e.prepend(k.clone()))) } @@ -1247,7 +1175,7 @@ impl<'de> Deserialize<'de> for ValueSpecString { }) } } - const FIELDS: &'static [&'static str] = &[ + const FIELDS: &[&str] = &[ "pattern", "pattern-description", "textarea", @@ -1268,7 +1196,7 @@ impl ValueSpec for ValueSpecString { Ok(()) } else { Err(NoMatchWithPath::new(MatchError::Pattern( - s.to_owned(), + s.clone(), pattern.pattern.clone(), ))) } @@ -1286,14 +1214,12 @@ impl ValueSpec for ValueSpecString { fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { Ok(()) } - async fn update( + async fn update( &self, _ctx: &RpcContext, - _db: &mut Db, _manifest: &Manifest, _config_overrides: &BTreeMap, _value: &mut Value, - _receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { Ok(()) } @@ -1352,11 +1278,11 @@ pub enum DefaultString { Entropy(Entropy), } impl DefaultString { - pub fn gen(&self, rng: &mut R) -> String { - match self { + pub fn gen(&self, rng: &mut R) -> Arc { + Arc::new(match self { DefaultString::Literal(s) => s.clone(), DefaultString::Entropy(e) => e.gen(rng), - } + }) } } @@ -1380,7 +1306,7 @@ impl Entropy { #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct UnionTag { - pub id: String, + pub id: InternedString, pub name: String, pub description: Option, pub variant_names: BTreeMap, @@ -1401,7 +1327,7 @@ impl<'de> serde::de::Deserialize<'de> for ValueSpecUnion { #[serde(rename_all = "kebab-case")] #[serde(untagged)] pub enum _UnionTag { - Old(String), + Old(InternedString), New(UnionTag), } #[derive(Deserialize)] @@ -1419,7 +1345,7 @@ impl<'de> serde::de::Deserialize<'de> for ValueSpecUnion { tag: match u.tag { _UnionTag::Old(id) => UnionTag { id: id.clone(), - name: id, + name: id.to_string(), description: None, variant_names: u .variants @@ -1461,10 +1387,10 @@ impl ValueSpec for ValueSpecUnion { fn matches(&self, value: &Value) -> Result<(), NoMatchWithPath> { match value { Value::Object(o) => { - if let Some(Value::String(ref tag)) = o.get(&self.tag.id) { - if let Some(obj_spec) = self.variants.get(tag) { + if let Some(Value::String(ref tag)) = o.get(&*self.tag.id) { + if let Some(obj_spec) = self.variants.get(&**tag) { let mut without_tag = o.clone(); - without_tag.remove(&self.tag.id); + without_tag.remove(&*self.tag.id); obj_spec.matches(&without_tag) } else { Err(NoMatchWithPath::new(MatchError::Union( @@ -1487,7 +1413,7 @@ impl ValueSpec for ValueSpecUnion { } fn validate(&self, manifest: &Manifest) -> Result<(), NoMatchWithPath> { for (name, variant) in &self.variants { - if variant.0.get(&self.tag.id).is_some() { + if variant.0.get(&*self.tag.id).is_some() { return Err(NoMatchWithPath::new(MatchError::PropertyMatchesUnionTag( self.tag.id.clone(), name.clone(), @@ -1497,28 +1423,23 @@ impl ValueSpec for ValueSpecUnion { } Ok(()) } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { if let Value::Object(o) = value { - match o.get(&self.tag.id) { + match o.get(&*self.tag.id) { None => Err(ConfigurationError::NoMatch(NoMatchWithPath::new( MatchError::MissingTag(self.tag.id.clone()), ))), - Some(Value::String(tag)) => match self.variants.get(tag) { + Some(Value::String(tag)) => match self.variants.get(&**tag) { None => Err(ConfigurationError::NoMatch(NoMatchWithPath::new( MatchError::Union(tag.clone(), self.variants.keys().cloned().collect()), ))), - Some(spec) => { - spec.update(ctx, db, manifest, config_overrides, o, receipts) - .await - } + Some(spec) => spec.update(ctx, manifest, config_overrides, o).await, }, Some(other) => Err(ConfigurationError::NoMatch( NoMatchWithPath::new(MatchError::InvalidType("string", other.type_of())) @@ -1533,11 +1454,11 @@ impl ValueSpec for ValueSpecUnion { } fn pointers(&self, value: &Value) -> Result, NoMatchWithPath> { if let Value::Object(o) = value { - match o.get(&self.tag.id) { + match o.get(&*self.tag.id) { None => Err(NoMatchWithPath::new(MatchError::MissingTag( self.tag.id.clone(), ))), - Some(Value::String(tag)) => match self.variants.get(tag) { + Some(Value::String(tag)) => match self.variants.get(&**tag) { None => Err(NoMatchWithPath::new(MatchError::Union( tag.clone(), self.variants.keys().cloned().collect(), @@ -1559,8 +1480,8 @@ impl ValueSpec for ValueSpecUnion { } fn requires(&self, id: &PackageId, value: &Value) -> bool { if let Value::Object(o) = value { - match o.get(&self.tag.id) { - Some(Value::String(tag)) => match self.variants.get(tag) { + match o.get(&*self.tag.id) { + Some(Value::String(tag)) => match self.variants.get(&**tag) { None => false, Some(spec) => spec.requires(id, o), }, @@ -1578,7 +1499,7 @@ impl ValueSpec for ValueSpecUnion { } } impl DefaultableWith for ValueSpecUnion { - type DefaultSpec = String; + type DefaultSpec = Arc; type Error = ConfigurationError; fn gen_with( @@ -1587,7 +1508,7 @@ impl DefaultableWith for ValueSpecUnion { rng: &mut R, timeout: &Option, ) -> Result { - let variant = if let Some(v) = self.variants.get(spec) { + let variant = if let Some(v) = self.variants.get(&**spec) { v } else { return Err(ConfigurationError::NoMatch(NoMatchWithPath::new( @@ -1643,24 +1564,16 @@ impl ValueSpec for ValueSpecPointer { ValueSpecPointer::System(a) => a.validate(manifest), } } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { match self { - ValueSpecPointer::Package(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } - ValueSpecPointer::System(a) => { - a.update(ctx, db, manifest, config_overrides, value, receipts) - .await - } + ValueSpecPointer::Package(a) => a.update(ctx, manifest, config_overrides, value).await, + ValueSpecPointer::System(a) => a.update(ctx, manifest, config_overrides, value).await, } } fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { @@ -1697,23 +1610,17 @@ impl PackagePointerSpec { PackagePointerSpec::Config(ConfigPointer { package_id, .. }) => package_id, } } - async fn deref( + async fn deref( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, - receipts: &ConfigPointerReceipts, ) -> Result { match &self { PackagePointerSpec::TorKey(key) => key.deref(&manifest.id, &ctx.secret_store).await, - PackagePointerSpec::TorAddress(tor) => { - tor.deref(db, &receipts.interface_addresses_receipt).await - } - PackagePointerSpec::LanAddress(lan) => { - lan.deref(db, &receipts.interface_addresses_receipt).await - } - PackagePointerSpec::Config(cfg) => cfg.deref(ctx, db, config_overrides, receipts).await, + PackagePointerSpec::TorAddress(tor) => tor.deref(ctx).await, + PackagePointerSpec::LanAddress(lan) => lan.deref(ctx).await, + PackagePointerSpec::Config(cfg) => cfg.deref(ctx, config_overrides).await, } } } @@ -1754,18 +1661,14 @@ impl ValueSpec for PackagePointerSpec { _ => Ok(()), } } - async fn update( + async fn update( &self, ctx: &RpcContext, - db: &mut Db, manifest: &Manifest, config_overrides: &BTreeMap, value: &mut Value, - receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { - *value = self - .deref(ctx, db, manifest, config_overrides, receipts) - .await?; + *value = self.deref(ctx, manifest, config_overrides).await?; Ok(()) } fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { @@ -1788,18 +1691,20 @@ pub struct TorAddressPointer { interface: InterfaceId, } impl TorAddressPointer { - async fn deref( - &self, - db: &mut Db, - receipt: &InterfaceAddressesReceipt, - ) -> Result { - let addr = receipt - .interface_addresses - .get(db, (&self.package_id, &self.interface)) + async fn deref(&self, ctx: &RpcContext) -> Result { + let addr = ctx + .db + .peek() .await - .map_err(|e| ConfigurationError::SystemError(Error::from(e)))? - .and_then(|addresses| addresses.tor_address); - Ok(addr.to_owned().map(Value::String).unwrap_or(Value::Null)) + .map_err(|e| ConfigurationError::SystemError(e))? + .as_package_data() + .as_idx(&self.package_id) + .and_then(|pde| pde.as_installed()) + .and_then(|i| i.as_interface_addresses().as_idx(&self.interface)) + .and_then(|a| a.as_tor_address().de().transpose()) + .transpose() + .map_err(|e| ConfigurationError::SystemError(e))?; + Ok(addr.map(Arc::new).map(Value::String).unwrap_or(Value::Null)) } } impl fmt::Display for TorAddressPointer { @@ -1813,39 +1718,6 @@ impl fmt::Display for TorAddressPointer { } } -pub struct InterfaceAddressesReceipt { - interface_addresses: LockReceipt, -} - -impl InterfaceAddressesReceipt { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - // let cleanup_receipts = CleanupFailedReceipts::setup(locks); - - let interface_addresses = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.interface_addresses().star()) - .make_locker(LockType::Read) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - // cleanup_receipts: cleanup_receipts(skeleton_key)?, - interface_addresses: interface_addresses.verify(skeleton_key)?, - }) - } - } -} - #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct LanAddressPointer { @@ -1862,73 +1734,27 @@ impl fmt::Display for LanAddressPointer { } } impl LanAddressPointer { - async fn deref( - &self, - db: &mut Db, - receipts: &InterfaceAddressesReceipt, - ) -> Result { - let addr = receipts - .interface_addresses - .get(db, (&self.package_id, &self.interface)) + async fn deref(&self, ctx: &RpcContext) -> Result { + let addr = ctx + .db + .peek() .await - .ok() - .flatten() - .and_then(|x| x.lan_address); - Ok(addr.to_owned().map(Value::String).unwrap_or(Value::Null)) + .map_err(|e| ConfigurationError::SystemError(e))? + .as_package_data() + .as_idx(&self.package_id) + .and_then(|pde| pde.as_installed()) + .and_then(|i| i.as_interface_addresses().as_idx(&self.interface)) + .and_then(|a| a.as_lan_address().de().transpose()) + .transpose() + .map_err(|e| ConfigurationError::SystemError(e))?; + Ok(addr + .to_owned() + .map(Arc::new) + .map(Value::String) + .unwrap_or(Value::Null)) } } -pub struct ConfigPointerReceipts { - interface_addresses_receipt: InterfaceAddressesReceipt, - manifest_volumes: LockReceipt, - manifest_version: LockReceipt, - config_actions: LockReceipt, -} - -impl ConfigPointerReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - let interface_addresses_receipt = InterfaceAddressesReceipt::setup(locks); - - let manifest_volumes = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest().volumes()) - .make_locker(LockType::Read) - .add_to_keys(locks); - let manifest_version = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest().version()) - .make_locker(LockType::Read) - .add_to_keys(locks); - let config_actions = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .and_then(|x| x.manifest().config()) - .make_locker(LockType::Read) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - interface_addresses_receipt: interface_addresses_receipt(skeleton_key)?, - manifest_volumes: manifest_volumes.verify(skeleton_key)?, - config_actions: config_actions.verify(skeleton_key)?, - manifest_version: manifest_version.verify(skeleton_key)?, - }) - } - } -} #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct ConfigPointer { @@ -1940,25 +1766,38 @@ impl ConfigPointer { pub fn select(&self, val: &Value) -> Value { self.selector.select(self.multi, val) } - async fn deref( + async fn deref( &self, ctx: &RpcContext, - db: &mut Db, config_overrides: &BTreeMap, - receipts: &ConfigPointerReceipts, ) -> Result { if let Some(cfg) = config_overrides.get(&self.package_id) { Ok(self.select(&Value::Object(cfg.clone()))) } else { let id = &self.package_id; - let version = receipts.manifest_version.get(db, id).await.ok().flatten(); - let cfg_actions = receipts.config_actions.get(db, id).await.ok().flatten(); - let volumes = receipts.manifest_volumes.get(db, id).await.ok().flatten(); - if let (Some(version), Some(cfg_actions), Some(volumes)) = - (&version, &cfg_actions, &volumes) - { + let db = ctx + .db + .peek() + .await + .map_err(|e| ConfigurationError::SystemError(e))?; + let manifest = db.as_package_data().as_idx(id).map(|pde| pde.as_manifest()); + let cfg_actions = manifest.and_then(|m| m.as_config().transpose_ref()); + if let (Some(manifest), Some(cfg_actions)) = (manifest, cfg_actions) { let cfg_res = cfg_actions - .get(ctx, &self.package_id, version, volumes) + .de() + .map_err(|e| ConfigurationError::SystemError(e))? + .get( + ctx, + &self.package_id, + &manifest + .as_version() + .de() + .map_err(|e| ConfigurationError::SystemError(e))?, + &manifest + .as_volumes() + .de() + .map_err(|e| ConfigurationError::SystemError(e))?, + ) .await .map_err(|e| ConfigurationError::SystemError(e))?; if let Some(cfg) = cfg_res.config { @@ -1990,7 +1829,7 @@ pub struct ConfigSelector { } impl ConfigSelector { fn select(&self, multi: bool, val: &Value) -> Value { - let selected = self.compiled.select(&val).ok().unwrap_or_else(Vec::new); + let selected = self.compiled.select(&val).ok().unwrap_or_else(Vector::new); if multi { Value::Array(selected.into_iter().cloned().collect()) } else { @@ -2069,10 +1908,10 @@ impl TorKeyPointer { ) .await .map_err(ConfigurationError::SystemError)?; - Ok(Value::String(base32::encode( + Ok(Value::String(Arc::new(base32::encode( base32::Alphabet::RFC4648 { padding: false }, &key.tor_key().as_bytes(), - ))) + )))) } } impl fmt::Display for TorKeyPointer { @@ -2092,7 +1931,7 @@ impl fmt::Display for SystemPointerSpec { } } impl SystemPointerSpec { - async fn deref(&self, _db: &mut Db) -> Result { + async fn deref(&self, _ctx: &RpcContext) -> Result { #[allow(unreachable_code)] Ok(match *self {}) } @@ -2115,17 +1954,14 @@ impl ValueSpec for SystemPointerSpec { fn validate(&self, _manifest: &Manifest) -> Result<(), NoMatchWithPath> { Ok(()) } - async fn update( + async fn update( &self, - _ctx: &RpcContext, - db: &mut Db, + ctx: &RpcContext, _manifest: &Manifest, _config_overrides: &BTreeMap, value: &mut Value, - - _receipts: &ConfigPointerReceipts, ) -> Result<(), ConfigurationError> { - *value = self.deref(db).await?; + *value = self.deref(ctx).await?; Ok(()) } fn pointers(&self, _value: &Value) -> Result, NoMatchWithPath> { diff --git a/backend/src/config/util.rs b/backend/src/config/util.rs index f6acd092e..359c24476 100644 --- a/backend/src/config/util.rs +++ b/backend/src/config/util.rs @@ -1,9 +1,9 @@ use std::borrow::Cow; use std::ops::{Bound, RangeBounds, RangeInclusive}; +use patch_db::Value; use rand::distributions::Distribution; use rand::Rng; -use serde_json::Value; use super::Config; @@ -321,7 +321,7 @@ impl UniqueBy { match self { UniqueBy::Any(any) => any.iter().any(|u| u.eq(lhs, rhs)), UniqueBy::All(all) => all.iter().all(|u| u.eq(lhs, rhs)), - UniqueBy::Exactly(key) => lhs.get(key) == rhs.get(key), + UniqueBy::Exactly(key) => lhs.get(&**key) == rhs.get(&**key), UniqueBy::NotUnique => false, } } diff --git a/backend/src/context/rpc.rs b/backend/src/context/rpc.rs index 119393fb0..f01ec2ce7 100644 --- a/backend/src/context/rpc.rs +++ b/backend/src/context/rpc.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use helpers::to_tmp_path; use josekit::jwk::Jwk; use patch_db::json_ptr::JsonPointer; -use patch_db::{DbHandle, LockReceipt, LockType, PatchDb}; +use patch_db::PatchDb; use reqwest::{Client, Proxy, Url}; use rpc_toolkit::Context; use serde::Deserialize; @@ -20,10 +20,11 @@ use tracing::instrument; use super::setup::CURRENT_SECRET; use crate::account::AccountInfo; use crate::core::rpc_continuations::{RequestGuid, RestHandler, RpcContinuation}; -use crate::db::model::{CurrentDependents, Database, InstalledPackageDataEntry, PackageDataEntry}; +use crate::db::model::{CurrentDependents, Database, PackageDataEntryMatchModelRef}; +use crate::db::prelude::PatchDbExt; use crate::disk::OsPartitionInfo; use crate::init::init_postgres; -use crate::install::cleanup::{cleanup_failed, uninstall, CleanupFailedReceipts}; +use crate::install::cleanup::{cleanup_failed, uninstall}; use crate::manager::ManagerMap; use crate::middleware::auth::HashSessionToken; use crate::net::net_controller::NetController; @@ -31,7 +32,7 @@ use crate::net::ssl::SslManager; use crate::net::wifi::WpaCli; use crate::notifications::NotificationManager; use crate::shutdown::Shutdown; -use crate::status::{MainStatus, Status}; +use crate::status::MainStatus; use crate::system::get_mem_info; use crate::util::config::load_config_from_paths; use crate::util::lshw::{lshw, LshwDevice}; @@ -128,49 +129,11 @@ pub struct Hardware { pub ram: u64, } -pub struct RpcCleanReceipts { - cleanup_receipts: CleanupFailedReceipts, - packages: LockReceipt, - package: LockReceipt, -} - -impl RpcCleanReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - let cleanup_receipts = CleanupFailedReceipts::setup(locks); - - let packages = crate::db::DatabaseModel::new() - .package_data() - .make_locker(LockType::Write) - .add_to_keys(locks); - let package = crate::db::DatabaseModel::new() - .package_data() - .star() - .make_locker(LockType::Write) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - cleanup_receipts: cleanup_receipts(skeleton_key)?, - packages: packages.verify(skeleton_key)?, - package: package.verify(skeleton_key)?, - }) - } - } -} - #[derive(Clone)] pub struct RpcContext(Arc); impl RpcContext { #[instrument(skip_all)] - pub async fn init + Send + 'static>( + pub async fn init + Send + Sync + 'static>( cfg_path: Option

, disk_guid: Arc, ) -> Result { @@ -203,7 +166,7 @@ impl RpcContext { ); tracing::info!("Initialized Net Controller"); let managers = ManagerMap::default(); - let metrics_cache = RwLock::new(None); + let metrics_cache = RwLock::>::new(None); let notification_manager = NotificationManager::new(secret_store.clone()); tracing::info!("Initialized Notification Manager"); let tor_proxy_url = format!("socks5h://{tor_proxy}"); @@ -253,16 +216,11 @@ impl RpcContext { hardware: Hardware { devices, ram }, }); - let res = Self(seed); + let res = Self(seed.clone()); res.cleanup().await?; tracing::info!("Cleaned up transient states"); - res.managers - .init( - &res, - &mut res.db.handle(), - &mut res.secret_store.acquire().await?, - ) - .await?; + let peeked = res.db.peek().await?; + res.managers.init(res.clone(), peeked).await?; tracing::info!("Initialized Package Managers"); Ok(res) } @@ -277,118 +235,103 @@ impl RpcContext { Ok(()) } - #[instrument(skip_all)] + #[instrument(skip(self))] pub async fn cleanup(&self) -> Result<(), Error> { - let mut db = self.db.handle(); - let receipts = RpcCleanReceipts::new(&mut db).await?; - let packages = receipts.packages.get(&mut db).await?.0; - let mut current_dependents = packages - .keys() - .map(|k| (k.clone(), BTreeMap::new())) - .collect::>(); - for (package_id, package) in packages { - for (k, v) in package - .into_installed() - .into_iter() - .flat_map(|i| i.current_dependencies.0) - { - let mut entry: BTreeMap<_, _> = current_dependents.remove(&k).unwrap_or_default(); - entry.insert(package_id.clone(), v); - current_dependents.insert(k, entry); - } - } - for (package_id, current_dependents) in current_dependents { - if let Some(deps) = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&package_id) - .and_then(|pde| pde.installed()) - .map::<_, CurrentDependents>(|i| i.current_dependents()) - .check(&mut db) - .await? - { - deps.put(&mut db, &CurrentDependents(current_dependents)) - .await?; - } else if let Some(deps) = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&package_id) - .and_then(|pde| pde.removing()) - .map::<_, CurrentDependents>(|i| i.current_dependents()) - .check(&mut db) - .await? - { - deps.put(&mut db, &CurrentDependents(current_dependents)) - .await?; - } - } - for (package_id, package) in receipts.packages.get(&mut db).await?.0 { - if let Err(e) = async { - match package { - PackageDataEntry::Installing { .. } - | PackageDataEntry::Restoring { .. } - | PackageDataEntry::Updating { .. } => { - cleanup_failed(self, &mut db, &package_id, &receipts.cleanup_receipts) - .await?; - } - PackageDataEntry::Removing { .. } => { - uninstall( - self, - &mut db, - &mut self.secret_store.acquire().await?, - &package_id, - ) - .await?; - } - PackageDataEntry::Installed { - installed, - static_files, - manifest, - } => { - for (volume_id, volume_info) in &*manifest.volumes { - let tmp_path = to_tmp_path(volume_info.path_for( - &self.datadir, - &package_id, - &manifest.version, - &volume_id, - )) - .with_kind(ErrorKind::Filesystem)?; - if tokio::fs::metadata(&tmp_path).await.is_ok() { - tokio::fs::remove_dir_all(&tmp_path).await?; - } - } - let status = installed.status; - let main = match status.main { - MainStatus::BackingUp { started, .. } => { - if let Some(_) = started { - MainStatus::Starting - } else { - MainStatus::Stopped - } - } - MainStatus::Running { .. } => MainStatus::Starting, - a => a.clone(), - }; - let new_package = PackageDataEntry::Installed { - installed: InstalledPackageDataEntry { - status: Status { main, ..status }, - ..installed - }, - static_files, - manifest, - }; - receipts - .package - .set(&mut db, new_package, &package_id) - .await?; + self.db + .mutate(|f| { + let mut current_dependents = f + .as_package_data() + .keys()? + .into_iter() + .map(|k| (k.clone(), BTreeMap::new())) + .collect::>(); + for (package_id, package) in f.as_package_data_mut().as_entries_mut()? { + for (k, v) in package + .as_installed_mut() + .into_iter() + .flat_map(|i| i.clone().into_current_dependencies().into_entries()) + .flatten() + { + let mut entry: BTreeMap<_, _> = + current_dependents.remove(&k).unwrap_or_default(); + entry.insert(package_id.clone(), v.de()?); + current_dependents.insert(k, entry); } } - Ok::<_, Error>(()) - } - .await - { + for (package_id, current_dependents) in current_dependents { + if let Some(deps) = f + .as_package_data_mut() + .as_idx_mut(&package_id) + .and_then(|pde| pde.expect_as_installed_mut().ok()) + .map(|i| i.as_installed_mut().as_current_dependents_mut()) + { + deps.ser(&CurrentDependents(current_dependents))?; + } else if let Some(deps) = f + .as_package_data_mut() + .as_idx_mut(&package_id) + .and_then(|pde| pde.expect_as_removing_mut().ok()) + .map(|i| i.as_removing_mut().as_current_dependents_mut()) + { + deps.ser(&CurrentDependents(current_dependents))?; + } + } + Ok(()) + }) + .await?; + let peek = self.db.peek().await?; + for (package_id, package) in peek.as_package_data().as_entries()?.into_iter() { + let package = package.clone(); + let action = match package.as_match() { + PackageDataEntryMatchModelRef::Installing(_) + | PackageDataEntryMatchModelRef::Restoring(_) + | PackageDataEntryMatchModelRef::Updating(_) => { + cleanup_failed(self, &package_id).await + } + PackageDataEntryMatchModelRef::Removing(_) => { + uninstall(self, &mut self.secret_store.acquire().await?, &package_id).await + } + PackageDataEntryMatchModelRef::Installed(m) => { + let version = m.as_manifest().as_version().clone().de()?; + let volumes = m.as_manifest().as_volumes().de()?; + for (volume_id, volume_info) in &*volumes { + let tmp_path = to_tmp_path(volume_info.path_for( + &self.datadir, + &package_id, + &version, + &volume_id, + )) + .with_kind(ErrorKind::Filesystem)?; + if tokio::fs::metadata(&tmp_path).await.is_ok() { + tokio::fs::remove_dir_all(&tmp_path).await?; + } + } + Ok(()) + } + _ => continue, + }; + if let Err(e) = action { tracing::error!("Failed to clean up package {}: {}", package_id, e); tracing::debug!("{:?}", e); } } + self.db + .mutate(|v| { + for (_, pde) in v.as_package_data_mut().as_entries_mut()? { + let status = pde + .expect_as_installed_mut()? + .as_installed_mut() + .as_status_mut() + .as_main_mut(); + let running = status.clone().de()?.running(); + status.ser(&if running { + MainStatus::Starting + } else { + MainStatus::Stopped + })?; + } + Ok(()) + }) + .await?; Ok(()) } diff --git a/backend/src/control.rs b/backend/src/control.rs index 794afc64a..a84fe7283 100644 --- a/backend/src/control.rs +++ b/backend/src/control.rs @@ -1,77 +1,27 @@ -use std::collections::BTreeMap; - use color_eyre::eyre::eyre; -use patch_db::{DbHandle, LockReceipt, LockType}; use rpc_toolkit::command; use tracing::instrument; use crate::context::RpcContext; -use crate::dependencies::{ - break_all_dependents_transitive, heal_all_dependents_transitive, BreakageRes, DependencyError, - DependencyReceipt, TaggedDependencyError, -}; +use crate::prelude::*; use crate::s9pk::manifest::PackageId; use crate::status::MainStatus; use crate::util::display_none; -use crate::util::serde::display_serializable; use crate::Error; -#[derive(Clone)] -pub struct StartReceipts { - dependency_receipt: DependencyReceipt, - status: LockReceipt, - version: LockReceipt, -} - -impl StartReceipts { - pub async fn new(db: &mut impl DbHandle, id: &PackageId) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks, id); - setup(&db.lock_all(locks).await?) - } - - pub fn setup( - locks: &mut Vec, - id: &PackageId, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - let dependency_receipt = DependencyReceipt::setup(locks); - let status = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.status().main()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let version = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.manifest().version()) - .make_locker(LockType::Read) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - dependency_receipt: dependency_receipt(skeleton_key)?, - status: status.verify(skeleton_key)?, - version: version.verify(skeleton_key)?, - }) - } - } -} - #[command(display(display_none), metadata(sync_db = true))] #[instrument(skip_all)] pub async fn start(#[context] ctx: RpcContext, #[arg] id: PackageId) -> Result<(), Error> { - let mut db = ctx.db.handle(); - let mut tx = db.begin().await?; - let receipts = StartReceipts::new(&mut tx, &id).await?; - let version = receipts.version.get(&mut tx).await?; - receipts.status.set(&mut tx, MainStatus::Starting).await?; - heal_all_dependents_transitive(&ctx, &mut tx, &id, &receipts.dependency_receipt).await?; - - tx.commit().await?; - drop(receipts); + let peek = ctx.db.peek().await?; + let version = peek + .as_package_data() + .as_idx(&id) + .or_not_found(&id)? + .as_installed() + .or_not_found(&id)? + .as_manifest() + .as_version() + .de()?; ctx.managers .get(&(id, version)) @@ -81,112 +31,33 @@ pub async fn start(#[context] ctx: RpcContext, #[arg] id: PackageId) -> Result<( Ok(()) } -#[derive(Clone)] -pub struct StopReceipts { - breaks: crate::dependencies::BreakTransitiveReceipts, - status: LockReceipt, -} -impl StopReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle, id: &PackageId) -> Result { - let mut locks = Vec::new(); +#[command(display(display_none), metadata(sync_db = true))] +pub async fn stop(#[context] ctx: RpcContext, #[arg] id: PackageId) -> Result { + let peek = ctx.db.peek().await?; + let version = peek + .as_package_data() + .as_idx(&id) + .or_not_found(&id)? + .as_installed() + .or_not_found(&id)? + .as_manifest() + .as_version() + .de()?; - let setup = Self::setup(&mut locks, id); - setup(&db.lock_all(locks).await?) - } + let last_statuts = ctx + .db + .mutate(|v| { + v.as_package_data_mut() + .as_idx_mut(&id) + .and_then(|x| x.as_installed_mut()) + .ok_or_else(|| Error::new(eyre!("{} is not installed", id), ErrorKind::NotFound))? + .as_status_mut() + .as_main_mut() + .replace(&MainStatus::Stopping) + }) + .await?; - pub fn setup( - locks: &mut Vec, - id: &PackageId, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - let breaks = crate::dependencies::BreakTransitiveReceipts::setup(locks); - let status = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.status().main()) - .make_locker(LockType::Write) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - breaks: breaks(skeleton_key)?, - status: status.verify(skeleton_key)?, - }) - } - } -} - -#[instrument(skip_all)] -pub async fn stop_common( - db: &mut Db, - id: &PackageId, - breakages: &mut BTreeMap, -) -> Result { - let mut tx = db.begin().await?; - let receipts = StopReceipts::new(&mut tx, id).await?; - let last_status = receipts.status.get(&mut tx).await?; - receipts.status.set(&mut tx, MainStatus::Stopping).await?; - - tx.save().await?; - break_all_dependents_transitive( - db, - id, - DependencyError::NotRunning, - breakages, - &receipts.breaks, - ) - .await?; - - Ok(last_status) -} - -#[command( - subcommands(self(stop_impl(async)), stop_dry), - display(display_none), - metadata(sync_db = true) -)] -pub fn stop(#[arg] id: PackageId) -> Result { - Ok(id) -} - -#[command(rename = "dry", display(display_serializable))] -#[instrument(skip_all)] -pub async fn stop_dry( - #[context] ctx: RpcContext, - #[parent_data] id: PackageId, -) -> Result { - let mut db = ctx.db.handle(); - let mut tx = db.begin().await?; - - let mut breakages = BTreeMap::new(); - stop_common(&mut tx, &id, &mut breakages).await?; - - tx.abort().await?; - - Ok(BreakageRes(breakages)) -} - -#[instrument(skip_all)] -pub async fn stop_impl(ctx: RpcContext, id: PackageId) -> Result { - let mut db = ctx.db.handle(); - let mut tx = db.begin().await?; - let version = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&id) - .expect(&mut tx) - .await? - .installed() - .expect(&mut tx) - .await? - .manifest() - .version() - .get(&mut tx) - .await? - .clone(); - - let last_statuts = stop_common(&mut tx, &id, &mut BTreeMap::new()).await?; - - tx.commit().await?; ctx.managers .get(&(id, version)) .await @@ -198,30 +69,21 @@ pub async fn stop_impl(ctx: RpcContext, id: PackageId) -> Result Result<(), Error> { - let mut db = ctx.db.handle(); - let mut tx = db.begin().await?; - let version = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&id) - .expect(&mut tx) - .await? - .installed() - .expect(&mut tx) - .await? - .manifest() - .version() - .get(&mut tx) - .await? - .clone(); - - tx.commit().await?; + let peek = ctx.db.peek().await?; + let version = peek + .as_package_data() + .as_idx(&id) + .or_not_found(&id)? + .expect_as_installed()? + .as_manifest() + .as_version() + .de()?; ctx.managers .get(&(id, version)) .await .ok_or_else(|| Error::new(eyre!("Manager not found"), crate::ErrorKind::InvalidRequest))? - .restart() - .await; + .restart(); Ok(()) } diff --git a/backend/src/db/mod.rs b/backend/src/db/mod.rs index 6823c398d..61f434493 100644 --- a/backend/src/db/mod.rs +++ b/backend/src/db/mod.rs @@ -1,13 +1,14 @@ pub mod model; pub mod package; +pub mod prelude; use std::future::Future; +use std::path::PathBuf; use std::sync::Arc; -use color_eyre::eyre::eyre; use futures::{FutureExt, SinkExt, StreamExt}; use patch_db::json_ptr::JsonPointer; -use patch_db::{DbHandle, Dump, LockType, Revision}; +use patch_db::{Dump, Revision}; use rpc_toolkit::command; use rpc_toolkit::hyper::upgrade::Upgraded; use rpc_toolkit::hyper::{Body, Error as HyperError, Request, Response}; @@ -22,12 +23,11 @@ use tokio_tungstenite::tungstenite::Message; use tokio_tungstenite::WebSocketStream; use tracing::instrument; -pub use self::model::DatabaseModel; -use crate::context::RpcContext; +use crate::context::{CliContext, RpcContext}; use crate::middleware::auth::{HasValidSession, HashSessionToken}; +use crate::prelude::*; use crate::util::display_none; use crate::util::serde::{display_serializable, IoFormat}; -use crate::{Error, ResultExt}; #[instrument(skip_all)] async fn ws_handler< @@ -40,8 +40,8 @@ async fn ws_handler< let (dump, sub) = ctx.db.dump_and_sub().await?; let mut stream = ws_fut .await - .with_kind(crate::ErrorKind::Network)? - .with_kind(crate::ErrorKind::Unknown)?; + .with_kind(ErrorKind::Network)? + .with_kind(ErrorKind::Unknown)?; if let Some((session, token)) = session { let kill = subscribe_to_session_kill(&ctx, token).await; @@ -55,7 +55,7 @@ async fn ws_handler< reason: "UNAUTHORIZED".into(), })) .await - .with_kind(crate::ErrorKind::Network)?; + .with_kind(ErrorKind::Network)?; } Ok(()) @@ -82,7 +82,6 @@ async fn deal_with_messages( mut sub: patch_db::Subscriber, mut stream: WebSocketStream, ) -> Result<(), Error> { - let mut timer = tokio::time::interval(tokio::time::Duration::from_secs(5)); loop { futures::select! { _ = (&mut kill).fuse() => { @@ -93,31 +92,26 @@ async fn deal_with_messages( reason: "UNAUTHORIZED".into(), })) .await - .with_kind(crate::ErrorKind::Network)?; + .with_kind(ErrorKind::Network)?; return Ok(()) } new_rev = sub.recv().fuse() => { let rev = new_rev.expect("UNREACHABLE: patch-db is dropped"); stream - .send(Message::Text(serde_json::to_string(&rev).with_kind(crate::ErrorKind::Serialization)?)) + .send(Message::Text(serde_json::to_string(&rev).with_kind(ErrorKind::Serialization)?)) .await - .with_kind(crate::ErrorKind::Network)?; + .with_kind(ErrorKind::Network)?; } message = stream.next().fuse() => { - let message = message.transpose().with_kind(crate::ErrorKind::Network)?; - if message.is_none() { - tracing::info!("Closing WebSocket: Stream Finished"); - return Ok(()) + let message = message.transpose().with_kind(ErrorKind::Network)?; + match message { + None => { + tracing::info!("Closing WebSocket: Stream Finished"); + return Ok(()) + } + _ => (), } } - // This is trying to give a health checks to the home to keep the ui alive. - _ = timer.tick().fuse() => { - stream - .send(Message::Ping(vec![])) - .await - .with_kind(crate::ErrorKind::Network)?; - } - } } } @@ -129,10 +123,10 @@ async fn send_dump( ) -> Result<(), Error> { stream .send(Message::Text( - serde_json::to_string(&dump).with_kind(crate::ErrorKind::Serialization)?, + serde_json::to_string(&dump).with_kind(ErrorKind::Serialization)?, )) .await - .with_kind(crate::ErrorKind::Network)?; + .with_kind(ErrorKind::Network)?; Ok(()) } @@ -147,7 +141,7 @@ pub async fn subscribe(ctx: RpcContext, req: Request) -> Result Some(a), Err(e) => { - if e.kind != crate::ErrorKind::Authorization { + if e.kind != ErrorKind::Authorization { tracing::error!("Error Authenticating Websocket: {}", e); tracing::debug!("{:?}", e); } @@ -155,7 +149,7 @@ pub async fn subscribe(ctx: RpcContext, req: Request) -> Result, + path: Option, +) -> Result { + let dump = if let Some(path) = path { + PatchDb::open(path).await?.dump().await? + } else { + rpc_toolkit::command_helpers::call_remote( + ctx, + "db.dump", + serde_json::json!({}), + std::marker::PhantomData::, + ) + .await? + .result? + }; + + Ok(dump) +} + +#[command( + custom_cli(cli_dump(async, context(CliContext))), + display(display_serializable) +)] pub async fn dump( #[context] ctx: RpcContext, #[allow(unused_variables)] #[arg(long = "format")] format: Option, + #[allow(unused_variables)] + #[arg] + path: Option, ) -> Result { Ok(ctx.db.dump().await?) } @@ -258,34 +280,77 @@ fn apply_expr(input: jaq_core::Val, expr: &str) -> Result Ok(res) } -#[command(display(display_none))] -pub async fn apply(#[context] ctx: RpcContext, #[arg] expr: String) -> Result<(), Error> { - let mut db = ctx.db.handle(); +#[instrument(skip_all)] +async fn cli_apply(ctx: CliContext, expr: String, path: Option) -> Result<(), RpcError> { + if let Some(path) = path { + PatchDb::open(path) + .await? + .mutate(|db| { + let res = apply_expr( + serde_json::to_value(patch_db::Value::from(db.clone())) + .with_kind(ErrorKind::Deserialization)? + .into(), + &expr, + )?; - DatabaseModel::new().lock(&mut db, LockType::Write).await?; - - let root_ptr = JsonPointer::::default(); - - let input = db.get_value(&root_ptr, None).await?; - - let res = (|| { - let res = apply_expr(input.into(), &expr)?; - - serde_json::from_value::(res.clone().into()).with_ctx(|_| { - ( - crate::ErrorKind::Deserialization, - "result does not match database model", - ) - })?; - - Ok::(res.into()) - })()?; - - db.put_value(&root_ptr, &res).await?; + db.ser( + &serde_json::from_value::(res.clone().into()).with_ctx( + |_| { + ( + crate::ErrorKind::Deserialization, + "result does not match database model", + ) + }, + )?, + ) + }) + .await?; + } else { + rpc_toolkit::command_helpers::call_remote( + ctx, + "db.apply", + serde_json::json!({ "expr": expr }), + std::marker::PhantomData::<()>, + ) + .await? + .result?; + } Ok(()) } +#[command( + custom_cli(cli_apply(async, context(CliContext))), + display(display_none) +)] +pub async fn apply( + #[context] ctx: RpcContext, + #[arg] expr: String, + #[allow(unused_variables)] + #[arg] + path: Option, +) -> Result<(), Error> { + ctx.db + .mutate(|db| { + let res = apply_expr( + serde_json::to_value(patch_db::Value::from(db.clone())) + .with_kind(ErrorKind::Deserialization)? + .into(), + &expr, + )?; + + db.ser( + &serde_json::from_value::(res.clone().into()).with_ctx(|_| { + ( + crate::ErrorKind::Deserialization, + "result does not match database model", + ) + })?, + ) + }) + .await +} + #[command(subcommands(ui))] pub fn put() -> Result<(), RpcError> { Ok(()) @@ -303,7 +368,7 @@ pub async fn ui( ) -> Result<(), Error> { let ptr = "/ui" .parse::() - .with_kind(crate::ErrorKind::Database)? + .with_kind(ErrorKind::Database)? + &pointer; ctx.db.put(&ptr, &value).await?; Ok(()) diff --git a/backend/src/db/model.rs b/backend/src/db/model.rs index 0024f76c6..879feb644 100644 --- a/backend/src/db/model.rs +++ b/backend/src/db/model.rs @@ -7,49 +7,45 @@ use emver::VersionRange; use ipnet::{Ipv4Net, Ipv6Net}; use isocountry::CountryCode; use itertools::Itertools; +use models::{DataUrl, HealthCheckId, InterfaceId}; use openssl::hash::MessageDigest; -use patch_db::json_ptr::JsonPointer; -use patch_db::{HasModel, Map, MapModel, OptionModel}; +use patch_db::{HasModel, Value}; use reqwest::Url; use serde::{Deserialize, Serialize}; -use serde_json::Value; use ssh_key::public::Ed25519PublicKey; use crate::account::AccountInfo; -use crate::config::spec::{PackagePointerSpec, SystemPointerSpec}; +use crate::config::spec::PackagePointerSpec; use crate::install::progress::InstallProgress; -use crate::net::interface::InterfaceId; use crate::net::utils::{get_iface_ipv4_addr, get_iface_ipv6_addr}; -use crate::s9pk::manifest::{Manifest, ManifestModel, PackageId}; -use crate::status::health_check::HealthCheckId; +use crate::prelude::*; +use crate::s9pk::manifest::{Manifest, PackageId}; use crate::status::Status; use crate::util::Version; use crate::version::{Current, VersionT}; -use crate::Error; #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] +// #[macro_debug] pub struct Database { - #[model] pub server_info: ServerInfo, - #[model] pub package_data: AllPackageData, pub ui: Value, } impl Database { pub fn init(account: &AccountInfo) -> Self { let lan_address = account.hostname.lan_address().parse().unwrap(); - // TODO Database { server_info: ServerInfo { id: account.server_id.clone(), version: Current::new().semver().into(), - hostname: Some(account.hostname.no_dot_host_name()), + hostname: account.hostname.no_dot_host_name(), last_backup: None, last_wifi_region: None, eos_version_compat: Current::new().compat().clone(), lan_address, - tor_address: format!("https://{}", account.key.tor_address()) + tor_address: format!("http://{}", account.key.tor_address()) .parse() .unwrap(), ip_info: BTreeMap::new(), @@ -88,17 +84,15 @@ impl Database { } } } -impl DatabaseModel { - pub fn new() -> Self { - Self::from(JsonPointer::default()) - } -} + +pub type DatabaseModel = Model; #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct ServerInfo { pub id: String, - pub hostname: Option, + pub hostname: String, pub version: Version, pub last_backup: Option>, /// Used in the wifi to determine the region to set the system to @@ -106,10 +100,7 @@ pub struct ServerInfo { pub eos_version_compat: VersionRange, pub lan_address: Url, pub tor_address: Url, - #[model] - #[serde(default)] pub ip_info: BTreeMap, - #[model] #[serde(default)] pub status_info: ServerStatus, pub wifi: WifiInfo, @@ -125,6 +116,7 @@ pub struct ServerInfo { #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct IpInfo { pub ipv4_range: Option, pub ipv4: Option, @@ -145,29 +137,31 @@ impl IpInfo { } #[derive(Debug, Default, Deserialize, Serialize, HasModel)] +#[model = "Model"] pub struct BackupProgress { pub complete: bool, } #[derive(Debug, Default, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct ServerStatus { - #[model] pub backup_progress: Option>, pub updated: bool, - #[model] pub update_progress: Option, } #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct UpdateProgress { pub size: Option, pub downloaded: u64, } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct WifiInfo { pub ssids: Vec, pub selected: Option, @@ -194,16 +188,11 @@ pub struct AllPackageData(pub BTreeMap); impl Map for AllPackageData { type Key = PackageId; type Value = PackageDataEntry; - fn get(&self, key: &Self::Key) -> Option<&Self::Value> { - self.0.get(key) - } -} -impl HasModel for AllPackageData { - type Model = MapModel; } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct StaticFiles { license: String, instructions: String, @@ -219,120 +208,231 @@ impl StaticFiles { } } +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "kebab-case")] +#[model = "Model"] +pub struct PackageDataEntryInstalling { + pub static_files: StaticFiles, + pub manifest: Manifest, + pub install_progress: Arc, +} + +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "kebab-case")] +#[model = "Model"] +pub struct PackageDataEntryUpdating { + pub static_files: StaticFiles, + pub manifest: Manifest, + pub installed: InstalledPackageInfo, + pub install_progress: Arc, +} + +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "kebab-case")] +#[model = "Model"] +pub struct PackageDataEntryRestoring { + pub static_files: StaticFiles, + pub manifest: Manifest, + pub install_progress: Arc, +} + +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "kebab-case")] +#[model = "Model"] +pub struct PackageDataEntryRemoving { + pub static_files: StaticFiles, + pub manifest: Manifest, + pub removing: InstalledPackageInfo, +} + +#[derive(Debug, Deserialize, Serialize, HasModel)] +#[serde(rename_all = "kebab-case")] +#[model = "Model"] +pub struct PackageDataEntryInstalled { + pub static_files: StaticFiles, + pub manifest: Manifest, + pub installed: InstalledPackageInfo, +} + #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(tag = "state")] #[serde(rename_all = "kebab-case")] +#[model = "Model"] +// #[macro_debug] pub enum PackageDataEntry { - #[serde(rename_all = "kebab-case")] - Installing { - static_files: StaticFiles, - manifest: Manifest, - install_progress: Arc, - }, - #[serde(rename_all = "kebab-case")] - Updating { - static_files: StaticFiles, - manifest: Manifest, - installed: InstalledPackageDataEntry, - install_progress: Arc, - }, - #[serde(rename_all = "kebab-case")] - Restoring { - static_files: StaticFiles, - manifest: Manifest, - install_progress: Arc, - }, - #[serde(rename_all = "kebab-case")] - Removing { - static_files: StaticFiles, - manifest: Manifest, - removing: InstalledPackageDataEntry, - }, - #[serde(rename_all = "kebab-case")] - Installed { - static_files: StaticFiles, - manifest: Manifest, - installed: InstalledPackageDataEntry, - }, + Installing(PackageDataEntryInstalling), + Updating(PackageDataEntryUpdating), + Restoring(PackageDataEntryRestoring), + Removing(PackageDataEntryRemoving), + Installed(PackageDataEntryInstalled), } -impl PackageDataEntry { - pub fn installed(&self) -> Option<&InstalledPackageDataEntry> { - match self { - Self::Installing { .. } | Self::Restoring { .. } | Self::Removing { .. } => None, - Self::Updating { installed, .. } | Self::Installed { installed, .. } => Some(installed), +impl Model { + pub fn expect_into_installed(self) -> Result, Error> { + if let PackageDataEntryMatchModel::Installed(a) = self.into_match() { + Ok(a) + } else { + Err(Error::new( + eyre!("package is not in installed state"), + ErrorKind::InvalidRequest, + )) } } - pub fn installed_mut(&mut self) -> Option<&mut InstalledPackageDataEntry> { - match self { - Self::Installing { .. } | Self::Restoring { .. } | Self::Removing { .. } => None, - Self::Updating { installed, .. } | Self::Installed { installed, .. } => Some(installed), + pub fn expect_as_installed(&self) -> Result<&Model, Error> { + if let PackageDataEntryMatchModelRef::Installed(a) = self.as_match() { + Ok(a) + } else { + Err(Error::new( + eyre!("package is not in installed state"), + ErrorKind::InvalidRequest, + )) } } - pub fn into_installed(self) -> Option { - match self { - Self::Installing { .. } | Self::Restoring { .. } | Self::Removing { .. } => None, - Self::Updating { installed, .. } | Self::Installed { installed, .. } => Some(installed), + pub fn expect_as_installed_mut( + &mut self, + ) -> Result<&mut Model, Error> { + if let PackageDataEntryMatchModelMut::Installed(a) = self.as_match_mut() { + Ok(a) + } else { + Err(Error::new( + eyre!("package is not in installed state"), + ErrorKind::InvalidRequest, + )) } } - pub fn manifest(self) -> Manifest { - match self { - PackageDataEntry::Installing { manifest, .. } => manifest, - PackageDataEntry::Updating { manifest, .. } => manifest, - PackageDataEntry::Restoring { manifest, .. } => manifest, - PackageDataEntry::Removing { manifest, .. } => manifest, - PackageDataEntry::Installed { manifest, .. } => manifest, + pub fn expect_into_removing(self) -> Result, Error> { + if let PackageDataEntryMatchModel::Removing(a) = self.into_match() { + Ok(a) + } else { + Err(Error::new( + eyre!("package is not in removing state"), + ErrorKind::InvalidRequest, + )) } } - pub fn manifest_borrow(&self) -> &Manifest { - match self { - PackageDataEntry::Installing { manifest, .. } => manifest, - PackageDataEntry::Updating { manifest, .. } => manifest, - PackageDataEntry::Restoring { manifest, .. } => manifest, - PackageDataEntry::Removing { manifest, .. } => manifest, - PackageDataEntry::Installed { manifest, .. } => manifest, + pub fn expect_as_removing(&self) -> Result<&Model, Error> { + if let PackageDataEntryMatchModelRef::Removing(a) = self.as_match() { + Ok(a) + } else { + Err(Error::new( + eyre!("package is not in removing state"), + ErrorKind::InvalidRequest, + )) } } -} -impl PackageDataEntryModel { - pub fn installed(self) -> OptionModel { - self.0.child("installed").into() + pub fn expect_as_removing_mut( + &mut self, + ) -> Result<&mut Model, Error> { + if let PackageDataEntryMatchModelMut::Removing(a) = self.as_match_mut() { + Ok(a) + } else { + Err(Error::new( + eyre!("package is not in removing state"), + ErrorKind::InvalidRequest, + )) + } } - pub fn removing(self) -> OptionModel { - self.0.child("removing").into() + pub fn expect_as_installing_mut( + &mut self, + ) -> Result<&mut Model, Error> { + if let PackageDataEntryMatchModelMut::Installing(a) = self.as_match_mut() { + Ok(a) + } else { + Err(Error::new( + eyre!("package is not in installing state"), + ErrorKind::InvalidRequest, + )) + } } - pub fn install_progress(self) -> OptionModel { - self.0.child("install-progress").into() + pub fn into_manifest(self) -> Model { + match self.into_match() { + PackageDataEntryMatchModel::Installing(a) => a.into_manifest(), + PackageDataEntryMatchModel::Updating(a) => a.into_installed().into_manifest(), + PackageDataEntryMatchModel::Restoring(a) => a.into_manifest(), + PackageDataEntryMatchModel::Removing(a) => a.into_manifest(), + PackageDataEntryMatchModel::Installed(a) => a.into_manifest(), + PackageDataEntryMatchModel::Error(_) => Model::from(Value::Null), + } } - pub fn manifest(self) -> ManifestModel { - self.0.child("manifest").into() + pub fn as_manifest(&self) -> &Model { + match self.as_match() { + PackageDataEntryMatchModelRef::Installing(a) => a.as_manifest(), + PackageDataEntryMatchModelRef::Updating(a) => a.as_installed().as_manifest(), + PackageDataEntryMatchModelRef::Restoring(a) => a.as_manifest(), + PackageDataEntryMatchModelRef::Removing(a) => a.as_manifest(), + PackageDataEntryMatchModelRef::Installed(a) => a.as_manifest(), + PackageDataEntryMatchModelRef::Error(_) => (&Value::Null).into(), + } + } + pub fn into_installed(self) -> Option> { + match self.into_match() { + PackageDataEntryMatchModel::Installing(_) => None, + PackageDataEntryMatchModel::Updating(a) => Some(a.into_installed()), + PackageDataEntryMatchModel::Restoring(_) => None, + PackageDataEntryMatchModel::Removing(_) => None, + PackageDataEntryMatchModel::Installed(a) => Some(a.into_installed()), + PackageDataEntryMatchModel::Error(_) => None, + } + } + pub fn as_installed(&self) -> Option<&Model> { + match self.as_match() { + PackageDataEntryMatchModelRef::Installing(_) => None, + PackageDataEntryMatchModelRef::Updating(a) => Some(a.as_installed()), + PackageDataEntryMatchModelRef::Restoring(_) => None, + PackageDataEntryMatchModelRef::Removing(_) => None, + PackageDataEntryMatchModelRef::Installed(a) => Some(a.as_installed()), + PackageDataEntryMatchModelRef::Error(_) => None, + } + } + pub fn as_installed_mut(&mut self) -> Option<&mut Model> { + match self.as_match_mut() { + PackageDataEntryMatchModelMut::Installing(_) => None, + PackageDataEntryMatchModelMut::Updating(a) => Some(a.as_installed_mut()), + PackageDataEntryMatchModelMut::Restoring(_) => None, + PackageDataEntryMatchModelMut::Removing(_) => None, + PackageDataEntryMatchModelMut::Installed(a) => Some(a.as_installed_mut()), + PackageDataEntryMatchModelMut::Error(_) => None, + } + } + pub fn as_install_progress(&self) -> Option<&Model>> { + match self.as_match() { + PackageDataEntryMatchModelRef::Installing(a) => Some(a.as_install_progress()), + PackageDataEntryMatchModelRef::Updating(a) => Some(a.as_install_progress()), + PackageDataEntryMatchModelRef::Restoring(a) => Some(a.as_install_progress()), + PackageDataEntryMatchModelRef::Removing(_) => None, + PackageDataEntryMatchModelRef::Installed(_) => None, + PackageDataEntryMatchModelRef::Error(_) => None, + } + } + pub fn as_install_progress_mut(&mut self) -> Option<&mut Model>> { + match self.as_match_mut() { + PackageDataEntryMatchModelMut::Installing(a) => Some(a.as_install_progress_mut()), + PackageDataEntryMatchModelMut::Updating(a) => Some(a.as_install_progress_mut()), + PackageDataEntryMatchModelMut::Restoring(a) => Some(a.as_install_progress_mut()), + PackageDataEntryMatchModelMut::Removing(_) => None, + PackageDataEntryMatchModelMut::Installed(_) => None, + PackageDataEntryMatchModelMut::Error(_) => None, + } } } #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] -pub struct InstalledPackageDataEntry { - #[model] +#[model = "Model"] +pub struct InstalledPackageInfo { pub status: Status, pub marketplace_url: Option, #[serde(default)] #[serde(with = "crate::util::serde::ed25519_pubkey")] pub developer_key: ed25519_dalek::PublicKey, - #[model] pub manifest: Manifest, pub last_backup: Option>, - #[model] - pub system_pointers: Vec, - #[model] pub dependency_info: BTreeMap, - #[model] pub current_dependents: CurrentDependents, - #[model] pub current_dependencies: CurrentDependencies, - #[model] pub interface_addresses: InterfaceAddressMap, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Default, Deserialize, Serialize)] pub struct CurrentDependents(pub BTreeMap); impl CurrentDependents { pub fn map( @@ -348,12 +448,6 @@ impl CurrentDependents { impl Map for CurrentDependents { type Key = PackageId; type Value = CurrentDependencyInfo; - fn get(&self, key: &Self::Key) -> Option<&Self::Value> { - self.0.get(key) - } -} -impl HasModel for CurrentDependents { - type Model = MapModel; } #[derive(Debug, Clone, Default, Deserialize, Serialize)] @@ -372,25 +466,21 @@ impl CurrentDependencies { impl Map for CurrentDependencies { type Key = PackageId; type Value = CurrentDependencyInfo; - fn get(&self, key: &Self::Key) -> Option<&Self::Value> { - self.0.get(key) - } -} -impl HasModel for CurrentDependencies { - type Model = MapModel; } -#[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel)] +#[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct StaticDependencyInfo { - pub manifest: Option, - pub icon: String, + pub title: String, + pub icon: DataUrl<'static>, } #[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct CurrentDependencyInfo { - pub pointers: Vec, + pub pointers: BTreeSet, pub health_checks: BTreeSet, } @@ -399,27 +489,12 @@ pub struct InterfaceAddressMap(pub BTreeMap); impl Map for InterfaceAddressMap { type Key = InterfaceId; type Value = InterfaceAddresses; - fn get(&self, key: &Self::Key) -> Option<&Self::Value> { - self.0.get(key) - } -} -impl HasModel for InterfaceAddressMap { - type Model = MapModel; } #[derive(Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct InterfaceAddresses { - #[model] pub tor_address: Option, - #[model] pub lan_address: Option, } - -#[derive(Debug, Deserialize, Serialize, HasModel)] -#[serde(rename_all = "kebab-case")] -pub struct RecoveredPackageInfo { - pub title: String, - pub icon: String, - pub version: Version, -} diff --git a/backend/src/db/package.rs b/backend/src/db/package.rs index dd167c160..fe6f93809 100644 --- a/backend/src/db/package.rs +++ b/backend/src/db/package.rs @@ -1,75 +1,22 @@ -use patch_db::{DbHandle, LockReceipt, LockTargetId, LockType, Verifier}; +use models::Version; -use crate::s9pk::manifest::{Manifest, PackageId}; -use crate::Error; +use crate::prelude::*; +use crate::s9pk::manifest::PackageId; -pub struct PackageReceipts { - package_data: LockReceipt, -} - -impl PackageReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup(locks: &mut Vec) -> impl FnOnce(&Verifier) -> Result { - let package_data = crate::db::DatabaseModel::new() - .package_data() - .make_locker(LockType::Read) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - package_data: package_data.verify(&skeleton_key)?, - }) - } - } -} - -pub async fn get_packages( - db: &mut Db, - receipts: &PackageReceipts, -) -> Result, Error> { - let packages = receipts.package_data.get(db).await?; - Ok(packages.0.keys().cloned().collect()) -} - -pub struct ManifestReceipts { - manifest: LockReceipt, -} - -impl ManifestReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle, id: &PackageId) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks, id); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - _id: &PackageId, - ) -> impl FnOnce(&Verifier) -> Result { - let manifest = crate::db::DatabaseModel::new() - .package_data() - .star() - .manifest() - .make_locker(LockType::Read) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - manifest: manifest.verify(&skeleton_key)?, - }) - } - } -} - -pub async fn get_manifest( - db: &mut Db, - pkg: &PackageId, - receipts: &ManifestReceipts, -) -> Result, Error> { - Ok(receipts.manifest.get(db, pkg).await?) +pub fn get_packages(db: Peeked) -> Result, Error> { + Ok(db + .as_package_data() + .keys()? + .into_iter() + .flat_map(|package_id| { + let version = db + .as_package_data() + .as_idx(&package_id)? + .as_manifest() + .as_version() + .de() + .ok()?; + Some((package_id, version)) + }) + .collect()) } diff --git a/backend/src/db/prelude.rs b/backend/src/db/prelude.rs new file mode 100644 index 000000000..4fce5fbcb --- /dev/null +++ b/backend/src/db/prelude.rs @@ -0,0 +1,382 @@ +use std::collections::BTreeMap; +use std::marker::PhantomData; +use std::panic::UnwindSafe; + +use patch_db::value::InternedString; +pub use patch_db::{HasModel, PatchDb, Value}; +use serde::de::DeserializeOwned; +use serde::Serialize; + +use crate::db::model::DatabaseModel; +use crate::prelude::*; + +pub type Peeked = Model; + +pub fn to_value(value: &T) -> Result +where + T: Serialize, +{ + patch_db::value::to_value(value).with_kind(ErrorKind::Serialization) +} + +pub fn from_value(value: Value) -> Result +where + T: DeserializeOwned, +{ + patch_db::value::from_value(value).with_kind(ErrorKind::Deserialization) +} + +#[async_trait::async_trait] +pub trait PatchDbExt { + async fn peek(&self) -> Result; + async fn mutate( + &self, + f: impl FnOnce(&mut DatabaseModel) -> Result + UnwindSafe + Send, + ) -> Result; + async fn map_mutate( + &self, + f: impl FnOnce(DatabaseModel) -> Result + UnwindSafe + Send, + ) -> Result; +} +#[async_trait::async_trait] +impl PatchDbExt for PatchDb { + async fn peek(&self) -> Result { + Ok(DatabaseModel::from(self.dump().await?.value)) + } + async fn mutate( + &self, + f: impl FnOnce(&mut DatabaseModel) -> Result + UnwindSafe + Send, + ) -> Result { + Ok(self + .apply_function(|mut v| { + let model = <&mut DatabaseModel>::from(&mut v); + let res = f(model)?; + Ok::<_, Error>((v, res)) + }) + .await? + .1) + } + async fn map_mutate( + &self, + f: impl FnOnce(DatabaseModel) -> Result + UnwindSafe + Send, + ) -> Result { + Ok(DatabaseModel::from( + self.apply_function(|v| f(DatabaseModel::from(v)).map(|a| (a.into(), ()))) + .await? + .0, + )) + } +} + +/// &mut Model <=> &mut Value +#[repr(transparent)] +#[derive(Debug)] +pub struct Model { + value: Value, + phantom: PhantomData, +} +impl Model { + pub fn de(&self) -> Result { + from_value(self.value.clone()) + } +} +impl Model { + pub fn new(value: &T) -> Result { + Ok(Self::from(to_value(value)?)) + } + pub fn ser(&mut self, value: &T) -> Result<(), Error> { + self.value = to_value(value)?; + Ok(()) + } +} + +impl Model { + pub fn replace(&mut self, value: &T) -> Result { + let orig = self.de()?; + self.ser(value)?; + Ok(orig) + } +} +impl Clone for Model { + fn clone(&self) -> Self { + Self { + value: self.value.clone(), + phantom: PhantomData, + } + } +} +impl From for Model { + fn from(value: Value) -> Self { + Self { + value, + phantom: PhantomData, + } + } +} +impl From> for Value { + fn from(value: Model) -> Self { + value.value + } +} +impl<'a, T> From<&'a Value> for &'a Model { + fn from(value: &'a Value) -> Self { + unsafe { std::mem::transmute(value) } + } +} +impl<'a, T> From<&'a Model> for &'a Value { + fn from(value: &'a Model) -> Self { + unsafe { std::mem::transmute(value) } + } +} +impl<'a, T> From<&'a mut Value> for &mut Model { + fn from(value: &'a mut Value) -> Self { + unsafe { std::mem::transmute(value) } + } +} +impl<'a, T> From<&'a mut Model> for &mut Value { + fn from(value: &'a mut Model) -> Self { + unsafe { std::mem::transmute(value) } + } +} +impl patch_db::Model for Model { + type Model = Model; +} + +impl Model> { + pub fn transpose(self) -> Option> { + use patch_db::ModelExt; + if self.value.is_null() { + None + } else { + Some(self.transmute(|a| a)) + } + } + pub fn transpose_ref(&self) -> Option<&Model> { + use patch_db::ModelExt; + if self.value.is_null() { + None + } else { + Some(self.transmute_ref(|a| a)) + } + } + pub fn transpose_mut(&mut self) -> Option<&mut Model> { + use patch_db::ModelExt; + if self.value.is_null() { + None + } else { + Some(self.transmute_mut(|a| a)) + } + } + pub fn from_option(opt: Option>) -> Self { + use patch_db::ModelExt; + match opt { + Some(a) => a.transmute(|a| a), + None => Self::from_value(Value::Null), + } + } +} + +pub trait Map: DeserializeOwned + Serialize { + type Key; + type Value; +} + +impl Map for BTreeMap +where + A: serde::Serialize + serde::de::DeserializeOwned + Ord, + B: serde::Serialize + serde::de::DeserializeOwned, +{ + type Key = A; + type Value = B; +} + +impl Model +where + T::Key: AsRef, + T::Value: Serialize, +{ + pub fn insert(&mut self, key: &T::Key, value: &T::Value) -> Result<(), Error> { + use serde::ser::Error; + let v = patch_db::value::to_value(value)?; + match &mut self.value { + Value::Object(o) => { + o.insert(InternedString::intern(key.as_ref()), v); + Ok(()) + } + v => Err(patch_db::value::Error { + source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), + kind: patch_db::value::ErrorKind::Serialization, + } + .into()), + } + } + pub fn insert_model(&mut self, key: &T::Key, value: Model) -> Result<(), Error> { + use patch_db::ModelExt; + use serde::ser::Error; + let v = value.into_value(); + match &mut self.value { + Value::Object(o) => { + o.insert(InternedString::intern(key.as_ref()), v); + Ok(()) + } + v => Err(patch_db::value::Error { + source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), + kind: patch_db::value::ErrorKind::Serialization, + } + .into()), + } + } +} + +impl Model +where + T::Key: DeserializeOwned + Ord + Clone, +{ + pub fn keys(&self) -> Result, Error> { + use serde::de::Error; + use serde::Deserialize; + match &self.value { + Value::Object(o) => o + .keys() + .cloned() + .map(|k| { + T::Key::deserialize(patch_db::value::de::InternedStringDeserializer::from(k)) + .map_err(|e| { + patch_db::value::Error { + kind: patch_db::value::ErrorKind::Deserialization, + source: e, + } + .into() + }) + }) + .collect(), + v => Err(patch_db::value::Error { + source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), + kind: patch_db::value::ErrorKind::Deserialization, + } + .into()), + } + } + + pub fn into_entries(self) -> Result)>, Error> { + use patch_db::ModelExt; + use serde::de::Error; + use serde::Deserialize; + match self.value { + Value::Object(o) => o + .into_iter() + .map(|(k, v)| { + Ok(( + T::Key::deserialize(patch_db::value::de::InternedStringDeserializer::from( + k, + )) + .with_kind(ErrorKind::Deserialization)?, + Model::from_value(v), + )) + }) + .collect(), + v => Err(patch_db::value::Error { + source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), + kind: patch_db::value::ErrorKind::Deserialization, + } + .into()), + } + } + pub fn as_entries(&self) -> Result)>, Error> { + use patch_db::ModelExt; + use serde::de::Error; + use serde::Deserialize; + match &self.value { + Value::Object(o) => o + .iter() + .map(|(k, v)| { + Ok(( + T::Key::deserialize(patch_db::value::de::InternedStringDeserializer::from( + k.clone(), + )) + .with_kind(ErrorKind::Deserialization)?, + Model::value_as(v), + )) + }) + .collect(), + v => Err(patch_db::value::Error { + source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), + kind: patch_db::value::ErrorKind::Deserialization, + } + .into()), + } + } + pub fn as_entries_mut(&mut self) -> Result)>, Error> { + use patch_db::ModelExt; + use serde::de::Error; + use serde::Deserialize; + match &mut self.value { + Value::Object(o) => o + .iter_mut() + .map(|(k, v)| { + Ok(( + T::Key::deserialize(patch_db::value::de::InternedStringDeserializer::from( + k.clone(), + )) + .with_kind(ErrorKind::Deserialization)?, + Model::value_as_mut(v), + )) + }) + .collect(), + v => Err(patch_db::value::Error { + source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), + kind: patch_db::value::ErrorKind::Deserialization, + } + .into()), + } + } +} +impl Model +where + T::Key: AsRef, +{ + pub fn into_idx(self, key: &T::Key) -> Option> { + use patch_db::ModelExt; + match &self.value { + Value::Object(o) if o.contains_key(key.as_ref()) => Some(self.transmute(|v| { + use patch_db::value::index::Index; + key.as_ref().index_into_owned(v).unwrap() + })), + _ => None, + } + } + pub fn as_idx<'a>(&'a self, key: &T::Key) -> Option<&'a Model> { + use patch_db::ModelExt; + match &self.value { + Value::Object(o) if o.contains_key(key.as_ref()) => Some(self.transmute_ref(|v| { + use patch_db::value::index::Index; + key.as_ref().index_into(v).unwrap() + })), + _ => None, + } + } + pub fn as_idx_mut<'a>(&'a mut self, key: &T::Key) -> Option<&'a mut Model> { + use patch_db::ModelExt; + match &mut self.value { + Value::Object(o) if o.contains_key(key.as_ref()) => Some(self.transmute_mut(|v| { + use patch_db::value::index::Index; + key.as_ref().index_or_insert(v) + })), + _ => None, + } + } + pub fn remove(&mut self, key: &T::Key) -> Result>, Error> { + use serde::ser::Error; + match &mut self.value { + Value::Object(o) => { + let v = o.remove(key.as_ref()); + Ok(v.map(patch_db::ModelExt::from_value)) + } + v => Err(patch_db::value::Error { + source: patch_db::value::ErrorSource::custom(format!("expected object found {v}")), + kind: patch_db::value::ErrorKind::Serialization, + } + .into()), + } + } +} diff --git a/backend/src/dependencies.rs b/backend/src/dependencies.rs index 99e146944..299518057 100644 --- a/backend/src/dependencies.rs +++ b/backend/src/dependencies.rs @@ -1,29 +1,23 @@ -use std::cmp::Ordering; use std::collections::BTreeMap; use std::time::Duration; use color_eyre::eyre::eyre; use emver::VersionRange; -use futures::future::BoxFuture; -use futures::FutureExt; -use patch_db::{ - DbHandle, HasModel, LockReceipt, LockTargetId, LockType, Map, MapModel, PatchDbHandle, Verifier, -}; +use models::OptionExt; use rand::SeedableRng; use rpc_toolkit::command; use serde::{Deserialize, Serialize}; use tracing::instrument; -use crate::config::action::{ConfigActions, ConfigRes}; +use crate::config::action::ConfigRes; use crate::config::spec::PackagePointerSpec; -use crate::config::{not_found, Config, ConfigReceipts, ConfigSpec, ConfigureContext}; +use crate::config::{not_found, Config, ConfigSpec, ConfigureContext}; use crate::context::RpcContext; -use crate::db::model::{CurrentDependencies, CurrentDependents, InstalledPackageDataEntry}; -use crate::procedure::docker::DockerContainers; +use crate::db::model::{CurrentDependencies, Database}; +use crate::prelude::*; use crate::procedure::{NoOutput, PackageProcedure, ProcedureName}; use crate::s9pk::manifest::{Manifest, PackageId}; -use crate::status::health_check::{HealthCheckId, HealthCheckResult}; -use crate::status::{MainStatus, Status}; +use crate::status::DependencyConfigErrors; use crate::util::serde::display_serializable; use crate::util::{display_none, Version}; use crate::volume::Volumes; @@ -34,414 +28,12 @@ pub fn dependency() -> Result<(), Error> { Ok(()) } -#[derive(Clone, Debug, thiserror::Error, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -#[serde(tag = "type")] -pub enum DependencyError { - NotInstalled, // { "type": "not-installed" } - #[serde(rename_all = "kebab-case")] - IncorrectVersion { - expected: VersionRange, - received: Version, - }, // { "type": "incorrect-version", "expected": "0.1.0", "received": "^0.2.0" } - #[serde(rename_all = "kebab-case")] - ConfigUnsatisfied { - error: String, - }, // { "type": "config-unsatisfied", "error": "Bitcoin Core must have pruning set to manual." } - NotRunning, // { "type": "not-running" } - #[serde(rename_all = "kebab-case")] - HealthChecksFailed { - failures: BTreeMap, - }, // { "type": "health-checks-failed", "checks": { "rpc": { "time": "2021-05-11T18:21:29Z", "result": "starting" } } } - #[serde(rename_all = "kebab-case")] - Transitive, // { "type": "transitive" } -} - -#[derive(Clone)] -pub struct TryHealReceipts { - status: LockReceipt, - manifest: LockReceipt, - manifest_version: LockReceipt, - current_dependencies: LockReceipt, - dependency_errors: LockReceipt, - docker_containers: LockReceipt, -} - -impl TryHealReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup(locks: &mut Vec) -> impl FnOnce(&Verifier) -> Result { - let manifest_version = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest().version()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let status = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.status()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let manifest = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest()) - .make_locker(LockType::Write) - .add_to_keys(locks); - - let current_dependencies = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.current_dependencies()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let dependency_errors = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.status().dependency_errors()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let docker_containers = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .and_then(|x| x.manifest().containers()) - .make_locker(LockType::Write) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - status: status.verify(skeleton_key)?, - manifest_version: manifest_version.verify(skeleton_key)?, - current_dependencies: current_dependencies.verify(skeleton_key)?, - manifest: manifest.verify(skeleton_key)?, - dependency_errors: dependency_errors.verify(skeleton_key)?, - docker_containers: docker_containers.verify(skeleton_key)?, - }) - } - } -} - -impl DependencyError { - pub fn cmp_priority(&self, other: &DependencyError) -> std::cmp::Ordering { - use std::cmp::Ordering::*; - - use DependencyError::*; - match (self, other) { - (NotInstalled, NotInstalled) => Equal, - (NotInstalled, _) => Greater, - (_, NotInstalled) => Less, - (IncorrectVersion { .. }, IncorrectVersion { .. }) => Equal, - (IncorrectVersion { .. }, _) => Greater, - (_, IncorrectVersion { .. }) => Less, - (ConfigUnsatisfied { .. }, ConfigUnsatisfied { .. }) => Equal, - (ConfigUnsatisfied { .. }, _) => Greater, - (_, ConfigUnsatisfied { .. }) => Less, - (NotRunning, NotRunning) => Equal, - (NotRunning, _) => Greater, - (_, NotRunning) => Less, - (HealthChecksFailed { .. }, HealthChecksFailed { .. }) => Equal, - (HealthChecksFailed { .. }, _) => Greater, - (_, HealthChecksFailed { .. }) => Less, - (Transitive, Transitive) => Equal, - } - } - pub fn merge_with(self, other: DependencyError) -> DependencyError { - match (self, other) { - (DependencyError::NotInstalled, _) | (_, DependencyError::NotInstalled) => { - DependencyError::NotInstalled - } - (DependencyError::IncorrectVersion { expected, received }, _) - | (_, DependencyError::IncorrectVersion { expected, received }) => { - DependencyError::IncorrectVersion { expected, received } - } - ( - DependencyError::ConfigUnsatisfied { error: e0 }, - DependencyError::ConfigUnsatisfied { error: e1 }, - ) => DependencyError::ConfigUnsatisfied { - error: e0 + "\n" + &e1, - }, - (DependencyError::ConfigUnsatisfied { error }, _) - | (_, DependencyError::ConfigUnsatisfied { error }) => { - DependencyError::ConfigUnsatisfied { error } - } - (DependencyError::NotRunning, _) | (_, DependencyError::NotRunning) => { - DependencyError::NotRunning - } - ( - DependencyError::HealthChecksFailed { failures: f0 }, - DependencyError::HealthChecksFailed { failures: f1 }, - ) => DependencyError::HealthChecksFailed { - failures: f0.into_iter().chain(f1.into_iter()).collect(), - }, - (DependencyError::HealthChecksFailed { failures }, _) - | (_, DependencyError::HealthChecksFailed { failures }) => { - DependencyError::HealthChecksFailed { failures } - } - (DependencyError::Transitive, _) => DependencyError::Transitive, - } - } - #[instrument(skip_all)] - pub fn try_heal<'a, Db: DbHandle>( - self, - ctx: &'a RpcContext, - db: &'a mut Db, - id: &'a PackageId, - dependency: &'a PackageId, - mut dependency_config: Option, - info: &'a DepInfo, - receipts: &'a TryHealReceipts, - ) -> BoxFuture<'a, Result, Error>> { - async move { - let container = receipts.docker_containers.get(db, id).await?; - Ok(match self { - DependencyError::NotInstalled => { - if receipts.status.get(db, dependency).await?.is_some() { - DependencyError::IncorrectVersion { - expected: info.version.clone(), - received: Default::default(), - } - .try_heal(ctx, db, id, dependency, dependency_config, info, receipts) - .await? - } else { - Some(DependencyError::NotInstalled) - } - } - DependencyError::IncorrectVersion { expected, .. } => { - let version: Version = receipts - .manifest_version - .get(db, dependency) - .await? - .unwrap_or_default(); - if version.satisfies(&expected) { - DependencyError::ConfigUnsatisfied { - error: String::new(), - } - .try_heal(ctx, db, id, dependency, dependency_config, info, receipts) - .await? - } else { - Some(DependencyError::IncorrectVersion { - expected, - received: version, - }) - } - } - DependencyError::ConfigUnsatisfied { .. } => { - let dependent_manifest = receipts - .manifest - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; - let dependency_manifest = receipts - .manifest - .get(db, dependency) - .await? - .ok_or_else(|| not_found!(dependency))?; - - let dependency_config = if let Some(cfg) = dependency_config.take() { - cfg - } else if let Some(cfg_info) = &dependency_manifest.config { - cfg_info - .get( - ctx, - dependency, - &dependency_manifest.version, - &dependency_manifest.volumes, - ) - .await? - .config - .unwrap_or_default() - } else { - Config::default() - }; - if let Some(cfg_req) = &info.config { - if let Err(error) = cfg_req - .check( - ctx, - &container, - id, - &dependent_manifest.version, - &dependent_manifest.volumes, - dependency, - &dependency_config, - ) - .await? - { - return Ok(Some(DependencyError::ConfigUnsatisfied { error })); - } - } - DependencyError::NotRunning - .try_heal( - ctx, - db, - id, - dependency, - Some(dependency_config), - info, - receipts, - ) - .await? - } - DependencyError::NotRunning => { - let status = receipts - .status - .get(db, dependency) - .await? - .ok_or_else(|| not_found!(dependency))?; - if status.main.running() { - DependencyError::HealthChecksFailed { - failures: BTreeMap::new(), - } - .try_heal(ctx, db, id, dependency, dependency_config, info, receipts) - .await? - } else { - Some(DependencyError::NotRunning) - } - } - DependencyError::HealthChecksFailed { .. } => { - let status = receipts - .status - .get(db, dependency) - .await? - .ok_or_else(|| not_found!(dependency))?; - match status.main { - MainStatus::BackingUp { - started: Some(_), - health, - } - | MainStatus::Running { health, .. } => { - let mut failures = BTreeMap::new(); - for (check, res) in health { - if !matches!(res, HealthCheckResult::Success) - && receipts - .current_dependencies - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))? - .get(dependency) - .map(|x| x.health_checks.contains(&check)) - .unwrap_or(false) - { - failures.insert(check.clone(), res.clone()); - } - } - if !failures.is_empty() { - Some(DependencyError::HealthChecksFailed { failures }) - } else { - DependencyError::Transitive - .try_heal( - ctx, - db, - id, - dependency, - dependency_config, - info, - receipts, - ) - .await? - } - } - MainStatus::Starting { .. } | MainStatus::Restarting => { - DependencyError::Transitive - .try_heal( - ctx, - db, - id, - dependency, - dependency_config, - info, - receipts, - ) - .await? - } - _ => return Ok(Some(DependencyError::NotRunning)), - } - } - DependencyError::Transitive => { - if receipts - .dependency_errors - .get(db, dependency) - .await? - .unwrap_or_default() - .0 - .is_empty() - { - None - } else { - Some(DependencyError::Transitive) - } - } - }) - } - .boxed() - } -} -impl std::fmt::Display for DependencyError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - DependencyError::NotInstalled => write!(f, "Not Installed"), - DependencyError::IncorrectVersion { expected, received } => write!( - f, - "Incorrect Version: Expected {}, Received {}", - expected, - received.as_str() - ), - DependencyError::ConfigUnsatisfied { error } => { - write!(f, "Configuration Requirements Not Satisfied: {}", error) - } - DependencyError::NotRunning => write!(f, "Not Running"), - DependencyError::HealthChecksFailed { failures } => { - write!(f, "Failed Health Check(s): ")?; - let mut comma = false; - for (check, res) in failures { - if !comma { - comma = true; - } else { - write!(f, ", ")?; - } - write!(f, "{}: {}", check, res)?; - } - Ok(()) - } - DependencyError::Transitive => { - write!(f, "Dependency Error(s)") - } - } - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct TaggedDependencyError { - pub dependency: PackageId, - pub error: DependencyError, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub struct BreakageRes(pub BTreeMap); - -#[derive(Clone, Debug, Default, Deserialize, Serialize)] +#[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel)] +#[model = "Model"] pub struct Dependencies(pub BTreeMap); impl Map for Dependencies { type Key = PackageId; type Value = DepInfo; - fn get(&self, key: &Self::Key) -> Option<&Self::Value> { - self.0.get(key) - } -} -impl HasModel for Dependencies { - type Model = MapModel; } #[derive(Clone, Debug, Deserialize, Serialize)] @@ -460,47 +52,18 @@ impl DependencyRequirement { #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct DepInfo { pub version: VersionRange, pub requirement: DependencyRequirement, pub description: Option, #[serde(default)] - #[model] pub config: Option, } -impl DepInfo { - pub async fn satisfied( - &self, - ctx: &RpcContext, - db: &mut Db, - dependency_id: &PackageId, - dependency_config: Option, // fetch if none - dependent_id: &PackageId, - receipts: &TryHealReceipts, - ) -> Result, Error> { - Ok( - if let Some(err) = DependencyError::NotInstalled - .try_heal( - ctx, - db, - dependent_id, - dependency_id, - dependency_config, - self, - receipts, - ) - .await? - { - Err(err) - } else { - Ok(()) - }, - ) - } -} #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct DependencyConfig { check: PackageProcedure, auto_configure: PackageProcedure, @@ -509,7 +72,6 @@ impl DependencyConfig { pub async fn check( &self, ctx: &RpcContext, - container: &Option, dependent_id: &PackageId, dependent_version: &Version, dependent_volumes: &Volumes, @@ -533,7 +95,6 @@ impl DependencyConfig { pub async fn auto_configure( &self, ctx: &RpcContext, - container: &Option, dependent_id: &PackageId, dependent_version: &Version, dependent_volumes: &Volumes, @@ -554,96 +115,6 @@ impl DependencyConfig { } } -pub struct DependencyConfigReceipts { - dependencies: LockReceipt, - dependency_volumes: LockReceipt, - dependency_version: LockReceipt, - dependency_config_action: LockReceipt, - package_volumes: LockReceipt, - package_version: LockReceipt, - docker_containers: LockReceipt, -} - -impl DependencyConfigReceipts { - pub async fn new<'a>( - db: &'a mut impl DbHandle, - package_id: &PackageId, - dependency_id: &PackageId, - ) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks, package_id, dependency_id); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - package_id: &PackageId, - dependency_id: &PackageId, - ) -> impl FnOnce(&Verifier) -> Result { - let dependencies = crate::db::DatabaseModel::new() - .package_data() - .idx_model(package_id) - .and_then(|x| x.installed()) - .map(|x| x.manifest().dependencies()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let dependency_volumes = crate::db::DatabaseModel::new() - .package_data() - .idx_model(dependency_id) - .and_then(|x| x.installed()) - .map(|x| x.manifest().volumes()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let dependency_version = crate::db::DatabaseModel::new() - .package_data() - .idx_model(dependency_id) - .and_then(|x| x.installed()) - .map(|x| x.manifest().version()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let dependency_config_action = crate::db::DatabaseModel::new() - .package_data() - .idx_model(dependency_id) - .and_then(|x| x.installed()) - .and_then(|x| x.manifest().config()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let package_volumes = crate::db::DatabaseModel::new() - .package_data() - .idx_model(package_id) - .and_then(|x| x.installed()) - .map(|x| x.manifest().volumes()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let package_version = crate::db::DatabaseModel::new() - .package_data() - .idx_model(package_id) - .and_then(|x| x.installed()) - .map(|x| x.manifest().version()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let docker_containers = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .and_then(|x| x.manifest().containers()) - .make_locker(LockType::Write) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - dependencies: dependencies.verify(&skeleton_key)?, - dependency_volumes: dependency_volumes.verify(&skeleton_key)?, - dependency_version: dependency_version.verify(&skeleton_key)?, - dependency_config_action: dependency_config_action.verify(&skeleton_key)?, - package_volumes: package_volumes.verify(&skeleton_key)?, - package_version: package_version.verify(&skeleton_key)?, - docker_containers: docker_containers.verify(&skeleton_key)?, - }) - } - } -} - #[command( subcommands(self(configure_impl(async)), configure_dry), display(display_none) @@ -659,15 +130,13 @@ pub async fn configure_impl( ctx: RpcContext, (pkg_id, dep_id): (PackageId, PackageId), ) -> Result<(), Error> { - let mut db = ctx.db.handle(); let breakages = BTreeMap::new(); let overrides = Default::default(); - let receipts = DependencyConfigReceipts::new(&mut db, &pkg_id, &dep_id).await?; let ConfigDryRes { old_config: _, new_config, spec: _, - } = configure_logic(ctx.clone(), &mut db, (pkg_id, dep_id.clone()), &receipts).await?; + } = configure_logic(ctx.clone(), (pkg_id, dep_id.clone())).await?; let configure_context = ConfigureContext { breakages, @@ -694,50 +163,41 @@ pub async fn configure_dry( #[context] ctx: RpcContext, #[parent_data] (pkg_id, dependency_id): (PackageId, PackageId), ) -> Result { - let mut db = ctx.db.handle(); - let receipts = DependencyConfigReceipts::new(&mut db, &pkg_id, &dependency_id).await?; - configure_logic(ctx, &mut db, (pkg_id, dependency_id), &receipts).await + configure_logic(ctx, (pkg_id, dependency_id)).await } pub async fn configure_logic( ctx: RpcContext, - db: &mut PatchDbHandle, (pkg_id, dependency_id): (PackageId, PackageId), - receipts: &DependencyConfigReceipts, ) -> Result { - let pkg_version = receipts.package_version.get(db).await?; - let pkg_volumes = receipts.package_volumes.get(db).await?; - let dependency_config_action = receipts.dependency_config_action.get(db).await?; - let dependency_version = receipts.dependency_version.get(db).await?; - let dependency_volumes = receipts.dependency_volumes.get(db).await?; - let dependencies = receipts.dependencies.get(db).await?; - let pkg_docker_container = receipts.docker_containers.get(db, &*pkg_id).await?; + let db = ctx.db.peek().await?; + let pkg = db + .as_package_data() + .as_idx(&pkg_id) + .or_not_found(&pkg_id)? + .as_installed() + .or_not_found(&pkg_id)?; + let pkg_version = pkg.as_manifest().as_version().de()?; + let pkg_volumes = pkg.as_manifest().as_volumes().de()?; + let dependency = db + .as_package_data() + .as_idx(&dependency_id) + .or_not_found(&dependency_id)? + .as_installed() + .or_not_found(&dependency_id)?; + let dependency_config_action = dependency + .as_manifest() + .as_config() + .de()? + .ok_or_else(|| not_found!("Manifest Config"))?; + let dependency_version = dependency.as_manifest().as_version().de()?; + let dependency_volumes = dependency.as_manifest().as_volumes().de()?; + let dependency = pkg + .as_manifest() + .as_dependencies() + .as_idx(&dependency_id) + .or_not_found(&dependency_id)?; - let dependency = dependencies - .0 - .get(&dependency_id) - .ok_or_else(|| { - Error::new( - eyre!( - "dependency for {} not found in the manifest for {}", - dependency_id, - pkg_id - ), - crate::ErrorKind::NotFound, - ) - })? - .config - .as_ref() - .ok_or_else(|| { - Error::new( - eyre!( - "dependency config for {} not found on {}", - dependency_id, - pkg_id - ), - crate::ErrorKind::NotFound, - ) - })?; let ConfigRes { config: maybe_config, spec, @@ -760,6 +220,9 @@ pub async fn configure_logic( }; let new_config = dependency + .as_config() + .de()? + .ok_or_else(|| not_found!("Config"))? .auto_configure .sandboxed( &ctx, @@ -779,345 +242,122 @@ pub async fn configure_logic( spec, }) } + #[instrument(skip_all)] -pub async fn add_dependent_to_current_dependents_lists<'a, Db: DbHandle>( - db: &mut Db, +pub fn add_dependent_to_current_dependents_lists( + db: &mut Model, dependent_id: &PackageId, current_dependencies: &CurrentDependencies, - current_dependent_receipt: &LockReceipt, ) -> Result<(), Error> { for (dependency, dep_info) in ¤t_dependencies.0 { - if let Some(mut dependency_dependents) = - current_dependent_receipt.get(db, dependency).await? + if let Some(dependency_dependents) = db + .as_package_data_mut() + .as_idx_mut(dependency) + .and_then(|pde| pde.as_installed_mut()) + .map(|i| i.as_current_dependents_mut()) { - dependency_dependents - .0 - .insert(dependent_id.clone(), dep_info.clone()); - current_dependent_receipt - .set(db, dependency_dependents, dependency) - .await?; + dependency_dependents.insert(dependent_id, dep_info)?; } } Ok(()) } -#[derive(Debug, Clone, Default, Deserialize, Serialize)] -pub struct DependencyErrors(pub BTreeMap); -impl Map for DependencyErrors { - type Key = PackageId; - type Value = DependencyError; - fn get(&self, key: &Self::Key) -> Option<&Self::Value> { - self.0.get(key) - } -} -impl HasModel for DependencyErrors { - type Model = MapModel; -} -impl DependencyErrors { - pub async fn init( - ctx: &RpcContext, - db: &mut Db, - manifest: &Manifest, - current_dependencies: &CurrentDependencies, - receipts: &TryHealReceipts, - ) -> Result { - let mut res = BTreeMap::new(); - for (dependency_id, info) in current_dependencies.0.keys().filter_map(|dependency_id| { - manifest - .dependencies - .0 - .get(dependency_id) - .map(|info| (dependency_id, info)) - }) { - if let Err(e) = info - .satisfied(ctx, db, dependency_id, None, &manifest.id, receipts) - .await? - { - res.insert(dependency_id.clone(), e); - } - } - Ok(DependencyErrors(res)) - } -} -impl std::fmt::Display for DependencyErrors { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{{ ")?; - for (idx, (id, err)) in self.0.iter().enumerate() { - write!(f, "{}: {}", id, err)?; - if idx < self.0.len() - 1 { - // not last - write!(f, ", ")?; - } - } - write!(f, " }}") - } -} - -pub async fn break_all_dependents_transitive<'a, Db: DbHandle>( - db: &'a mut Db, - id: &'a PackageId, - error: DependencyError, - breakages: &'a mut BTreeMap, - receipts: &'a BreakTransitiveReceipts, -) -> Result<(), Error> { - for dependent in receipts - .current_dependents - .get(db, id) - .await? - .iter() - .flat_map(|x| x.0.keys()) - .filter(|dependent| id != *dependent) +pub fn set_dependents_with_live_pointers_to_needs_config( + db: &mut Peeked, + id: &PackageId, +) -> Result, Error> { + let mut res = Vec::new(); + for (dep, info) in db + .as_package_data() + .as_idx(id) + .or_not_found(id)? + .as_installed() + .or_not_found(id)? + .as_current_dependents() + .de()? + .0 { - break_transitive(db, dependent, id, error.clone(), breakages, receipts).await?; - } - Ok(()) -} - -#[derive(Clone)] -pub struct BreakTransitiveReceipts { - pub dependency_receipt: DependencyReceipt, - dependency_errors: LockReceipt, - current_dependents: LockReceipt, -} - -impl BreakTransitiveReceipts { - pub async fn new(db: &'_ mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup(locks: &mut Vec) -> impl FnOnce(&Verifier) -> Result { - let dependency_receipt = DependencyReceipt::setup(locks); - let dependency_errors = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.status().dependency_errors()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let current_dependents = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.current_dependents()) - .make_locker(LockType::Exist) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - dependency_receipt: dependency_receipt(skeleton_key)?, - dependency_errors: dependency_errors.verify(skeleton_key)?, - current_dependents: current_dependents.verify(skeleton_key)?, - }) - } - } -} - -#[instrument(skip_all)] -pub fn break_transitive<'a, Db: DbHandle>( - db: &'a mut Db, - id: &'a PackageId, - dependency: &'a PackageId, - error: DependencyError, - breakages: &'a mut BTreeMap, - receipts: &'a BreakTransitiveReceipts, -) -> BoxFuture<'a, Result<(), Error>> { - async move { - let mut tx = db.begin().await?; - let mut dependency_errors = receipts - .dependency_errors - .get(&mut tx, id) - .await? - .ok_or_else(|| not_found!(id))?; - - let old = dependency_errors.0.remove(dependency); - let newly_broken = if let Some(e) = &old { - error.cmp_priority(&e) == Ordering::Greater - } else { - true - }; - dependency_errors.0.insert( - dependency.clone(), - if let Some(old) = old { - old.merge_with(error.clone()) - } else { - error.clone() - }, - ); - if newly_broken { - breakages.insert( - id.clone(), - TaggedDependencyError { - dependency: dependency.clone(), - error: error.clone(), - }, - ); - receipts - .dependency_errors - .set(&mut tx, dependency_errors, id) - .await?; - - tx.save().await?; - break_all_dependents_transitive( - db, - id, - DependencyError::Transitive, - breakages, - receipts, - ) - .await?; - } else { - receipts - .dependency_errors - .set(&mut tx, dependency_errors, id) - .await?; - - tx.save().await?; - } - - Ok(()) - } - .boxed() -} - -#[instrument(skip_all)] -pub async fn heal_all_dependents_transitive<'a, Db: DbHandle>( - ctx: &'a RpcContext, - db: &'a mut Db, - id: &'a PackageId, - locks: &'a DependencyReceipt, -) -> Result<(), Error> { - let dependents = locks - .current_dependents - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; - for dependent in dependents.0.keys().filter(|dependent| id != *dependent) { - heal_transitive(ctx, db, dependent, id, locks).await?; - } - Ok(()) -} - -#[instrument(skip_all)] -pub fn heal_transitive<'a, Db: DbHandle>( - ctx: &'a RpcContext, - db: &'a mut Db, - id: &'a PackageId, - dependency: &'a PackageId, - receipts: &'a DependencyReceipt, -) -> BoxFuture<'a, Result<(), Error>> { - async move { - let mut status = receipts - .status - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; - - let old = status.dependency_errors.0.remove(dependency); - - if let Some(old) = old { - let info = receipts - .dependency - .get(db, (id, dependency)) - .await? - .ok_or_else(|| not_found!(format!("{id}'s dependency: {dependency}")))?; - if let Some(new) = old - .try_heal(ctx, db, id, dependency, None, &info, &receipts.try_heal) - .await? - { - status.dependency_errors.0.insert(dependency.clone(), new); - receipts.status.set(db, status, id).await?; - } else { - receipts.status.set(db, status, id).await?; - heal_all_dependents_transitive(ctx, db, id, receipts).await?; - } - } - - Ok(()) - } - .boxed() -} - -pub async fn reconfigure_dependents_with_live_pointers( - ctx: &RpcContext, - tx: impl DbHandle, - receipts: &ConfigReceipts, - pde: &InstalledPackageDataEntry, -) -> Result<(), Error> { - let dependents = &pde.current_dependents; - let me = &pde.manifest.id; - for (dependent_id, dependency_info) in &dependents.0 { - if dependency_info.pointers.iter().any(|ptr| match ptr { + if info.pointers.iter().any(|ptr| match ptr { // dependency id matches the package being uninstalled - PackagePointerSpec::TorAddress(ptr) => &ptr.package_id == me && dependent_id != me, - PackagePointerSpec::LanAddress(ptr) => &ptr.package_id == me && dependent_id != me, + PackagePointerSpec::TorAddress(ptr) => &ptr.package_id == id && &dep != id, + PackagePointerSpec::LanAddress(ptr) => &ptr.package_id == id && &dep != id, // we never need to retarget these PackagePointerSpec::TorKey(_) => false, PackagePointerSpec::Config(_) => false, }) { - let breakages = BTreeMap::new(); - let overrides = Default::default(); - - let configure_context = ConfigureContext { - breakages, - timeout: None, - config: None, - dry_run: false, - overrides, - }; - crate::config::configure(&ctx, dependent_id, configure_context).await?; + let installed = db + .as_package_data_mut() + .as_idx_mut(&dep) + .or_not_found(&dep)? + .as_installed_mut() + .or_not_found(&dep)?; + let version = installed.as_manifest().as_version().de()?; + let configured = installed.as_status_mut().as_configured_mut(); + if configured.de()? { + configured.ser(&false)?; + res.push((dep, version)); + } } } - Ok(()) + Ok(res) } -#[derive(Clone)] -pub struct DependencyReceipt { - pub try_heal: TryHealReceipts, - current_dependents: LockReceipt, - status: LockReceipt, - dependency: LockReceipt, -} - -impl DependencyReceipt { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup(locks: &mut Vec) -> impl FnOnce(&Verifier) -> Result { - let try_heal = TryHealReceipts::setup(locks); - let dependency = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest().dependencies().star()) - .make_locker(LockType::Read) - .add_to_keys(locks); - let current_dependents = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.current_dependents()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let status = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.status()) - .make_locker(LockType::Write) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - try_heal: try_heal(skeleton_key)?, - current_dependents: current_dependents.verify(skeleton_key)?, - status: status.verify(skeleton_key)?, - dependency: dependency.verify(skeleton_key)?, - }) +#[instrument(skip_all)] +pub async fn compute_dependency_config_errs( + ctx: &RpcContext, + db: &Peeked, + manifest: &Manifest, + current_dependencies: &CurrentDependencies, + dependency_config: &BTreeMap, +) -> Result { + let mut dependency_config_errs = BTreeMap::new(); + for (dependency, _dep_info) in current_dependencies + .0 + .iter() + .filter(|(dep_id, _)| dep_id != &&manifest.id) + { + // check if config passes dependency check + if let Some(cfg) = &manifest + .dependencies + .0 + .get(dependency) + .or_not_found(dependency)? + .config + { + if let Err(error) = cfg + .check( + ctx, + &manifest.id, + &manifest.version, + &manifest.volumes, + dependency, + &if let Some(config) = dependency_config.get(dependency) { + config.clone() + } else if let Some(manifest) = db + .as_package_data() + .as_idx(dependency) + .and_then(|pde| pde.as_installed()) + .map(|i| i.as_manifest().de()) + .transpose()? + { + if let Some(config) = &manifest.config { + config + .get(ctx, &manifest.id, &manifest.version, &manifest.volumes) + .await? + .config + .unwrap_or_default() + } else { + Config::default() + } + } else { + Config::default() + }, + ) + .await? + { + dependency_config_errs.insert(dependency.clone(), error); + } } } + Ok(DependencyConfigErrors(dependency_config_errs)) } diff --git a/backend/src/error.rs b/backend/src/error.rs index d4286339d..2b769b03a 100644 --- a/backend/src/error.rs +++ b/backend/src/error.rs @@ -1,5 +1,5 @@ use color_eyre::eyre::eyre; -pub use models::{Error, ErrorKind, ResultExt}; +pub use models::{Error, ErrorKind, OptionExt, ResultExt}; #[derive(Debug, Default)] pub struct ErrorCollection(Vec); @@ -54,7 +54,7 @@ impl std::fmt::Display for ErrorCollection { macro_rules! ensure_code { ($x:expr, $c:expr, $fmt:expr $(, $arg:expr)*) => { if !($x) { - return Err(crate::Error::new(color_eyre::eyre::eyre!($fmt, $($arg, )*), $c)); + return Err(crate::error::Error::new(color_eyre::eyre::eyre!($fmt, $($arg, )*), $c)); } }; } diff --git a/backend/src/hostname.rs b/backend/src/hostname.rs index 25342c4a1..f68d5c9d8 100644 --- a/backend/src/hostname.rs +++ b/backend/src/hostname.rs @@ -60,6 +60,14 @@ pub async fn set_hostname(hostname: &Hostname) -> Result<(), Error> { .arg(hostname) .invoke(ErrorKind::ParseSysInfo) .await?; + Command::new("sed") + .arg("-i") + .arg(format!( + "s/\\(\\s\\)localhost\\( {hostname}\\)\\?/\\1localhost {hostname}/g" + )) + .arg("/etc/hosts") + .invoke(ErrorKind::ParseSysInfo) + .await?; Ok(()) } diff --git a/backend/src/init.rs b/backend/src/init.rs index f46c42e5b..8a5ae2484 100644 --- a/backend/src/init.rs +++ b/backend/src/init.rs @@ -1,4 +1,3 @@ -use std::collections::HashMap; use std::fs::Permissions; use std::os::unix::fs::PermissionsExt; use std::path::Path; @@ -7,17 +6,18 @@ use std::time::Duration; use color_eyre::eyre::eyre; use helpers::NonDetachingJoinHandle; use models::ResultExt; -use patch_db::{DbHandle, LockReceipt, LockType}; use rand::random; use sqlx::{Pool, Postgres}; use tokio::process::Command; +use tracing::instrument; use crate::account::AccountInfo; use crate::context::rpc::RpcContextConfig; -use crate::db::model::{ServerInfo, ServerStatus}; +use crate::db::model::ServerStatus; use crate::disk::mount::util::unmount; use crate::install::PKG_ARCHIVE_DIR; use crate::middleware::auth::LOCAL_AUTH_COOKIE_PATH; +use crate::prelude::*; use crate::sound::BEP; use crate::system::time; use crate::util::docker::{create_bridge_network, CONTAINER_DATADIR, CONTAINER_TOOL}; @@ -40,40 +40,8 @@ pub async fn check_time_is_synchronized() -> Result { == "NTPSynchronized=yes") } -pub struct InitReceipts { - pub server_info: LockReceipt, - pub server_version: LockReceipt, - pub version_range: LockReceipt, -} -impl InitReceipts { - pub async fn new(db: &mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let server_info = crate::db::DatabaseModel::new() - .server_info() - .make_locker(LockType::Write) - .add_to_keys(&mut locks); - let server_version = crate::db::DatabaseModel::new() - .server_info() - .version() - .make_locker(LockType::Write) - .add_to_keys(&mut locks); - let version_range = crate::db::DatabaseModel::new() - .server_info() - .eos_version_compat() - .make_locker(LockType::Write) - .add_to_keys(&mut locks); - - let skeleton_key = db.lock_all(locks).await?; - Ok(Self { - server_info: server_info.verify(&skeleton_key)?, - server_version: server_version.verify(&skeleton_key)?, - version_range: version_range.verify(&skeleton_key)?, - }) - } -} - // must be idempotent +#[tracing::instrument(skip_all)] pub async fn init_postgres(datadir: impl AsRef) -> Result<(), Error> { let db_dir = datadir.as_ref().join("main/postgresql"); if tokio::process::Command::new("mountpoint") @@ -134,7 +102,11 @@ pub async fn init_postgres(datadir: impl AsRef) -> Result<(), Error> { tmp }; if tokio::fs::metadata(&conf_dir).await.is_ok() { - tokio::fs::rename(&conf_dir, &conf_dir_tmp).await?; + Command::new("mv") + .arg(&conf_dir) + .arg(&conf_dir_tmp) + .invoke(ErrorKind::Filesystem) + .await?; } let mut old_version = pg_version; while old_version > 13 @@ -155,7 +127,11 @@ pub async fn init_postgres(datadir: impl AsRef) -> Result<(), Error> { if tokio::fs::metadata(&conf_dir).await.is_ok() { tokio::fs::remove_dir_all(&conf_dir).await?; } - tokio::fs::rename(&conf_dir_tmp, &conf_dir).await?; + Command::new("mv") + .arg(&conf_dir_tmp) + .arg(&conf_dir) + .invoke(ErrorKind::Filesystem) + .await?; } } @@ -191,6 +167,7 @@ pub struct InitResult { pub db: patch_db::PatchDb, } +#[instrument(skip_all)] pub async fn init(cfg: &RpcContextConfig) -> Result { tokio::fs::create_dir_all("/run/embassy") .await @@ -223,13 +200,14 @@ pub async fn init(cfg: &RpcContextConfig) -> Result { let account = AccountInfo::load(&secret_store).await?; let db = cfg.db(&account).await?; + db.mutate(|d| { + let model = d.de()?; + d.ser(&model) + }) + .await?; tracing::info!("Opened PatchDB"); - let mut handle = db.handle(); - let mut server_info = crate::db::DatabaseModel::new() - .server_info() - .get_mut(&mut handle) - .await?; - let receipts = InitReceipts::new(&mut handle).await?; + let peek = db.peek().await?; + let mut server_info = peek.as_server_info().de()?; // write to ca cert store tokio::fs::write( @@ -337,6 +315,7 @@ pub async fn init(cfg: &RpcContextConfig) -> Result { } if CONTAINER_TOOL == "podman" { + crate::util::docker::remove_container("netdummy", true).await?; Command::new("podman") .arg("run") .arg("-d") @@ -388,9 +367,13 @@ pub async fn init(cfg: &RpcContextConfig) -> Result { server_info.system_start_time = time().await?; - server_info.save(&mut handle).await?; + db.mutate(|v| { + v.as_server_info_mut().ser(&server_info)?; + Ok(()) + }) + .await?; - crate::version::init(&mut handle, &secret_store, &receipts).await?; + crate::version::init(&db, &secret_store).await?; if should_rebuild { match tokio::fs::remove_file(SYSTEM_REBUILD_PATH).await { diff --git a/backend/src/install/cleanup.rs b/backend/src/install/cleanup.rs index 0cc4cbbef..e47b7ca6b 100644 --- a/backend/src/install/cleanup.rs +++ b/backend/src/install/cleanup.rs @@ -1,102 +1,23 @@ use std::path::PathBuf; use std::sync::Arc; -use patch_db::{DbHandle, LockReceipt, LockTargetId, LockType, PatchDbHandle, Verifier}; +use models::OptionExt; use sqlx::{Executor, Postgres}; use tracing::instrument; use super::PKG_ARCHIVE_DIR; -use crate::config::{not_found, ConfigReceipts}; use crate::context::RpcContext; use crate::db::model::{ - AllPackageData, CurrentDependencies, CurrentDependents, InstalledPackageDataEntry, - PackageDataEntry, -}; -use crate::dependencies::{ - reconfigure_dependents_with_live_pointers, DependencyErrors, TryHealReceipts, + CurrentDependencies, Database, PackageDataEntry, PackageDataEntryInstalled, + PackageDataEntryMatchModelRef, }; use crate::error::ErrorCollection; -use crate::s9pk::manifest::{Manifest, PackageId}; +use crate::prelude::*; +use crate::s9pk::manifest::PackageId; use crate::util::{Apply, Version}; use crate::volume::{asset_dir, script_dir}; use crate::Error; -pub struct UpdateDependencyReceipts { - try_heal: TryHealReceipts, - dependency_errors: LockReceipt, - manifest: LockReceipt, -} -impl UpdateDependencyReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup(locks: &mut Vec) -> impl FnOnce(&Verifier) -> Result { - let dependency_errors = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.status().dependency_errors()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let manifest = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let try_heal = TryHealReceipts::setup(locks); - move |skeleton_key| { - Ok(Self { - dependency_errors: dependency_errors.verify(skeleton_key)?, - manifest: manifest.verify(skeleton_key)?, - try_heal: try_heal(skeleton_key)?, - }) - } - } -} - -#[instrument(skip_all)] -pub async fn update_dependency_errors_of_dependents<'a, Db: DbHandle>( - ctx: &RpcContext, - db: &mut Db, - id: &PackageId, - deps: &CurrentDependents, - receipts: &UpdateDependencyReceipts, -) -> Result<(), Error> { - for dep in deps.0.keys() { - if let Some(man) = receipts.manifest.get(db, dep).await? { - if let Err(e) = if let Some(info) = man.dependencies.0.get(id) { - info.satisfied(ctx, db, id, None, dep, &receipts.try_heal) - .await? - } else { - Ok(()) - } { - let mut errs = receipts - .dependency_errors - .get(db, dep) - .await? - .ok_or_else(|| not_found!(dep))?; - errs.0.insert(id.clone(), e); - receipts.dependency_errors.set(db, errs, dep).await? - } else { - let mut errs = receipts - .dependency_errors - .get(db, dep) - .await? - .ok_or_else(|| not_found!(dep))?; - errs.0.remove(id); - receipts.dependency_errors.set(db, errs, dep).await? - } - } - } - Ok(()) -} - #[instrument(skip_all)] pub async fn cleanup(ctx: &RpcContext, id: &PackageId, version: &Version) -> Result<(), Error> { let mut errors = ErrorCollection::new(); @@ -136,66 +57,26 @@ pub async fn cleanup(ctx: &RpcContext, id: &PackageId, version: &Version) -> Res errors.into_result() } -pub struct CleanupFailedReceipts { - package_data_entry: LockReceipt, - package_entries: LockReceipt, -} - -impl CleanupFailedReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup(locks: &mut Vec) -> impl FnOnce(&Verifier) -> Result { - let package_data_entry = crate::db::DatabaseModel::new() - .package_data() - .star() - .make_locker(LockType::Write) - .add_to_keys(locks); - let package_entries = crate::db::DatabaseModel::new() - .package_data() - .make_locker(LockType::Write) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - package_data_entry: package_data_entry.verify(skeleton_key).unwrap(), - package_entries: package_entries.verify(skeleton_key).unwrap(), - }) - } - } -} - #[instrument(skip_all)] -pub async fn cleanup_failed( - ctx: &RpcContext, - db: &mut Db, - id: &PackageId, - receipts: &CleanupFailedReceipts, -) -> Result<(), Error> { - let pde = receipts - .package_data_entry - .get(db, id) +pub async fn cleanup_failed(ctx: &RpcContext, id: &PackageId) -> Result<(), Error> { + if let Some(version) = match ctx + .db + .peek() .await? - .ok_or_else(|| not_found!(id))?; - if let Some(manifest) = match &pde { - PackageDataEntry::Installing { manifest, .. } - | PackageDataEntry::Restoring { manifest, .. } => Some(manifest), - PackageDataEntry::Updating { - manifest, - installed: - InstalledPackageDataEntry { - manifest: installed_manifest, - .. - }, - .. - } => { - if &manifest.version != &installed_manifest.version { - Some(manifest) + .as_package_data() + .as_idx(id) + .or_not_found(id)? + .as_match() + { + PackageDataEntryMatchModelRef::Installing(m) => Some(m.as_manifest().as_version().de()?), + PackageDataEntryMatchModelRef::Restoring(m) => Some(m.as_manifest().as_version().de()?), + PackageDataEntryMatchModelRef::Updating(m) => { + let manifest_version = m.as_manifest().as_version().de()?; + let installed = m.as_installed().as_manifest().as_version().de()?; + if manifest_version != installed { + Some(manifest_version) } else { - None + None // do not remove existing data } } _ => { @@ -203,169 +84,107 @@ pub async fn cleanup_failed( None } } { - cleanup(ctx, id, &manifest.version).await?; + cleanup(ctx, id, &version).await?; } - match pde { - PackageDataEntry::Installing { .. } | PackageDataEntry::Restoring { .. } => { - let mut entries = receipts.package_entries.get(db).await?; - entries.0.remove(id); - receipts.package_entries.set(db, entries).await?; - } - PackageDataEntry::Updating { - installed, - static_files, - .. - } => { - receipts - .package_data_entry - .set( - db, - PackageDataEntry::Installed { - manifest: installed.manifest.clone(), - installed, - static_files, - }, - id, - ) - .await?; - } - _ => (), - } - - Ok(()) + ctx.db + .mutate(|v| { + match v + .clone() + .into_package_data() + .into_idx(id) + .or_not_found(id)? + .as_match() + { + PackageDataEntryMatchModelRef::Installing(_) + | PackageDataEntryMatchModelRef::Restoring(_) => { + v.as_package_data_mut().remove(id)?; + } + PackageDataEntryMatchModelRef::Updating(pde) => { + v.as_package_data_mut() + .as_idx_mut(id) + .or_not_found(id)? + .ser(&PackageDataEntry::Installed(PackageDataEntryInstalled { + manifest: pde.as_installed().as_manifest().de()?, + static_files: pde.as_static_files().de()?, + installed: pde.as_installed().de()?, + }))?; + } + _ => (), + } + Ok(()) + }) + .await } #[instrument(skip_all)] -pub async fn remove_from_current_dependents_lists<'a, Db: DbHandle>( - db: &mut Db, - id: &'a PackageId, - current_dependencies: &'a CurrentDependencies, - current_dependent_receipt: &LockReceipt, +pub fn remove_from_current_dependents_lists( + db: &mut Model, + id: &PackageId, + current_dependencies: &CurrentDependencies, ) -> Result<(), Error> { for dep in current_dependencies.0.keys().chain(std::iter::once(id)) { - if let Some(mut current_dependents) = current_dependent_receipt.get(db, dep).await? { - if current_dependents.0.remove(id).is_some() { - current_dependent_receipt - .set(db, current_dependents, dep) - .await?; - } + if let Some(current_dependents) = db + .as_package_data_mut() + .as_idx_mut(dep) + .and_then(|d| d.as_installed_mut()) + .map(|i| i.as_current_dependents_mut()) + { + current_dependents.remove(id)?; } } Ok(()) } -pub struct UninstallReceipts { - config: ConfigReceipts, - removing: LockReceipt, - packages: LockReceipt, - current_dependents: LockReceipt, - update_depenency_receipts: UpdateDependencyReceipts, -} -impl UninstallReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle, id: &PackageId) -> Result { - let mut locks = Vec::new(); - let setup = Self::setup(&mut locks, id); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - id: &PackageId, - ) -> impl FnOnce(&Verifier) -> Result { - let config = ConfigReceipts::setup(locks); - let removing = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|pde| pde.removing()) - .make_locker(LockType::Write) - .add_to_keys(locks); - - let current_dependents = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.current_dependents()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let packages = crate::db::DatabaseModel::new() - .package_data() - .make_locker(LockType::Write) - .add_to_keys(locks); - let update_depenency_receipts = UpdateDependencyReceipts::setup(locks); - move |skeleton_key| { - Ok(Self { - config: config(skeleton_key)?, - removing: removing.verify(skeleton_key)?, - current_dependents: current_dependents.verify(skeleton_key)?, - update_depenency_receipts: update_depenency_receipts(skeleton_key)?, - packages: packages.verify(skeleton_key)?, - }) - } - } -} #[instrument(skip_all)] -pub async fn uninstall( - ctx: &RpcContext, - db: &mut PatchDbHandle, - secrets: &mut Ex, - id: &PackageId, -) -> Result<(), Error> +pub async fn uninstall(ctx: &RpcContext, secrets: &mut Ex, id: &PackageId) -> Result<(), Error> where for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, { - let mut tx = db.begin().await?; - crate::db::DatabaseModel::new() - .package_data() - .idx_model(&id) - .lock(&mut tx, LockType::Write) - .await?; - let receipts = UninstallReceipts::new(&mut tx, id).await?; - let entry = receipts.removing.get(&mut tx).await?; - cleanup(ctx, &entry.manifest.id, &entry.manifest.version).await?; + let db = ctx.db.peek().await?; + let entry = db + .as_package_data() + .as_idx(id) + .or_not_found(id)? + .expect_as_removing()?; - let packages = { - let mut packages = receipts.packages.get(&mut tx).await?; - packages.0.remove(id); - packages - }; let dependents_paths: Vec = entry - .current_dependents - .0 - .keys() - .flat_map(|x| packages.0.get(x)) - .flat_map(|x| x.manifest_borrow().volumes.values()) + .as_removing() + .as_current_dependents() + .keys()? + .into_iter() + .filter(|x| x != id) + .flat_map(|x| db.as_package_data().as_idx(&x)) + .flat_map(|x| x.as_installed()) + .flat_map(|x| x.as_manifest().as_volumes().de()) + .flat_map(|x| x.values().cloned().collect::>()) .flat_map(|x| x.pointer_path(&ctx.datadir)) .collect(); - receipts.packages.set(&mut tx, packages).await?; - // once we have removed the package entry, we can change all the dependent pointers to null - reconfigure_dependents_with_live_pointers(ctx, &mut tx, &receipts.config, &entry).await?; - remove_from_current_dependents_lists( - &mut tx, - &entry.manifest.id, - &entry.current_dependencies, - &receipts.current_dependents, - ) - .await?; - update_dependency_errors_of_dependents( - ctx, - &mut tx, - &entry.manifest.id, - &entry.current_dependents, - &receipts.update_depenency_receipts, - ) - .await?; - let volumes = ctx + let volume_dir = ctx .datadir .join(crate::volume::PKG_VOLUME_DIR) - .join(&entry.manifest.id); + .join(&*entry.as_manifest().as_id().de()?); + let version = entry.as_removing().as_manifest().as_version().de()?; + tracing::debug!( + "Cleaning up {:?} except for {:?}", + volume_dir, + dependents_paths + ); + cleanup(ctx, id, &version).await?; + cleanup_folder(volume_dir, Arc::new(dependents_paths)).await; + remove_tor_keys(secrets, id).await?; - tracing::debug!("Cleaning up {:?} at {:?}", volumes, dependents_paths); - cleanup_folder(volumes, Arc::new(dependents_paths)).await; - remove_tor_keys(secrets, &entry.manifest.id).await?; - tx.commit().await?; - Ok(()) + ctx.db + .mutate(|d| { + d.as_package_data_mut().remove(id)?; + remove_from_current_dependents_lists( + d, + id, + &entry.as_removing().as_current_dependencies().de()?, + ) + }) + .await } #[instrument(skip_all)] @@ -373,8 +192,7 @@ pub async fn remove_tor_keys(secrets: &mut Ex, id: &PackageId) -> Result<(), where for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, { - let id_str = id.as_str(); - sqlx::query!("DELETE FROM tor WHERE package = $1", id_str) + sqlx::query!("DELETE FROM tor WHERE package = $1", &*id) .execute(secrets) .await?; Ok(()) diff --git a/backend/src/install/mod.rs b/backend/src/install/mod.rs index c29a1d1f3..3e3f07fb7 100644 --- a/backend/src/install/mod.rs +++ b/backend/src/install/mod.rs @@ -14,38 +14,40 @@ use futures::{FutureExt, StreamExt, TryStreamExt}; use http::header::CONTENT_LENGTH; use http::{Request, Response, StatusCode}; use hyper::Body; -use patch_db::{DbHandle, LockType}; +use models::{mime, DataUrl}; use reqwest::Url; use rpc_toolkit::command; use rpc_toolkit::yajrc::RpcError; use serde_json::{json, Value}; use tokio::fs::{File, OpenOptions}; -use tokio::io::{AsyncRead, AsyncSeek, AsyncSeekExt}; +use tokio::io::{AsyncRead, AsyncSeek, AsyncSeekExt, AsyncWriteExt}; use tokio::process::Command; -use tokio::sync::oneshot; +use tokio::sync::{oneshot, Mutex}; use tokio_stream::wrappers::ReadDirStream; use tracing::instrument; use self::cleanup::{cleanup_failed, remove_from_current_dependents_lists}; -use crate::config::{ConfigReceipts, ConfigureContext}; +use crate::config::ConfigureContext; use crate::context::{CliContext, RpcContext}; use crate::core::rpc_continuations::{RequestGuid, RpcContinuation}; use crate::db::model::{ - CurrentDependencies, CurrentDependencyInfo, CurrentDependents, InstalledPackageDataEntry, - PackageDataEntry, StaticDependencyInfo, StaticFiles, + CurrentDependencies, CurrentDependencyInfo, CurrentDependents, InstalledPackageInfo, + PackageDataEntry, PackageDataEntryInstalled, PackageDataEntryInstalling, + PackageDataEntryMatchModelRef, PackageDataEntryRemoving, PackageDataEntryRestoring, + PackageDataEntryUpdating, StaticDependencyInfo, StaticFiles, }; use crate::dependencies::{ - add_dependent_to_current_dependents_lists, break_all_dependents_transitive, - reconfigure_dependents_with_live_pointers, BreakTransitiveReceipts, BreakageRes, - DependencyError, DependencyErrors, + add_dependent_to_current_dependents_lists, compute_dependency_config_errs, + set_dependents_with_live_pointers_to_needs_config, }; -use crate::install::cleanup::{cleanup, update_dependency_errors_of_dependents}; +use crate::install::cleanup::cleanup; use crate::install::progress::{InstallProgress, InstallProgressTracker}; use crate::marketplace::with_query_params; use crate::notifications::NotificationLevel; +use crate::prelude::*; use crate::s9pk::manifest::{Manifest, PackageId}; use crate::s9pk::reader::S9pkReader; -use crate::status::{MainStatus, Status}; +use crate::status::{DependencyConfigErrors, MainStatus, Status}; use crate::util::docker::CONTAINER_TOOL; use crate::util::io::{copy_and_shutdown, response_to_reader}; use crate::util::serde::{display_serializable, Port}; @@ -55,7 +57,6 @@ use crate::{Error, ErrorKind, ResultExt}; pub mod cleanup; pub mod progress; -pub mod update; pub const PKG_ARCHIVE_DIR: &str = "package-data/archive"; pub const PKG_PUBLIC_DIR: &str = "package-data/public"; @@ -63,33 +64,30 @@ pub const PKG_WASM_DIR: &str = "package-data/wasm"; #[command(display(display_serializable))] pub async fn list(#[context] ctx: RpcContext) -> Result { - let mut hdl = ctx.db.handle(); - let package_data = crate::db::DatabaseModel::new() - .package_data() - .get(&mut hdl) - .await?; - - Ok(package_data - .0 + Ok(ctx.db.peek().await?.as_package_data().as_entries()? .iter() .filter_map(|(id, pde)| { - serde_json::to_value(match pde { - PackageDataEntry::Installed { installed, .. } => { - json!({ "status":"installed","id": id.clone(), "version": installed.manifest.version.clone()}) + let status = match pde.as_match() { + PackageDataEntryMatchModelRef::Installed(_) => { + "installed" } - PackageDataEntry::Installing { manifest, install_progress, .. } => { - json!({ "status":"installing","id": id.clone(), "version": manifest.version.clone(), "progress": install_progress.clone()}) + PackageDataEntryMatchModelRef::Installing(_) => { + "installing" } - PackageDataEntry::Updating { manifest, installed, install_progress, .. } => { - json!({ "status":"updating","id": id.clone(), "version": installed.manifest.version.clone(), "progress": install_progress.clone()}) + PackageDataEntryMatchModelRef::Updating(_) => { + "updating" } - PackageDataEntry::Restoring { manifest, install_progress, .. } => { - json!({ "status":"restoring","id": id.clone(), "version": manifest.version.clone(), "progress": install_progress.clone()}) + PackageDataEntryMatchModelRef::Restoring(_) => { + "restoring" } - PackageDataEntry::Removing { manifest, .. } => { - json!({ "status":"removing", "id": id.clone(), "version": manifest.version.clone()}) + PackageDataEntryMatchModelRef::Removing(_) => { + "removing" } - }) + PackageDataEntryMatchModelRef::Error(_) => { + "error" + } + }; + serde_json::to_value(json!({ "status":status, "id": id.clone(), "version": pde.as_manifest().as_version().de().ok()?})) .ok() }) .collect()) @@ -155,7 +153,7 @@ pub async fn install( let man: Manifest = ctx .client .get(with_query_params( - &ctx, + ctx.clone(), format!( "{}/package/v0/manifest/{}?spec={}&version-priority={}", marketplace_url, id, version, version_priority, @@ -173,7 +171,7 @@ pub async fn install( let s9pk = ctx .client .get(with_query_params( - &ctx, + ctx.clone(), format!( "{}/package/v0/{}.s9pk?spec=={}&version-priority={}", marketplace_url, id, man.version, version_priority, @@ -183,10 +181,9 @@ pub async fn install( .send() .await .with_kind(crate::ErrorKind::Registry)? - .error_for_status() - .with_kind(crate::ErrorKind::Registry)?; + .error_for_status()?; - if man.id.as_str() != id || !man.version.satisfies(&version) { + if *man.id != *id || !man.version.satisfies(&version) { return Err(Error::new( eyre!("Fetched package does not match requested id and version"), ErrorKind::Registry, @@ -207,7 +204,7 @@ pub async fn install( &mut response_to_reader( ctx.client .get(with_query_params( - &ctx, + ctx.clone(), format!( "{}/package/v0/license/{}?spec=={}", marketplace_url, id, man.version, @@ -228,7 +225,7 @@ pub async fn install( &mut response_to_reader( ctx.client .get(with_query_params( - &ctx, + ctx.clone(), format!( "{}/package/v0/instructions/{}?spec=={}", marketplace_url, id, man.version, @@ -249,7 +246,7 @@ pub async fn install( &mut response_to_reader( ctx.client .get(with_query_params( - &ctx, + ctx.clone(), format!( "{}/package/v0/icon/{}?spec=={}", marketplace_url, id, man.version, @@ -276,65 +273,59 @@ pub async fn install( tracing::warn!("Failed to pre-download icon: {}", e); } - let progress = InstallProgress::new(s9pk.content_length()); + let progress = Arc::new(InstallProgress::new(s9pk.content_length())); let static_files = StaticFiles::local(&man.id, &man.version, icon_type); - let mut db_handle = ctx.db.handle(); - let mut tx = db_handle.begin().await?; - let mut pde = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&man.id) - .get_mut(&mut tx) + ctx.db + .mutate(|db| { + let pde = match db + .as_package_data() + .as_idx(&man.id) + .map(|x| x.de()) + .transpose()? + { + Some(PackageDataEntry::Installed(PackageDataEntryInstalled { + installed, + static_files, + .. + })) => PackageDataEntry::Updating(PackageDataEntryUpdating { + install_progress: progress.clone(), + static_files, + installed, + manifest: man.clone(), + }), + None => PackageDataEntry::Installing(PackageDataEntryInstalling { + install_progress: progress.clone(), + static_files, + manifest: man.clone(), + }), + _ => { + return Err(Error::new( + eyre!("Cannot install over a package in a transient state"), + crate::ErrorKind::InvalidRequest, + )) + } + }; + db.as_package_data_mut().insert(&man.id, &pde) + }) .await?; - match pde.take() { - Some(PackageDataEntry::Installed { - installed, - static_files, - .. - }) => { - *pde = Some(PackageDataEntry::Updating { - install_progress: progress.clone(), - static_files, - installed, - manifest: man.clone(), - }) - } - None => { - *pde = Some(PackageDataEntry::Installing { - install_progress: progress.clone(), - static_files, - manifest: man.clone(), - }) - } - _ => { - return Err(Error::new( - eyre!("Cannot install over a package in a transient state"), - crate::ErrorKind::InvalidRequest, - )) - } - } - pde.save(&mut tx).await?; - tx.commit().await?; - drop(db_handle); + let downloading = download_install_s9pk( + ctx.clone(), + man.clone(), + Some(marketplace_url), + Arc::new(InstallProgress::new(s9pk.content_length())), + response_to_reader(s9pk), + None, + ); tokio::spawn(async move { - let mut db_handle = ctx.db.handle(); - if let Err(e) = download_install_s9pk( - &ctx, - &man, - Some(marketplace_url), - InstallProgress::new(s9pk.content_length()), - response_to_reader(s9pk), - None, - ) - .await - { + if let Err(e) = downloading.await { let err_str = format!("Install of {}@{} Failed: {}", man.id, man.version, e); tracing::error!("{}", err_str); tracing::debug!("{:?}", e); if let Err(e) = ctx .notification_manager .notify( - &mut db_handle, + ctx.db.clone(), Some(man.id), NotificationLevel::Error, String::from("Install Failed"), @@ -348,11 +339,11 @@ pub async fn install( tracing::debug!("{:?}", e); } } + Ok::<_, String>(()) }); Ok(()) } - #[command(rpc_only, display(display_none))] #[instrument(skip_all)] pub async fn sideload( @@ -409,56 +400,54 @@ pub async fn sideload( Ok(a) => Some(a), }, }; - let progress = InstallProgress::new(content_length); + let progress = Arc::new(InstallProgress::new(content_length)); + let install_progress = progress.clone(); - let mut hdl = new_ctx.db.handle(); - let mut tx = hdl.begin().await?; - - let mut pde = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&manifest.id) - .get_mut(&mut tx) + new_ctx + .db + .mutate(|db| { + let pde = match db + .as_package_data() + .as_idx(&manifest.id) + .map(|x| x.de()) + .transpose()? + { + Some(PackageDataEntry::Installed(PackageDataEntryInstalled { + installed, + static_files, + .. + })) => PackageDataEntry::Updating(PackageDataEntryUpdating { + install_progress, + installed, + manifest: manifest.clone(), + static_files, + }), + None => PackageDataEntry::Installing(PackageDataEntryInstalling { + install_progress, + static_files: StaticFiles::local( + &manifest.id, + &manifest.version, + &manifest.assets.icon_type(), + ), + manifest: manifest.clone(), + }), + _ => { + return Err(Error::new( + eyre!("Cannot install over a package in a transient state"), + crate::ErrorKind::InvalidRequest, + )) + } + }; + db.as_package_data_mut().insert(&manifest.id, &pde) + }) .await?; - match pde.take() { - Some(PackageDataEntry::Installed { - installed, - static_files, - .. - }) => { - *pde = Some(PackageDataEntry::Updating { - install_progress: progress.clone(), - installed, - manifest: manifest.clone(), - static_files, - }) - } - None => { - *pde = Some(PackageDataEntry::Installing { - install_progress: progress.clone(), - static_files: StaticFiles::local( - &manifest.id, - &manifest.version, - &manifest.assets.icon_type(), - ), - manifest: manifest.clone(), - }) - } - _ => { - return Err(Error::new( - eyre!("Cannot install over a package in a transient state"), - crate::ErrorKind::InvalidRequest, - )) - } - } - pde.save(&mut tx).await?; - tx.commit().await?; let (send, recv) = oneshot::channel(); tokio::spawn(async move { if let Err(e) = download_install_s9pk( - &new_ctx, - &manifest, + new_ctx.clone(), + manifest.clone(), None, progress, tokio_util::io::StreamReader::new(req.into_body().map_err(|e| { @@ -484,8 +473,8 @@ pub async fn sideload( if let Err(e) = new_ctx .notification_manager .notify( - &mut hdl, - Some(manifest.id), + new_ctx.db.clone(), + Some(manifest.id.clone()), NotificationLevel::Error, String::from("Install Failed"), err_str, @@ -604,87 +593,42 @@ async fn cli_install( Ok(()) } -#[command( - subcommands(self(uninstall_impl(async)), uninstall_dry), - display(display_none), - metadata(sync_db = true) -)] -pub async fn uninstall(#[arg] id: PackageId) -> Result { - Ok(id) -} - -#[command(rename = "dry", display(display_serializable))] -#[instrument(skip_all)] -pub async fn uninstall_dry( +#[command(display(display_none), metadata(sync_db = true))] +pub async fn uninstall( #[context] ctx: RpcContext, - #[parent_data] id: PackageId, -) -> Result { - let mut db = ctx.db.handle(); - let mut tx = db.begin().await?; - let mut breakages = BTreeMap::new(); - let receipts = BreakTransitiveReceipts::new(&mut tx).await?; - break_all_dependents_transitive( - &mut tx, - &id, - DependencyError::NotInstalled, - &mut breakages, - &receipts, - ) - .await?; - - tx.abort().await?; - - Ok(BreakageRes(breakages)) -} - -#[instrument(skip_all)] -pub async fn uninstall_impl(ctx: RpcContext, id: PackageId) -> Result<(), Error> { - let mut handle = ctx.db.handle(); - let mut tx = handle.begin().await?; - crate::db::DatabaseModel::new() - .package_data() - .idx_model(&id) - .lock(&mut tx, LockType::Write) + #[arg] id: PackageId, +) -> Result { + ctx.db + .mutate(|db| { + let (manifest, static_files, installed) = + match db.as_package_data().as_idx(&id).or_not_found(&id)?.de()? { + PackageDataEntry::Installed(PackageDataEntryInstalled { + manifest, + static_files, + installed, + }) => (manifest, static_files, installed), + _ => { + return Err(Error::new( + eyre!("Package is not installed."), + crate::ErrorKind::NotFound, + )); + } + }; + let pde = PackageDataEntry::Removing(PackageDataEntryRemoving { + manifest, + static_files, + removing: installed, + }); + db.as_package_data_mut().insert(&id, &pde) + }) .await?; - let mut pde = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&id) - .get_mut(&mut tx) - .await?; - let (manifest, static_files, installed) = match pde.take() { - Some(PackageDataEntry::Installed { - manifest, - static_files, - installed, - }) => (manifest, static_files, installed), - _ => { - return Err(Error::new( - eyre!("Package is not installed."), - crate::ErrorKind::NotFound, - )); - } - }; - *pde = Some(PackageDataEntry::Removing { - manifest, - static_files, - removing: installed, - }); - pde.save(&mut tx).await?; - tx.commit().await?; - drop(handle); + let return_id = id.clone(); tokio::spawn(async move { - if let Err(e) = async { - cleanup::uninstall( - &ctx, - &mut ctx.db.handle(), - &mut ctx.secret_store.acquire().await?, - &id, - ) - .await - } - .await + if let Err(e) = + async { cleanup::uninstall(&ctx, &mut ctx.secret_store.acquire().await?, &id).await } + .await { let err_str = format!("Uninstall of {} Failed: {}", id, e); tracing::error!("{}", err_str); @@ -692,7 +636,7 @@ pub async fn uninstall_impl(ctx: RpcContext, id: PackageId) -> Result<(), Error> if let Err(e) = ctx .notification_manager .notify( - &mut ctx.db.handle(), // allocating separate handle here because the lifetime of the previous one is the expression + ctx.db.clone(), // allocating separate handle here because the lifetime of the previous one is the expression Some(id), NotificationLevel::Error, String::from("Uninstall Failed"), @@ -708,42 +652,13 @@ pub async fn uninstall_impl(ctx: RpcContext, id: PackageId) -> Result<(), Error> } }); - Ok(()) -} - -pub struct DownloadInstallReceipts { - package_receipts: crate::db::package::PackageReceipts, - manifest_receipts: crate::db::package::ManifestReceipts, -} - -impl DownloadInstallReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle, id: &PackageId) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks, id); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - id: &PackageId, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - let package_receipts = crate::db::package::PackageReceipts::setup(locks); - let manifest_receipts = crate::db::package::ManifestReceipts::setup(locks, id); - - move |skeleton_key| { - Ok(Self { - package_receipts: package_receipts(skeleton_key)?, - manifest_receipts: manifest_receipts(skeleton_key)?, - }) - } - } + Ok(return_id) } #[instrument(skip_all)] pub async fn download_install_s9pk( - ctx: &RpcContext, - temp_manifest: &Manifest, + ctx: RpcContext, + temp_manifest: Manifest, marketplace_url: Option, progress: Arc, mut s9pk: impl AsyncRead + Unpin, @@ -751,175 +666,137 @@ pub async fn download_install_s9pk( ) -> Result<(), Error> { let pkg_id = &temp_manifest.id; let version = &temp_manifest.version; - let mut previous_state: Option = None; + let previous_state: Arc>> = Default::default(); + let db = ctx.db.peek().await?; + let after_previous_state = previous_state.clone(); - if let Err(e) = async { - if crate::db::DatabaseModel::new() - .package_data() - .idx_model(&pkg_id) - .and_then(|x| x.installed()) - .exists(&mut ctx.db.handle()) - .await - .unwrap_or(false) - { - previous_state = crate::control::stop_impl(ctx.clone(), pkg_id.clone()) - .await - .ok(); - } - let mut db_handle = ctx.db.handle(); - let mut tx = db_handle.begin().await?; - let receipts = DownloadInstallReceipts::new(&mut tx, &pkg_id).await?; - // Build set of existing manifests - let mut manifests = Vec::new(); - for pkg in crate::db::package::get_packages(&mut tx, &receipts.package_receipts).await? { - if let Some(m) = - crate::db::package::get_manifest(&mut tx, &pkg, &receipts.manifest_receipts).await? + if let Result::<(), Error>::Err(e) = { + let ctx = ctx.clone(); + async move { + if db + .as_package_data() + .as_idx(&pkg_id) + .or_not_found(&pkg_id)? + .as_installed() + .is_some() { + *previous_state.lock().await = + crate::control::stop(ctx.clone(), pkg_id.clone()).await.ok(); + } + // // Build set of existing manifests + let mut manifests = Vec::new(); + for (_id, pkg) in db.as_package_data().as_entries()? { + let m = pkg.as_manifest().de()?; manifests.push(m); } - } - // Build map of current port -> ssl mappings - let port_map = ssl_port_status(&manifests); - tracing::info!("SSL Port Map: {:?}", &port_map); + // Build map of current port -> ssl mappings + let port_map = ssl_port_status(&manifests); + tracing::info!("SSL Port Map: {:?}", &port_map); - // if any of the requested interface lan configs conflict with current state, fail the install - for (_id, iface) in &temp_manifest.interfaces.0 { - if let Some(cfg) = &iface.lan_config { - for (p, lan) in cfg { - if p.0 == 80 && lan.ssl || p.0 == 443 && !lan.ssl { - return Err(Error::new( - eyre!("SSL Conflict with embassyOS"), - ErrorKind::LanPortConflict, - )); - } - match port_map.get(&p) { - Some((ssl, pkg)) => { - if *ssl != lan.ssl { - return Err(Error::new( - eyre!("SSL Conflict with package: {}", pkg), - ErrorKind::LanPortConflict, - )); - } + // if any of the requested interface lan configs conflict with current state, fail the install + for (_id, iface) in &temp_manifest.interfaces.0 { + if let Some(cfg) = &iface.lan_config { + for (p, lan) in cfg { + if p.0 == 80 && lan.ssl || p.0 == 443 && !lan.ssl { + return Err(Error::new( + eyre!("SSL Conflict with embassyOS"), + ErrorKind::LanPortConflict, + )); } - None => { - continue; + match port_map.get(&p) { + Some((ssl, pkg)) => { + if *ssl != lan.ssl { + return Err(Error::new( + eyre!("SSL Conflict with package: {}", pkg), + ErrorKind::LanPortConflict, + )); + } + } + None => { + continue; + } } } } } + + let pkg_archive_dir = ctx + .datadir + .join(PKG_ARCHIVE_DIR) + .join(pkg_id) + .join(version.as_str()); + tokio::fs::create_dir_all(&pkg_archive_dir).await?; + let pkg_archive = + pkg_archive_dir.join(AsRef::::as_ref(pkg_id).with_extension("s9pk")); + + File::delete(&pkg_archive).await?; + let mut dst = OpenOptions::new() + .create(true) + .write(true) + .read(true) + .open(&pkg_archive) + .await?; + + progress + .track_download_during(ctx.db.clone(), pkg_id, || async { + let mut progress_writer = + InstallProgressTracker::new(&mut dst, progress.clone()); + tokio::io::copy(&mut s9pk, &mut progress_writer).await?; + progress.download_complete(); + if let Some(complete) = download_complete { + complete.send(()).unwrap_or_default(); + } + Ok(()) + }) + .await?; + + dst.seek(SeekFrom::Start(0)).await?; + + let progress_reader = InstallProgressTracker::new(dst, progress.clone()); + let mut s9pk_reader = progress + .track_read_during(ctx.db.clone(), pkg_id, || { + S9pkReader::from_reader(progress_reader, true) + }) + .await?; + + install_s9pk( + ctx.clone(), + pkg_id, + version, + marketplace_url, + &mut s9pk_reader, + progress, + ) + .await?; + + Ok(()) } - drop(receipts); - tx.save().await?; - drop(db_handle); - - let pkg_archive_dir = ctx - .datadir - .join(PKG_ARCHIVE_DIR) - .join(pkg_id) - .join(version.as_str()); - tokio::fs::create_dir_all(&pkg_archive_dir).await?; - let pkg_archive = - pkg_archive_dir.join(AsRef::::as_ref(pkg_id).with_extension("s9pk")); - - let pkg_data_entry = crate::db::DatabaseModel::new() - .package_data() - .idx_model(pkg_id); - - let progress_model = pkg_data_entry.and_then(|pde| pde.install_progress()); - - File::delete(&pkg_archive).await?; - let mut dst = OpenOptions::new() - .create(true) - .write(true) - .read(true) - .open(&pkg_archive) - .await?; - - progress - .track_download_during(progress_model.clone(), &ctx.db, || async { - let mut progress_writer = InstallProgressTracker::new(&mut dst, progress.clone()); - tokio::io::copy(&mut s9pk, &mut progress_writer).await?; - progress.download_complete(); - if let Some(complete) = download_complete { - complete.send(()).unwrap_or_default(); - } - Ok(()) - }) - .await?; - - dst.seek(SeekFrom::Start(0)).await?; - - let progress_reader = InstallProgressTracker::new(dst, progress.clone()); - let mut s9pk_reader = progress - .track_read_during(progress_model.clone(), &ctx.db, || { - S9pkReader::from_reader(progress_reader, true) - }) - .await?; - - install_s9pk( - &ctx, - pkg_id, - version, - marketplace_url, - &mut s9pk_reader, - progress, - ) - .await?; - - Ok(()) } .await { - if previous_state.map(|x| x.running()).unwrap_or(false) { - crate::control::start(ctx.clone(), pkg_id.clone()).await?; - } - - let mut handle = ctx.db.handle(); - let mut tx = handle.begin().await?; - let receipts = cleanup::CleanupFailedReceipts::new(&mut tx).await?; - - if let Err(e) = cleanup_failed(&ctx, &mut tx, pkg_id, &receipts).await { + if let Err(e) = cleanup_failed(&ctx, pkg_id).await { tracing::error!("Failed to clean up {}@{}: {}", pkg_id, version, e); tracing::debug!("{:?}", e); - } else { - tx.commit().await?; } - Err(e) - } else { - if previous_state.map(|x| x.running()).unwrap_or(false) { + + let previous_state = after_previous_state.lock().await; + if previous_state + .as_ref() + .map(|x| x.running()) + .unwrap_or(false) + { crate::control::start(ctx.clone(), pkg_id.clone()).await?; } - Ok(()) - } -} -pub struct InstallS9Receipts { - config: ConfigReceipts, -} - -impl InstallS9Receipts { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup( - locks: &mut Vec, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - let config = ConfigReceipts::setup(locks); - move |skeleton_key| { - Ok(Self { - config: config(skeleton_key)?, - }) - } + Err(e) + } else { + Ok::<_, Error>(()) } } #[instrument(skip_all)] pub async fn install_s9pk( - ctx: &RpcContext, + ctx: RpcContext, pkg_id: &PackageId, version: &Version, marketplace_url: Option, @@ -930,34 +807,28 @@ pub async fn install_s9pk( rdr.validated(); let developer_key = rdr.developer_key().clone(); rdr.reset().await?; - let model = crate::db::DatabaseModel::new() - .package_data() - .idx_model(pkg_id); - let progress_model = model.clone().and_then(|m| m.install_progress()); + let db = ctx.db.peek().await?; tracing::info!("Install {}@{}: Unpacking Manifest", pkg_id, version); let manifest = progress - .track_read_during(progress_model.clone(), &ctx.db, || rdr.manifest()) + .track_read_during(ctx.db.clone(), pkg_id, || rdr.manifest()) .await?; tracing::info!("Install {}@{}: Unpacked Manifest", pkg_id, version); tracing::info!("Install {}@{}: Fetching Dependency Info", pkg_id, version); let mut dependency_info = BTreeMap::new(); for (dep, info) in &manifest.dependencies.0 { - let manifest: Option = if let Some(local_man) = crate::db::DatabaseModel::new() - .package_data() - .idx_model(dep) - .map::<_, Manifest>(|pde| pde.manifest()) - .get(&mut ctx.db.handle()) - .await? - .into_owned() + let manifest: Option = if let Some(local_man) = db + .as_package_data() + .as_idx(dep) + .map(|pde| pde.as_manifest().de()) { - Some(local_man) + Some(local_man?) } else if let Some(marketplace_url) = &marketplace_url { match ctx .client .get(with_query_params( - ctx, + ctx.clone(), format!( "{}/package/v0/manifest/{}?spec={}", marketplace_url, dep, info.version, @@ -982,7 +853,7 @@ pub async fn install_s9pk( None }; - if let Some(marketplace_url) = &marketplace_url { + let icon_path = if let Some(marketplace_url) = &marketplace_url { if let Some(manifest) = &manifest { let dir = ctx .datadir @@ -995,7 +866,7 @@ pub async fn install_s9pk( let icon = ctx .client .get(with_query_params( - ctx, + ctx.clone(), format!( "{}/package/v0/icon/{}?spec={}", marketplace_url, dep, info.version, @@ -1009,23 +880,26 @@ pub async fn install_s9pk( tokio::io::copy(&mut response_to_reader(icon), &mut dst).await?; dst.sync_all().await?; } + Some(icon_path) + } else { + None } - } + } else { + None + }; dependency_info.insert( dep.clone(), StaticDependencyInfo { - icon: if let Some(manifest) = &manifest { - format!( - "/public/package-data/{}/{}/icon.{}", - manifest.id, - manifest.version, - manifest.assets.icon_type() - ) + title: manifest + .as_ref() + .map(|x| x.title.clone()) + .unwrap_or_else(|| dep.to_string()), + icon: if let Some(icon_path) = &icon_path { + DataUrl::from_path(icon_path).await? } else { - "/assets/img/package-icon.png".to_owned() + DataUrl::from_slice("image/png", include_bytes!("./package-icon.png")) }, - manifest, }, ); } @@ -1040,7 +914,7 @@ pub async fn install_s9pk( tracing::info!("Install {}@{}: Unpacking LICENSE.md", pkg_id, version); progress - .track_read_during(progress_model.clone(), &ctx.db, || async { + .track_read_during(ctx.db.clone(), pkg_id, || async { let license_path = public_dir_path.join("LICENSE.md"); let mut dst = File::create(&license_path).await?; tokio::io::copy(&mut rdr.license().await?, &mut dst).await?; @@ -1052,7 +926,7 @@ pub async fn install_s9pk( tracing::info!("Install {}@{}: Unpacking INSTRUCTIONS.md", pkg_id, version); progress - .track_read_during(progress_model.clone(), &ctx.db, || async { + .track_read_during(ctx.db.clone(), pkg_id, || async { let instructions_path = public_dir_path.join("INSTRUCTIONS.md"); let mut dst = File::create(&instructions_path).await?; tokio::io::copy(&mut rdr.instructions().await?, &mut dst).await?; @@ -1062,32 +936,36 @@ pub async fn install_s9pk( .await?; tracing::info!("Install {}@{}: Unpacked INSTRUCTIONS.md", pkg_id, version); - let icon_path = Path::new("icon").with_extension(&manifest.assets.icon_type()); + let icon_filename = Path::new("icon").with_extension(manifest.assets.icon_type()); + let icon_path = public_dir_path.join(&icon_filename); tracing::info!( "Install {}@{}: Unpacking {}", pkg_id, version, icon_path.display() ); - progress - .track_read_during(progress_model.clone(), &ctx.db, || async { - let icon_path = public_dir_path.join(&icon_path); - let mut dst = File::create(&icon_path).await?; - tokio::io::copy(&mut rdr.icon().await?, &mut dst).await?; - dst.sync_all().await?; - Ok(()) + let icon_buf = progress + .track_read_during(ctx.db.clone(), pkg_id, || async { + Ok(rdr.icon().await?.to_vec().await?) }) .await?; + let mut dst = File::create(&icon_path).await?; + dst.write_all(&icon_buf).await?; + dst.sync_all().await?; + let icon = DataUrl::from_vec( + mime(manifest.assets.icon_type()).unwrap_or("image/png"), + icon_buf, + ); tracing::info!( "Install {}@{}: Unpacked {}", pkg_id, version, - icon_path.display() + icon_filename.display() ); tracing::info!("Install {}@{}: Unpacking Docker Images", pkg_id, version); progress - .track_read_during(progress_model.clone(), &ctx.db, || async { + .track_read_during(ctx.db.clone(), pkg_id, || async { let mut load = Command::new(CONTAINER_TOOL) .arg("load") .stdin(Stdio::piped()) @@ -1120,7 +998,7 @@ pub async fn install_s9pk( tracing::info!("Install {}@{}: Unpacking Assets", pkg_id, version); progress - .track_read_during(progress_model.clone(), &ctx.db, || async { + .track_read_during(ctx.db.clone(), pkg_id, || async { let asset_dir = asset_dir(&ctx.datadir, pkg_id, version); if tokio::fs::metadata(&asset_dir).await.is_err() { tokio::fs::create_dir_all(&asset_dir).await?; @@ -1147,26 +1025,31 @@ pub async fn install_s9pk( progress.unpack_complete.store(true, Ordering::SeqCst); - progress_model.put(&mut ctx.db.handle(), &progress).await?; - - let mut handle = ctx.db.handle(); - let mut tx = handle.begin().await?; - let mut sql_tx = ctx.secret_store.begin().await?; - crate::db::DatabaseModel::new() - .package_data() - .lock(&mut tx, LockType::Write) + progress + .track_read( + ctx.db.clone(), + pkg_id.clone(), + Arc::new(::std::sync::atomic::AtomicBool::new(true)), + ) .await?; + let mut sql_tx = ctx.secret_store.begin().await?; + tracing::info!("Install {}@{}: Creating volumes", pkg_id, version); - manifest.volumes.install(ctx, pkg_id, version).await?; + manifest.volumes.install(&ctx, pkg_id, version).await?; tracing::info!("Install {}@{}: Created volumes", pkg_id, version); tracing::info!("Install {}@{}: Installing interfaces", pkg_id, version); let interface_addresses = manifest.interfaces.install(&mut sql_tx, pkg_id).await?; - tracing::info!("Install {}@{}: Installed interfaces", pkg_id, version); + tracing::info!( + "Install {}@{}: Installed interfaces {:?}", + pkg_id, + version, + interface_addresses + ); tracing::info!("Install {}@{}: Creating manager", pkg_id, version); - ctx.managers.add(ctx.clone(), manifest.clone()).await?; + let manager = ctx.managers.add(ctx.clone(), manifest.clone()).await?; tracing::info!("Install {}@{}: Created manager", pkg_id, version); let static_files = StaticFiles::local(pkg_id, version, manifest.assets.icon_type()); @@ -1184,126 +1067,92 @@ pub async fn install_s9pk( }) .collect(), ); + let mut dependents_static_dependency_info = BTreeMap::new(); let current_dependents = { let mut deps = BTreeMap::new(); - for package in crate::db::DatabaseModel::new() - .package_data() - .keys(&mut tx) - .await? - { - // update dependency_info on dependents - if let Some(dep_info_model) = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&package) - .expect(&mut tx) - .await? - .installed() - .and_then(|i| i.dependency_info().idx_model(pkg_id)) - .check(&mut tx) - .await? + for package in db.as_package_data().keys()? { + if db + .as_package_data() + .as_idx(&package) + .or_not_found(&package)? + .as_installed() + .and_then(|i| i.as_dependency_info().as_idx(&pkg_id)) + .is_some() { - let mut dep_info = dep_info_model.get_mut(&mut tx).await?; - *dep_info = StaticDependencyInfo { - icon: format!( - "/public/package-data/{}/{}/icon.{}", - manifest.id, - manifest.version, - manifest.assets.icon_type() - ), - manifest: Some(manifest.clone()), - }; + dependents_static_dependency_info.insert(package.clone(), icon.clone()); } - - // search required dependencies - if let Some(dep) = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&package) - .expect(&mut tx) - .await? - .installed() - .and_then(|i| i.current_dependencies().idx_model(pkg_id)) - .get(&mut tx) - .await? - .to_owned() + if let Some(dep) = db + .as_package_data() + .as_idx(&package) + .or_not_found(&package)? + .as_installed() + .and_then(|i| i.as_current_dependencies().as_idx(pkg_id)) { - deps.insert(package, dep); + deps.insert(package, dep.de()?); } } + CurrentDependents(deps) }; - let mut pde = model - .clone() - .expect(&mut tx) - .await? - .get_mut(&mut tx) - .await?; - let installed = InstalledPackageDataEntry { + + let peek = ctx.db.peek().await?; + let prev = peek + .as_package_data() + .as_idx(pkg_id) + .or_not_found(pkg_id)? + .de()?; + let installed = InstalledPackageInfo { status: Status { configured: manifest.config.is_none(), main: MainStatus::Stopped, - dependency_errors: DependencyErrors::default(), + dependency_errors: Default::default(), + dependency_config_errors: compute_dependency_config_errs( + &ctx, + &peek, + &manifest, + ¤t_dependencies, + &Default::default(), + ) + .await?, }, marketplace_url, developer_key, manifest: manifest.clone(), - last_backup: match &*pde { - PackageDataEntry::Updating { + last_backup: match prev { + PackageDataEntry::Updating(PackageDataEntryUpdating { installed: - InstalledPackageDataEntry { + InstalledPackageInfo { last_backup: Some(time), .. }, .. - } => Some(*time), + }) => Some(time), _ => None, }, - system_pointers: Vec::new(), dependency_info, current_dependents: current_dependents.clone(), current_dependencies: current_dependencies.clone(), interface_addresses, }; - let prev = std::mem::replace( - &mut *pde, - PackageDataEntry::Installed { - installed, - manifest: manifest.clone(), - static_files, - }, - ); - pde.save(&mut tx).await?; - let receipts = InstallS9Receipts::new(&mut tx).await?; - // UpdateDependencyReceipts - let mut dep_errs = model - .expect(&mut tx) - .await? - .installed() - .expect(&mut tx) - .await? - .status() - .dependency_errors() - .get_mut(&mut tx) - .await?; - *dep_errs = DependencyErrors::init( - ctx, - &mut tx, - &manifest, - ¤t_dependencies, - &receipts.config.try_heal_receipts, - ) - .await?; - dep_errs.save(&mut tx).await?; + let mut next = PackageDataEntryInstalled { + installed, + manifest: manifest.clone(), + static_files, + }; - if let PackageDataEntry::Updating { + let mut auto_start = false; + let mut configured = false; + + if let PackageDataEntry::Updating(PackageDataEntryUpdating { installed: prev, .. - } = prev + }) = &prev { let prev_is_configured = prev.status.configured; let prev_migration = prev .manifest .migrations .to( - ctx, + &ctx, version, pkg_id, &prev.manifest.version, @@ -1314,7 +1163,7 @@ pub async fn install_s9pk( .migrations .from( &manifest.containers, - ctx, + &ctx, &prev.manifest.version, pkg_id, version, @@ -1328,123 +1177,95 @@ pub async fn install_s9pk( migration.or(prev_migration) }; - remove_from_current_dependents_lists( - &mut tx, - pkg_id, - &prev.current_dependencies, - &receipts.config.current_dependents, - ) - .await?; // remove previous - - let configured = if let Some(f) = viable_migration { - f.await?.configured && prev_is_configured - } else { - false - }; - if configured && manifest.config.is_some() { - let breakages = BTreeMap::new(); - let overrides = Default::default(); - - let configure_context = ConfigureContext { - breakages, - timeout: None, - config: None, - dry_run: false, - overrides, - }; - crate::config::configure(&ctx, pkg_id, configure_context).await?; - } else { - add_dependent_to_current_dependents_lists( - &mut tx, - pkg_id, - ¤t_dependencies, - &receipts.config.current_dependents, - ) - .await?; // add new + if let Some(f) = viable_migration { + configured = f.await?.configured && prev_is_configured; } if configured || manifest.config.is_none() { - let mut main_status = crate::db::DatabaseModel::new() - .package_data() - .idx_model(pkg_id) - .expect(&mut tx) - .await? - .installed() - .expect(&mut tx) - .await? - .status() - .main() - .get_mut(&mut tx) - .await?; - *main_status = prev.status.main; - main_status.save(&mut tx).await?; + auto_start = prev.status.main.running(); } - update_dependency_errors_of_dependents( - ctx, - &mut tx, - pkg_id, - &CurrentDependents({ - let mut current_dependents = current_dependents.0.clone(); - current_dependents.append(&mut prev.current_dependents.0.clone()); - current_dependents - }), - &receipts.config.update_dependency_receipts, - ) - .await?; if &prev.manifest.version != version { - cleanup(ctx, &prev.manifest.id, &prev.manifest.version).await?; + cleanup(&ctx, &prev.manifest.id, &prev.manifest.version).await?; } - } else if let PackageDataEntry::Restoring { .. } = prev { - manifest + } else if let PackageDataEntry::Restoring(PackageDataEntryRestoring { .. }) = prev { + next.installed.marketplace_url = manifest .backup - .restore( - ctx, - &mut tx, - pkg_id, - version, - &manifest.interfaces, - &manifest.volumes, - ) - .await?; - add_dependent_to_current_dependents_lists( - &mut tx, - pkg_id, - ¤t_dependencies, - &receipts.config.current_dependents, - ) - .await?; - update_dependency_errors_of_dependents( - ctx, - &mut tx, - pkg_id, - ¤t_dependents, - &receipts.config.update_dependency_receipts, - ) - .await?; - } else { - add_dependent_to_current_dependents_lists( - &mut tx, - pkg_id, - ¤t_dependencies, - &receipts.config.current_dependents, - ) - .await?; - update_dependency_errors_of_dependents( - ctx, - &mut tx, - pkg_id, - ¤t_dependents, - &receipts.config.update_dependency_receipts, - ) - .await?; - } - - if let Some(installed) = pde.installed() { - reconfigure_dependents_with_live_pointers(ctx, &mut tx, &receipts.config, installed) + .restore(&ctx, pkg_id, version, &manifest.volumes) .await?; } sql_tx.commit().await?; - tx.commit().await?; + + let to_configure = ctx + .db + .mutate(|db| { + for (package, icon) in dependents_static_dependency_info { + db.as_package_data_mut() + .as_idx_mut(&package) + .or_not_found(&package)? + .as_installed_mut() + .or_not_found(&package)? + .as_dependency_info_mut() + .insert( + &pkg_id, + &StaticDependencyInfo { + icon, + title: manifest.title.clone(), + }, + )?; + } + db.as_package_data_mut() + .insert(&pkg_id, &PackageDataEntry::Installed(next))?; + if let PackageDataEntry::Updating(PackageDataEntryUpdating { + installed: prev, .. + }) = &prev + { + remove_from_current_dependents_lists(db, pkg_id, &prev.current_dependencies)?; + } + add_dependent_to_current_dependents_lists(db, pkg_id, ¤t_dependencies)?; + + set_dependents_with_live_pointers_to_needs_config(db, pkg_id) + }) + .await?; + + if configured && manifest.config.is_some() { + let breakages = BTreeMap::new(); + let overrides = Default::default(); + + let configure_context = ConfigureContext { + breakages, + timeout: None, + config: None, + dry_run: false, + overrides, + }; + manager.configure(configure_context).await?; + } + + if auto_start { + manager.start(); + } + + for to_configure in to_configure { + if let Err(e) = async { + ctx.managers + .get(&to_configure) + .await + .or_not_found(format!("manager for {}", to_configure.0))? + .configure(ConfigureContext { + breakages: BTreeMap::new(), + timeout: None, + config: None, + overrides: BTreeMap::new(), + dry_run: false, + }) + .await + } + .await + { + tracing::error!("error configuring dependent: {e}"); + tracing::debug!("{e:?}") + } + } tracing::info!("Install {}@{}: Complete", pkg_id, version); diff --git a/backend/src/install/package-icon.png b/backend/src/install/package-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..265558cfdc009d284e0284654a8c55b16552bc8e GIT binary patch literal 286500 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

6Kp7JP2C#Jr= z0rXrkKub?`E}}cEP`~@iiBWpCt%CFGN_SPNNtUNxrbHmcp_vJ*h|*{_SjFrdl8Opt)XN+BH+k z%Bk}ZebI^(R0T%|Xg-ul=aat2&;)(|Lnx`7A2-vT^X+gvJpMqP_ae*Q=ay+`Q>ZEK zW_Z?fMMJKA;2ah1qY=^VB|98hcVPR0O{XN7zKCrYqgviV;N@NgP=}y4WUu~!Sa9@{ zAj)9anJX-WITf3m$NfjIX7MW2%UzsY4hT>% zyDC$@Bf{Vr1V1JO%$1s%RYDT^fzjRc?WFo3PI5(HvN9y~@V8*?!E)k*f4@Ph#0|EE zQ-Gy85as6QM8}3E&07)vY^C096j`W;^OXrqTvhB$Ue!bkrA7(A86NvBv=5buEh(-I8k~HjT$vAlR6B# zJW0;dZA9(2cu!resDA~6i?0;mWEhyD7^s;Ygs4gDnk0c&_U;s$bshF-L|>z(4{wX< z%GStcXX=(jN#eB;)g&825xyp`JiyC^yBr~IsX9C*Oq6Us8MH>d#+Zu@HrA7C^r@XC zS+iMDyp(UFXFE)up!Vl^XF}w{2ukRk7}tJ+FA=_;If_Gb&J>RB7U1z*_VpoA$W|^p zy~^beJKQJ)d!VPKZGDGJnZI2vrDht6$jal4hQ8J&QhDPyW{=C_AaoD%b*u1D9aXs~ zDz(xiT?|3g>*=t2Hw2FHO)~Mj(m%|B3fqlHkO(Lqu&A6HZA7I7ChKCP`e~Ja7vES=K+Q(}+}&R0+eO3roIdV5I3)=f4hZHN0hOvAFgN01w#47Z z((LIQ=BuV}`6X`)$&P^ftu!~*!kkXutu0NfS47PUcTS-YvR7KbA8{B5p@$o@k3-hm zU+zUKGrz@0)VBpNstNv7h4udpVltBkT7JfW9hx6fm#%EExSgw6*R`Q9-KO$YKRKNa zQbJU|PsX7bCuw%xLkT;`+yrpt%jW3*$S*n)v-U^A?2QOK;gW$uJ~D{unLTO~?0NnG zY)Bs6s`aQk!QWYXmHx0l%ehmW&y`d zeQ#ysf<(M6W2-lXJS$-p3Z1f=k}LY`i1I=R1X>Wm_QOjYA?OUQK(A-wFcBnaRk(|B zmXFzQUIrbl%(BBo)R0TyGqTTz(ef9`D;w$?pYyrMRT+`-; zI=sYQw^**+xv5V8G>d8_r0Pw5JgO`JmN9*ty2KH%z;pH^W*w~Db|7U2n#U-4eCc*| zQWMl`5Ks?6qD>wXpK}+jj)cc@bhXr2KH+=#RYkR$de$+N)AzpPO@hT^6kGbo@eBtM zH_OCZ@a&oV=M0Ma0kmfQFU=`z{8N&B7qQPUL}%=q`rdu+w1d&~qPe1;xl!W5PTISS zDJC)+Muc8Rk|qVS+y598h4ug>p=9+Po~U7JLqj8Mor5J>Q&j|GtK~I(a;UEt^%oGI zBDl2l*5p;yhD}2f(lYH77YcHtEdF~qRVlix{B0LVqXKyYj=gg>gBv^%~G5j$|OAE7e`ybY?D z0fZSG>1p-*@O3KOl+wO$+NV9}CKPeS+Di~P+X?d{;MKvy7k?7@5h`qsETYUn% zV7-|?Hn0QfQ^WtK`C7v!R0JzV)x9x zBJs)6KT6?F7&2MD@p2UZZ%RR7Ri*f`j(mf0a$TduXUI5bro~hz3cjv7U%}9F2DPEC z3)JAsT<`STEbctzi+;mP+jvqP0`)iQk6X;#JbI`uqR4Rk7Id4ljz)04iTVx?V zvaDJkJC;DRxP8gG{@GS>r5y0KUYydua8|%rDS`zeUY_N z;P}sG*i#TNPoemvKgzMu`u|^Ik18&|4`POTGh2)eNn9#up*-rAAC)Y61)W~LE&&J z;;;YF%QYPxJjn~KUV1vU=CCC*WT7(Gzg7jh+y(hofBeCO-zcK%-N#i#k8m;Y2TrO( z&sym#wcd%wJ`vpGc#j1N#!{tVG&UWkWZ#+x~`k{Ih^bn-{PJLo^v%@JLI|H zZW{GToCrCq66k_3Q$5B1byu$vmCA0wapZiuQt>D9yU}<19)T5c1ALI#n0}no^XTiOjyv?1(Sq&vG4pIWU!n423KcFS z9}T`P)fR=65=f9>EWtfuYw&Q!qq8D8$0k8}fI`|;1`3#GsGLXzw9A~1E#cgYn*5Y5 zTH9uyx@bKf9+vQCh&gf&cQEAG!M@~4{)7SOKIp&fB&+eqXR!&C3d8U+*0YV3fxT^D!I7b;bfV{LV_0_^#l_TLRnIq z0E7qZL687(f`K~94Tzr5@+{KWly7d-xl^I|;i)6kT1mVMsN$MlTi-s%b)5 zd&5R#MiJ-*97W+zHngk=pm+$Q&KIio#X~7re@(a=))LocOW1U^aQW~%o%HHU#wy8K z1sh52Lt8*#dAYnLLUT9ZuaS9t#btO`?8%BVotv1dIWBZ?j{bqnW@@Tf?sZ7;5bLlV z)Z1cM1%N-f(FZy82+z?G$X!;O|4TsO-K?lOzu7Fe!yN$aSJ?sWn|aQyGQER(st<5K z(w2)BI(>(|wmb+!z$@7zh{^$)8ur_zHBOceFv{p8)J-11l67PjORXhBX}Z`H;kCLW zaxJ0JKB|6$G|>zL&|6VKw_;h2V5YBu9S}nSB|cu=Jk;^|5pna{-pE#W+Zmd}TPDJc zh#x+8oBo)?HMz3Po%%TBJ-ps_wGaWd9W`JOx}X#&x!6(M`07-*ITBHk{W~i~`(<}Q z&ho_%`XHH7&8=?=`6S^`3dh0|(~%Z9KcIjoHdU^JYb++`x^T+8Mv)d7evO9U?321q zOg4!ro_#*)01IQ@oWa$LBQaizT^r~I#_y2~$(aWe|)n!W~?!)*_tM4vMHwz22~ zkq1gpI&t2E70SB^|t^7?vnnCuoZ` zzUKwdtTMhE<{1Ej>r10reHh?eI;DtWkj4h1LH=iR8nX1{AGNO<+?XcbRFaV&Qpoq zkSUw)iweB=dG#>g`34aKsHM5!FZ37TdT*g8mTXR#{QTqq02Jb0Pyhe`2@n7?Xy7^Z4odE<3<)#!d5ztdGl4H;I!UE^Djk}tUDKd=6q$Av%lQx?ruwK3E z8ZPx;bk;uk=ev zrTztU7<5Ai%}i*)D#FhgZE zP}-l_h;r}~Rg5~w!jJ+P&dHW2N;j`OVAEtYF;|09Mgg@8g703?>uPTAg&1N3nkcwN zwR%CE#%gXUmtt86umw-&?WhEh8}r(_Wz3B?ozYw6O@K0t2XY&IS&fBoTYNeszUIE9 zL@wvOqhLowOij=lrhI-G07EFod}o$W0xOPM!Q}azU;%L8kYA4Swg&N3&{C)SX^)S{j%3T;_Ay_9GM3y`)sh*IF9@00Aedjer0E z0EGYn{H0A3>JW}UuSe^7H-^>-h2wY*5g?(%Pu?sCo(Vj2t4+S6M@^;SXT6{y+=k>K z@^=v#dKocIY7t=_9ah!^M9q@Zuav%kf4GTA=0w+pz!!r zyX6zYJ?Ux!A`XhJRnOA;FU_F+qn^&vPy8Awcu!9LX8Y1vO7C@MeYq_nRRIp9 zx`OZrckJw+AFlTqFH?E_aUHLkxq?ULjC`!F3%wFs?;>$Gmj5@=y)z_piGnYdD$p&rQIcF={{pXwWAoj>wJc+D} z$bU?lmOrtG5_L+a&&}j*Ob8u7vaH=?s$~e7f?lgOzBa3DX=(Q4c`tvDWrpP?lu&`f zQR}Vxf1AO!>K_Z{^FCw1tac_&>|r4{dgK{9ZnW(DR5xH+KUt3n)tcfs=IF;gigav8 z*45Z0W2c4&W{|)Ml@Y1`JZVT&b+wB~g^!Sv61NXI(w+!HB_l=P@Q~V250J@(DE}D# z+XF9CRMTM$!{c&fNbs|c^yk_YeY z*lElEa@vF^G_wwu6LX3fAo5N15dg)q*E*lz4gMX3t z>Y@X|;OSPLP`eg|mCBBd3--OT*@9~1 zMh(3$xGrj)Rm@n>(tzm;=2&5b$TPclL8;-Q7ecp^ryLAtSE?6k41nbI*i=#OHZt0y zqZV;#Qq34?G4J%UI4lx#%b_8I!=vytuX~yz%pbxwCh$EeBA3bYcWY+Pqz3X%`>oSz z$I723AaElS#*2@#K5mbpHhEl=ux^*KqSPn%LqwK1H_p1txq-`nCugfHqpgL$L>^LINBt%w%J1h&{H^=y9DJ z0XIR5+5Up**MyE87?FYl$XF42dg+XXd`WvJw=y~+NoXIA6=rxs4R{O zZooKuZI06c=v?6r#2y>#?L`YatdkiUi7VioD#?2>bYMI*0sI+JULNyC!ngXCvj)0J zQlL`^Sm(nxNu(7$cU7>MzAzY4(}YccM$*s;O#uXE@`5jr3hsAK_dc=4qgaulqOlu- zK|fZwNhzYN{-D0C`)BadbvGC4sw7JMhQY!)jPo%v6p^C^Ci-*g;5Mtb`@mUZtI5jU zo6$R$bFDCJUBcKX`mCLThYJbF-Oj!u4joPb;ZnfeF`IK%q=#8zBdV7>%>WWq0NMwt z7ZFTafXrGV!5Gw{mkLmW9$t%}h@+lvdC%Rntr^}{x)*rKIciH+1-R%t zXu!zWHM{fLsxYMwnU#wAgIewqlPi}@Sm){}v^Lnj96NnXFI?}4A`!R%>?4Rfc=T7x zW0=;i0~zUo1^Rr}FNlhSDef{2vbjehc`iwH$=f7?2qKh64>uvcKc3uQ4Lq)6=1#{x<0C>GHt}(HiJ=CrB2DvqPk=U z-&q0S_q(gq!Ff9HKcW1<%o54sp##&W{i_8%tmY&UQ0d$=w9kC}HYwqj;wR=2l*K85 zBZ9}0>j@%-;d-nZ`LH0jHtpAJa^CxS6^%VMlevgnt`H1_>*E>LADLM*N{=`39}|ZT z&=u{=6y}`$SF)H47gtUPfsZ8U>RGN4mV3EnPqvCH35%0d=je;vh5QZ6wep^Y=m}CkPl9%RdPh?l2#H|0Z=H=1VmH#jwQMy+85Jx1=`R{=le!k9+^yAC(W2e;^UZ@0bR;NDRu z6wZZlf2-%z=91|N+7jX#$VhGG1sHZ0Z@5R}8pP0LAl|_k`B?J+00O?ViA}j3ks64HWTMQ0(MOBQK7eCID-RT)WF35&?WGIDis>|kvmnlQ{)O* zjwflNflIge-|Fs`k}x0FIqZGn-zP_L*i?(3M9;Xb#jf~#=*u+e)Vi?SxHA5|*l@DxAO|f=N2waRzVMR|LIX z=&R<}24#Hb$+RFaRRMP!p^&xW9CYUDL`PEMB&COaz-#jZDvT{6#Akz*W6?O3>%RWc z4iL~I339OB=XiC<-$Ab~QL}pP*5s{UY@wX$8MIv|`nJo4$T;_r8?y;lZJP&_JtbYd z$DvI!7rJ1RxiD_b`!+Gf$}Q()2mfhul1(A3KkZ|%5)c?T5QWQI?9_`CtkWuoFc-+d z3Jz(dbuqni#~SMH;E;*b@Wxdt zTcb;)S=+d~z*$AKB+W2E7JASC z0015U05mh8I-nsUCR9o44~amS0005J00P5L`64&W+fZQHK+i<;^x-lVMWr+x!O0Ia z3dm6=ySCy^p>2u(D@zyE4*S`Yz`$1`*0tM)ZZCKtDOt{GROMDn9zi1X*5K|#*%uEB zff#3j_474yEqk`j^x4YoAaqK0BO9vhZ@^pYS1FPl=(cayx zMc-V1C$bqb32_UsP?BiX!wM7ee)KSIDk|X=jXS-$1iPpS)E=0n-DK&YdUqRb5AB*Bv946~pGiWUvA8emH&eR!qxE{Pv`0Inojsb5_xgw4*E6{AqnH z@+Q@vMSXvOp~#cU?hSR z#7yb#;6VEZAgjI6{Vt@9VK9bUeT#SkS-$a50UGT&#on$wh5!Hn00ig&2jK@7u&8KL z7sAdXq8LzC_e4b&qUNc)^K8N}v9JjyPeA|<+i=SuPCrbAY$Ft`D4iH=AO>)#L>uSyHmDE`b`9y%xywR!ZxGsRua4=zotJ))};owD^m(d@ZWNq1e42#B0#eIdiws1`ImXFk0tG; z>slw#8(V-s44VSdk2Hr>5iz$qH@_0&mPd|OHjCGfWJ|y33Fn!|ZKjBt=_OD~!A^bD z05}|8{^j$nvZ-cBp>S3dRs;eH&B*a4uZ)3Q+yDTG6@pBI30{UhBxB+cJ?`Y-e{8Nv zaZmbeV-&Kg!umJd-a_E5o%QU~?xuB#ggu3yrY%eWH}>@wcHlRS-|Dl!;mKKSW6PrgIb<5NYhcZtZrA^i7FCrv<)@WgjuNt`Qb}ULuGQ zVCHf`Do^Pm?=|6J^QsK`i-Ye%>a4f8=E&O@>Tdx;O~%=t5E*+xk18HQKn7>Btnc@u zAyA=n%4+X}iRxMSj203*&$setFN_DGJ0(zcC<%!Q!#3PTU5$=28{#1A2RB9Yju}L( zQvd)kB(tU-{^+(BQM`wXD0Ojqda%H%sX*K=)4$m87toiVI$1dPw4rGtNA|u^5CK|J zD5;X{>A9_mWfp=?JdMnyWH}j?iNC1QWEb%A$*kMobqg-&z|=ZnzHjH_HM)Yi(KkE- zyZ0RVTd)%0q;vY{JwXA$Z#G6Eo1>h}d&anNxEQLGlX1SL*+PEiPyhe`P{06x0ZQPK zph%Gs3@Au9X@J$y6Lh;yWXr`LeyLkwVK1r@*J8lD(>7Aa{8;Q`(Fm-M1`9!VUG>fn zAhT+gOOD!}+f2uYle6hu3bGS;8X>zw)zkd%>Bw(?bTse~ze9Ei_OqUYo?g4_{G`FH z+Tp1DG@0Zm)Rbhacai^++pdW|RE}nxmuHUd(1u~%pvNsFdS1_#V(dK-B2`GxIUb1u z$zw1F8+t~!za?8z-Pu5Us>&2rnYewrYt(x(M3t27~`+;QEeUJrcj)T<9 z8@nbnQUk4`l)C<2pDUu*4967e;l$_K8!yoCpOOFo0VDtc=mjf+N`WFoL@=SO(SR$r z+7P+Llz`lkOeFPI4g1$zQGCOm@oo51<9E=*W{)FC1Lp1P#v>@t;sf%e3L|5Q@W9Pk zI{58ZDTSTG13^u&=DhOIirO$};fIQXZtP`engEJ;?E}&-IW>bl5w4CT%)pp|!+LxWi3wrg+U6=R9i{YGe4kJ5e_nKZzqD1z2Xa?-346Tj34xA@c|4%3b^aYxb;y)09?Avve-j$Zx8udssxzu>nmhtjr9(}vj;@%xA*`7HIy8Z zJ<3zy`Znof`)Y*TCkJJ(yqt$8`*bS6wngE%FFdo0upCNE;Y4oNDJ=lx$gThhr$1$8F21oOYSN#;@iVJ3t%_$mggMQ$%CY)?Jj5N9!%tSGC z`G$JyPeOLU9jS5B*x^JiWC0fVPG<}X0L@&00(nY^M!R3CvHs9kP>_Hs6!&UbG$e-7 z#d}&k(W?7NS%c!PW_E`q2F`7j=+)kex09VYZv-I2VZ~xTUR)II#1Gr0 zSD1q?H2!net^NQWuz)@*dqamtkKye6>QNiJhlqLy5-Z{g;)f`l4Q!kWm=V3so7CWU zO@X+QWmTvD&^!S=s9x`KlDUMG+x)2rNt(&=c;e4HKLVh0x69xF000Qk01h5PTS83J z1QBPgFse<;fEA;_oBv&608Ci$TvRa0v2q$*xaUhZtG09*lB(CTwl>RV6-7PA5c1l! zh#Rq&c}JN_I=}2v<5^;@Y88t_&bInLG%k1q?vuZp5lPrlhkM_hhn}%#sR-1bCn`; zD{*rnEJ#kAaX_;2^Q3kAE%0DF5snB|_+6Y$PS9wucb($qQE3tSjW2T%o0>RjlW^mV z%mngd+89zx-Ip0(a8}P*t@5${KxDeThNvu^^vzv2Xz;QgnGEO900Y`$X%#=F=IGYW zXC`|C6kR9_-aNcU0W#yvek*B9EFH&k*#p+tth>){MW3vka$K?mKXc}V#`7cOd-jMs z(A{Po1~$io2@nTGSwdiiKBf$v?`xw-7a=;JDweW-5{Rp=k)GxQ_$a>Y7Of6F{Nnf; zQPdef5{o$?hSaMoR8mk72$iB=VFneQ3_OB7GF+pB-`hTKegF0vT$vVZ>xCO7pEgq^ zgXyV_2UDWdeu_`g-LsE|Zt(};4qlOif*0`E*+LtzfT?U7y6S*Ea42uw!74A7b6yGR z!_JDEAV_Z6v;Nd&8?ko3Mf_X;I#q4krVPyRxBp)x&rQLd1RjwhTit+j!9s8KOyT?m z(6JEba28G50_41ISZy2insMMiQI%=FnO;a78DAm{$0^QbLo&rpg){ta6iFPTnq95r z)1p8rmHOEwORr|h>l_XOFrAi*W$;8YFfmS`2>hFfLQ>;0>!~%+wdPk1qej~Ea?mC} zGb_7585eh0{01P$KAFo^qlCBtfB*mh08qdHcoft6(|_2Z%ROpwfFp$RMdt)xIy`5^ z?DX?(qL3J_fcWJB++S(o9YK+@R!1?F>jq%1A>|x zh-sfo!yltmHIobgnl^@+Bn5K#Ok}53<#E;-f%Wazs`Qe!6rs8Xo6?NwgBBy(3z(

2XBPVsO7I#?*4Mm*LUdsdet#?fIWJJ%=6sf=w4}d*RMZV8~Ci}d)1{b>ZOE1l}vSlI_ zRGvdOQ_cr90(pO6D6_N+6lz!CB`3FLiy&us^YF+qP}nwry);Z=8*7+uYc;ZEUd7&3?c8 zd>`)9`FC~ooSDM3s;3ALZlIvlw`bO%#uh=BpR)TfBUvoz1VuVdT_})ujQz6IGb=Js zEw`#V-ni!9%j4k8%s@t_VVDDeKQa3L#Ja4Qnt(_sXr?s^l$lmljg1^(o~bK`!I}BI zPKUukBiiVUn6dntYibr#)T9e!s4mvfEOkyU8TF=)l%GlW>ulArN%<@MD^<{|&yy;Q zqe}zF>X-Ws{`^B=dG_{An{T=nLWVgFz!|p6){u?3-9$72>be8VZ~SHA%A2Tdjwp{n z7No3KFD&VndgDy?uOhI{)2prHKP!cJ0l@JDN^WzHvfLp5a2au<_PE^g(5Ed3CjzQj zeOA;@lcpvEu-QCuc6C4R=)^HV>%06EI|zAYW8Da0Rg&>kegbOHOn>T@jM|tx6d?6~ zvK)+FIemfMBw*Ys7d{kr5MOPD{@bH4TAR{}1OLE~pT@S7RNCvE$8Iq?-8+&sAUU-t z2r1N?HUHf3#(=U}TcXvxKN=*E<1yr5Gm+mw+;r4JvSR_q!8`;{a;qmSy0%%sF<#eZ ze6h7<6LOHktP`zMv9*6d8Gv`jHnLv-5ex( zW;wZd!u`|m*VCTxOaZ*f8R|=e7vJZB2SprOU`pzcW6td^;H+9vSow0UIcfzOag$r+-oW8OtTA6c7XSIFttK=*Bf`1qTXRaq&ytZ}jT~jx6D-8sAg) zFJ-GaJFvN&h1NY@Ug8-lId#UP<5G;Ugzz7bn_i}czqRnEx|zlH7zd*( zg1LB;uUM<;W674)Arz{P3{#O1$Ydj_dEU!RhDpZxCtB2{j(+>&j$rFu9vGt+@J=(!+Eoe{;T1sD+O(#`p@{TMaVVy|Nl>rq}h>JkB z;6V2#BojAe;7ba;R)1NNY?NnnRN>y z@-#S9=|))>H7Tlr%CTk#WA*%N%SJAp>a=m-(xq8j7|!cfwI4jT+PW3A7zgH~491+c z6IQMjEfuegFZi4UFZWD@U_j(CekL^X5fg4x=Ntifj;J?-c9n^DUi?+UD66sj;9N>% zn_{)Ar8GcGL>@Lr1(_Y^i1sRUP=You=wq<8&dU)+^JrmKBdwf8*7N3DM&VoPNyovs z_9-zB4AtV%R?IXux?@`>+_)4iAO##ytE|O7Fvk-krkz_1o8@ElpvhjfXzJSTL$Sz$tfV!- zgw!{Zw}kvkU`LlR#L?KgWGY5WG|f251J3|X3Mn|#}2gU!*1T}S~2qJs~6 zhV%y3X8(CeHndHV5B=_^N6m(gPbUD-Y)>c9^FZFp_lo-}x51Z9AQDH86&ejd#zwh? zR|@7X2#v{tN-(aqKPi*wX#D*XYd-w(neyZ<&a$!M#D_ITRQ2wXx*Jpk4VEAt|5)X& z0Hrei;ibBJs0F9H9UHGUx9nBB#>{&*Db9`52VNAVr66mil@-v9W?aA=9>svQ*o{i| zn%`4*4CZf^)z@OO;i_YiYaigzT7|StG#DjzUlYT`UUz+KWdAGDWEcIiZ+-V*w)kLv zgDRg6aDT{8slj^>oVgFB1Z2+ZP(L9agCm_-4H1j#;QXIfpeX@}u)a={Rs3t<1d1zUM(lCcR4rVnav=zQ@09L)@aC+dX@rX(5>Vi=HC816ns;Dbb z*fjHa_wa-b7-+oN_CYCB0c11ZG#t(=+$)7lOKjtq5tl~H=_loBU3B0Z@-+r#W0S(N z!{+>UfWo$~jm|T-xAr=Epsom}^?`HCCswRAv^tuRtA5}ys-;ToAyj#e+8q;ZX@dFf zIm&g$((lD7y@&fuoWx};7jul{obu02FcfhQIq5T!bE77w+$%qAPy$L6O_&##1lT&^ zW}!=b`m0snn#XozHMesj8MnNG~MhcIc%R-)13ehj>%}K5K(zG{V@00Z{&zfUn^97+!rt3lF}U+jQ)wqtdkQv^Fu z*OxwyT|-U64pj{qqP~CuT(FXTNuZqCY(5km>cf9nk8Ck*ki~$`sB_6qJ&*qj2M~ zlwqd?p@&Z$pyGLOaGUiAzqZ&|TbcQ%tFaP9nA%WiUy1NK*}HPua@!y9se80l>ON9K ze3O1R(MM8v%JZoR*##BV4(iR;o?{+F5tuyt`mZyo(#yF>5m>U1%(`+!*@c};A~>Y= z{ilap0F?H{+V)}%)@jV^*anPIjHpcAF_C6%5)J>nYo{$vyTE31eENesv%8g%C-C?U zLS_(y^12KL-!AK_$utToKbqmHyJgzziWTaIga>~uPr+Tt;d8zD%6jWW4XO_wY|HY?clhpx~ z+&Y_PG9Vks7}>%t_9)L>+|nj+PkU)r(89snrQ9vd>vjRNqrR!$cOihe# zDw~xb7-O->E<-K57(uDcJ@8tUP9sSn5*q^@4QLo8$VS-0?fNs_*G(?^EkUdvh7uUR zMUE?&nl)fw%)CHfm=7)EM^4O>T zGwP2gR1w2R4C}ZTuOIWROKq%9H`9OPSpXy>0A6^UE}z^gSc;WO+w_^wQ9~Un`cm%} z77@;pxk%%LJyFc;iEMVTeUUY>`AYHj)Fy`u17FrEQ`|IkMx|J=lDB6JdW(~TVk)m* zh1HI)85|?$wl~;bN77_mo zMDS2)iTZ5q8NcT|pn*l7v337VDu%vp;P2MF&O@MixR2qFuh(crpb6E4mfn1*OE%0O z(jYiw*jmaYr-)5Q;BN&nl6!68xkFRW@4y&TKJkOOt(9E2169{KkK|lQWqrS1nGE9% zirjdsuG64Xm?BmPGO4Y@?NqKZD)Q-8fql{Oj={5)rqow;Xy8HSG%^)P1ZcydmNz7^ z7#WM3;;#GQoQV9t*4DBxHbjlZHRO?19BtkBTWVT9m23GA6P;VDx83rcZAHy}oNq&c zPL#QT+k#vwf~1Yrpmgm;G66mCY-wOL;!7inGcT2F?E<&2L+lmcg8v)`Jr6)ACusX+ z`UUbx!dHL7m&D~)uQ&(Wd&=oKJKPhu=>tpDS_7*(U@dzL!?%EG|)irO&x@FhZGA)UBA%eu4QF!DKMhm@Q5`$$13X@kx z+rIfM$f>~~mNF2*uM8v*>A{Ht5px#&W|MXsB$KdK{{*9SHTVXHZi;)j3(Z|yO1d#( zQxZ{_)DK_asUF^}?0%PtE6DoDY|c)az~NJj_xpGJKEfmmTXsj>IO`x>G1$szP8fj# zLIJQkUty>+xF5(i2XHi576nPNjS0)4BXwc%4J$E<6RAc<@KxIUZ9V_W*YW4oV zSP{p))C2>Xl(;t-f^dU+)+WNgO4hGZZqXE@33F>Xv4R?Ei)0f7J%q7G5SjLOe$@}3 z`VjG(Bn^_XZzUbEsvs(_gns#wzNQ!(xR}BD743})WR+bzVCQl~M(xmsQ`;-oDdgr` z^OX|qRQy_GX4@&74A*?pI0jzvFu#^o++zZVl|MD0iFu|BwD%YdZKRsv#AQe!L8Gnk z2v^!G8`fU$h);Ij;sg&Xh4l)nU&5r!Y1`z0BKi_^{yy`1HPv3*-xA7B(t{A;Zvf+m z(8P~kSZA-otTxruxRKIExw=po)SqZIM)=P-0JysV;7PNt10`)>?8t~X)>7}v;dHs9 zm#o96+kpP;0FBaQ4fcq7OtYj#l+BXcMyM~+;SSQCrSNyh6(_afT2-|G9V{^XzMlD= zI1b8kgaDtAd%0?W%kFjIW?u?Rc>|&*qxi{JX3l8t586pj3D!a{_>{AX$4eC@Qsdft za%fvAUP|P^^~_7)U>urk27OfZ5@eafD*rh{cq5yFR)lApKI|pM*s8%QPzTV2s+bhn z;~uMu!Hl?!RmnUrW^67wNJy0j$=>ZDbJqK`=9%64PO__^yefV&f{jalVT^aH8Y-?0 z2S*9PTAYH4-1X#)Q`+BeTRAe~5^2BR5u|2x#fvC2DGn z#hQJoT;121_A7cLSdl5(Hq)i?93k_1abC&wl^ckFFLWG8;kRpfJDR{xV1CUaErIPI z0+|Mh>%{N_D6amPV38ZFmxM4v)4+96B^Nes1p128Ex}!v;h~{K7B2aW!&HH4Md%9r z-|cU#8uGTQf-nq6!6MRW*Qgovn!_zs-zTDf6}^<~+%Q4uV_iuHA@l-Y>vN~n{G z@{SR4oBA64v#;}%i3jg{0rxU_@xe=(eH$IVBkkANpBR>L{MB_nn`UnTEy=yJUZpMY zJ2_Us;1n-C83I+PUvtS>*NV1T*1pv+-J@Q|w^iS|*&+hO#SVS%hc_O&Aw4!`fyP=} z?j7J9QE6re+5TsBKmq^&&MCslGlU~2l>&$Z$}=MP z=3-y0Pmi7K>SH9LR>5tXRE4P`+`dVG$FM;a^B!9G5KE|iUkhF;aR@A3^S)|>yAfE3 z8aLw9lsR-Tp_K4#rUY@77-`Kmxh{~0DQHAy&ou`uPw8%cS?&G>o~*x}oMMG0vx2Sl zp+ZsGQ!|S5jKm{ur=$GE^iM(2d1VS>p12pVKj+$1ILpu-yL_zh;_9dYD6(A8Hh-!- zXXCc~C76)R%~`=O%0q@qU{x>L*F{sO2;q!v!~Vce^s~AoUp39>Wj|d917DEe!yT{Q zL@dcl!ge0N^5-DtGAmxSvO!G(-DJQ#^Jh^i=gEjYJO=P5{81JMb_E%gwNFHj(etN3 zcZOHQ^abjl9ThY04?lHh@FBbn&UDExcsxv-JzCA#tcYjDf*ri$9PC5s+)1LcVu!@I z-6H%|>fsC%;ay=A1lksT6tJsWmrs~rg_kKt`eDn`t+U*8J!HsDV_2yf|JU6E^F_6A z8|EHPuhKM5o0^hTCIB0fUsGm6fE*UNMop*zh_*>k z4r5Gqk^k;D9YhlVHnElMD$)vUCvusvWk~iQ;MAlJogd8fPcT4*0HDU-+YL>WsNZpB z006uq01S@s8-TSW(-zBvJa zkX<9q-o9@PJ_~^Ebw&I}KurMP+AYv;1h4}Ds-}Q=|C7_V9I%P47JDusx_1K+IM1F) zXYl`%%{LRnr4-hGOml&Nr@cJr)WGk?5SjoKVt=d6e;2X=02Xul{vn9(6Sg{5f&XA1 z0LZ<3?;nKA1EBi!fr$uyV~{EURNQ9#KL}0;fKPI<_(lN8bO5@uNkHH?{AMQVbmsd< z#oUBiG*C${<`fO+^H44y^(H}rxMWJYy=u~bfT!(se(=|m&zuB2qf@5Dt(#KUyOuEpF-#j*jPw$J7_-B7YFsuk=d(7e^0H5dCN?9v zLXhWd0;UR=qgA?uqXF*)L$@DON_6OfmSsKu@D{^(-4uZ9-ymB3PQY}vOfW_Y75JxX zZn_9n1Aw<+J$AG~L{~$i4Zqx84pLb{kRoW93Fp|ogesP*>?1XFb=rbwbOK=Kc8p=> z@AV$oP1w|~O{-!T4sXr&>%hQVg(gaZKss2{=NT__NAuDd^f+)a=N&?(3}ncV!9^P5 zgglpgO6w#ogQtoKAcDQh{q}MtX;#)g=NG(i^Dn=W+eB=>)n@Y;H?^`x z=In7>RfvL>ei|_57iv2xzN$xFTl5f9+jI}68mqKk|J`w(GY^&s!nPnOKMI|uA|*ey z$_oHT{jH23m}vUW?zikge8rLlp6mo>KHy8NWl@Zg6;Q&eIt3hzQa}BEBIJ%Zd=}nA zKz!WTg(h5Yp7Igv>aoyHR+TO}p0XGi=H)(gagANnH2n3g*~nVrXk(u+LSj!n5w1UW z_-hD~e7ML#)uD_Gak%ab)i1;&$-!IWvxd{y%9;P}UOXn#jFA}pyu^I7=}`ld_gO$w z3Nx9_#+)wi7vKS9uEi^U{7TP=kSj)t*aKD?n@!|j8niDb8y8EpT3CDpOyuMOB5ZwG z%b=z75+5#l#VWAmNnOzmHWc#1v@~UD8|#IeVDVQ?u6X%Sm>dlR?=mZLLtE96J~G9A z=$#<#%PfO25%RE0zBx6tK8r{__b*C_ul8`rtjb7en|bDQ)LUmFs_4btHt3%so7U<( z4%s9JOpMg(F#&hfT0!0eYqzY`f&&tlHEohxA`58r+2+I9GBFwpzq0&g(zdgZf%AFB ziAtpFE-CkChYeb2;2k0KAp=}%+v~B1`m-i&c<}pH;#;xM1oEsL0_B??HEuuO4!5+G zTSb)UB06xfbQFT1OvG+7I9aM7uz-X23#pNWDH^)$H>HeZ}i6juXVpj1n+M0bHKJ6i*fj4lfLjMj|ofcXD zO5BJp5CysO0lDcsuvCQxp?DOe$1j?0>%XZ12h(`#F7tf##f#{fi`|>G{A4kSU8w-4 zRo?l4wGr|HLFnvs7J4k;%T9V-W3+GP!SQwZa;{yCAauK&S_Ke-A5Z`DYNV_c1+I4A zqubnKX4G`Jo?m6u{;2#Nf(?}eU&RBzz53B#(EOl2+v)A+@b(E4gzkAgz^I@(5n_p` z`MQkdgj^-GIRmy8>PtcrFpWQ$u(#L6`ZHzM!a$32a^4Dc3heWH4>2aKV4F481S@{B z_i(BaND9pBp$kT6r9S@_MIbSVPqSbv7S41?kQ`#L@&XT{-iO5a@!Nj8Y;eRHI=f)} zIMP_pf)l@DdD(DKj5VO+E3`Ia%Y=}GM_hm}SE0QZYuq?2h&m_%0EmW8z0R7g&z340 zX)#sJiDX^DYi*KDu*Z8^78m?eg^174RrYELF$hTmY3POe$k_~Dk#(Efo!R zA?JaJ=V*+7=@sc76kTo$39)&^ zY?UaQ+WJ>f<7Ag}4r68e$e(>U)>@ADCjG2y2?a~Pzb8Q8m>c`RQ>kFeTg=-yiORw~ zehq(=Pn?lW6l6VvzeuJT>!-bP^H1a9^lwSa#32FKLCKDB%F8HRXro$ zy8fo)PTEOxrAQTqT*6x2#B+`DUQK>r6-2;q5TwR_I*J-7Od2^w{bICchSU+~hsj@SzhII>U=u}S*x^CcHp$3}_EfeJ)4 zQ$dbQ!=2@FU5g*CT(Sf%#cs24<7K=x$R}ylbe-Do4bpXPa;l>_hCK`M=hJ2tKMvFS zuf(U;1^PxtwTM9e^htTnwxegEMn~T0} zyJFE|ZS>VF&;cCqBGaG?BRPEj?9A8^%bKa5S&Y7q&Mm2w&K z)l+_picuK7>PbSiTlw@@p`G0T%WA5TBPjTx%q(^s_9INh0;gtti1vG-RJdy_plDo> zD;&JZYzUj%iqp#*H!&=OV=-$2M8Y5$bS(6%$DerHF?DI8Cuqv~V=PswUZc9^LnPAV zm)W9gGjN~{ox!fu_c2A{S`(bsH~MZrtM&CC>&SNj3cO8Nggx;KAP-0=I~u1aA)+t9 zWyA~(0KI2e;%f|In`gQUYCHRg4F_(ax=sEO2H z)PKX)H@P6ZAXK4WL_(7mXC=h-dZ)e{0+fMM8i2wQHLS$@`u$ag0@I3$p4GI-{o(n+ zoVLz~va`n)cbN$UZHw5vRV@dZnXG`7l=+>zGYoncCbZ91#v4oV!ozz>#H5Dk(Rbu# zDA5m5PqlZ_HBAi~=}BvhdPcorHi;)*K9~I;6Zg^`omswBR%J_9Fs|VAWD(eB)o`uy zGSqXyk2&EEv-#lydb82~fDrP%^f6r6`{=EC({t@~ehP-|hK%A5F2Bv7(2Sh{-?GC% zwfHzbRM$krqarVSCq-Ew|z4ytUH^p|BCs0L{J#PDQ; z9;uFkqRhp|kJtp%u1uxDWDXN2r~=V|=SnO6DFiBA+Wp zVxBVc>5&$_o-i>bu({38RxELHBqC^F9QhA%Xy*l0VQm+h)>~^A($g=ERH2UlCJ!P- z`WQyR1IZlD?4Nm1s=o((p2z=4{0W@9vgE*3IQUVa?tAUr)RQ2*LKH7}`!H=CYm^03(IhB9^L(@62&J1rd<`sC#XqF6En9YzM%x9*gZytcxY7)1-K2#$kDux)vAkuPiIJD+&1R9}^ zsmc%s>)jWjC4oi4@F2--i0^Bl(mADVUV(1MMnyyoc-=MCY&HnP`oq(>#9$DZ4H-5T_JikOF71dJY+W4A?|7XfDT7rch zgZEjSY{oJAmZ0|}>jjZF%HIktPf2Ilp=2%37(PsE$7{m9^e!dFA?!`L6HL)UQj%OS zjYXa30Q(X7^ddL|%+|0`!%y7WC_OgYk22C=d5l-ycT>vRka(9m+=Hzi3**1X03cS2 zkxrOW@Hs-&Pf?4G=Uo{z<#QzWX!O?K3Bq|e5U$(G04JWeaSj3lMdW&k+d)uJ`7abP z@&M@@8n3+rorUhkf9cNi1FL^6Y_W$mXjs2bK`&hLIAoMU8^uiXi6DX`X>W_Jok%c`zkBQ2*i|EKF@ehVwF+puBza^1a6IX024u3 z|J(PKkA01rt@sh4+qb0@mrmKov4}R%%wR%yQ7UT%I}~pVP;zi>(Jp>DSCbk{9xw*% zjQNar5R;RF9|{^QY!|wDTVqF)fs_!I?r=RxR{2P9y7y_*fTM5BT`|Z^d9y0`c|r{U z)mB`n+&`PgN?+4@=<1RtsOb($N_EluLO;y9LOYMkL$_|!nabO7SVO1&l%#Yn=ALr? z%H|}wDy`P1cjJa#6MCcwq_-q15ntG^u^dOi$dyhY*}mIJMWVF$9;8=(4CQ0;-BT807Jxxgi#KtyXlN&XvO0=#pG9)^q7nH z3|zYhX^Ok8$G6X``#yv>7)Fg`jpb-k4VPa-4yZ<_D&VQNamt9$tKPRtPCclY-NkcB zbVqZUX=z*3H!TiRPub=*3hW{!U;%rRd6<3qQ(;k0e7tY_0f_5q?|-l;SWjJ?Sd@_@ z#OvCyCA$?0U73!Y>%Y!ei5mt;4=G5Cqwl%Lg3{28wRWh?A$#f_|ay^+(Ff3$3`bL?)b7b+pJl2hEu&W zkJ3}p%+@ast`mC_Hq=IsKJka;g;`d@=h|~tx-MVO)Dyj|vLndz-8qdoH%Uhl-ye-S z0lE-R)qLp9Y{4spI}V|Hz?DF?r8@f+{kOX+S=Ssv6VhD`DyZBi!>BpATS#{#ZvBs= z!DoQ`+VWjF%;^OJ-N&%)fbkHx4lOzHmU5ZI=KB_8O`{7n!Fj5T;k&RcG4Q&}_0M-e z)jiQmejudH>cl`V_)?MRN-i1-6d@^uKHKFo1>l*$8m3Wp0Y9Lan=9oOSP1?Ue(QM0 zLcr`8W$ud2eU#N)f2>IHm_jpNKAMj+ZH!@1s7uFo%MWuaDb^e1P};_Xs4|gB#aI#M z=Djp_liV&wo+TQ}=Z~y?C67mCJRcJ0xpg!#juE~7Vq)ZzMEU}7D?0;@iHjTwGD!dObo${d<3Z zcx|#u-;HEmH$68ZjDCTW6T0l%(-&3({AUEM63O7MR3=t7EOJ4xA#rbh)+;`S>xuR8 zhnYiNG>JQKKJ)wF3Y)b2d;m$oPLkn^~a9q6LH-(PasjP9C z_*ZmTWt)H1l=dn%B4K|FWm^o zndQ73qP+e~wp4n+9%l|!M>&_wDdk;7qj$mPs~_5rK7$L7|EyfnKQbuD84zRT6$Ml@ix?bevbz z_Ch?%rB;h}auyG9<(=W~0e_IIjG7+1SL+OQI~#9|v?eEUP6vKc671{m!HzWodBAcs z(n8uRh$SQe9(!ScmY~0=iIlBl3YhHQW5~HzCTrX8OK*_;fHm#tJo5eBcphK_`Ykk7 z56UiH48LCiVvdqhBr}^s?~!t3Z-8B1Z1#wvXebuIx)E?SHQhWs(&;=+Qdshw(*Z@@zA{_{Q#I|V7$y-@M^=`!uNQzWzfx&5Z zev{}XdO7*4+rdGcXZzQga13<2*7&Lhty>}EhaVY{9Wh$kU$MDKM?oktmXa?>|5-5C zM(ldT41#)FwuvJVUx^)>x!$A_J*`}B43Z68wVKM$y=T=-#gJ0R4s{$GJ(FWg zKSL0YaZqc*yyiPt4cLGbB~BSeTxWH}%M}&Rdw(A{Bhp_t&zo6bbencN3Jucg3=Ftl z_MHhF#}jo%FD``Q{Ar#!WpIFU1A1e@5Zye4IJvK%)XpFWVZm_gj8d>Gr@jb^1u(55 z7F4e_mDz8W^a@5Q@m;~RqbN`wQEd3?3oc40o3DUw<`9-6+PAbvbYs@=xlCx8a>6e- zE=Sv&L+nJC&qk&FryN`)vH__C6cCuxg;mT(LHLaX&x&3E;Mcp}MYuv^OTQ8REV2EI zIGE8GKZA3kBzi9KzOp_oRUM}5RzZf6W#Z=pDy}oDyq@x_eNjBQbhl-rq^CMk`E5f~ zl=(F9-osLvW`M<|Z}4y|MJw`_pTl}2pY2Ngw!H%XP%C@v-)JB&bu}THXBfWYWcXC- zr(__XpO|Kl=YsRcg-ZCHD(*_gISr!3@@Kv>$(|HKu>v&g0|B8OJ3B~F#N;ER;Ubb) z3vaM+K1K?UJEDeHqy{*W1wCf(=@YV?8VUQVx3hF!RCO>EgK2hG%sT`(lrBy!7AQ%V zCjj1Vi*~FA_+n{SbumiEAqa9Y)-kB)vl+??J5(gnij5*0JBtt~q(J|)=wEy9e~gIAjusE$#>h=DB zh0fA;1c!7%C@1_1MPI?uH3bioVJe3K?VMOAWqos^Xp-n-8_d}^7-l3!4cbocf-nA% zd9hi<=H^;Se+;Oud?HlBzG0}Ylt$5S#|2QF=d?zedGwm?63*+6)M7g_fm#}xXAC(( z$pPF6e7N0=6zwUDPml66fD_nhEQV^H(+)}-vd6g`49HMtSlyWt>Bq|YtC2ncFZ2y=283^DWK_w zA(eKFtuDgJ_!F725w4yWY-aUf$(a#K75&QuPf)XuFpxXm_2(K7W%zHDujh3)D}!!! zJ!i-rVCm(Yk~hdwTB4GzLSghoMmTk8irE>b2&NGuwRPs6aRVC4J!h2q#c5@W+i6hbH-wkD4H!hgkup{XM8 z{5#;GVdRw&slzifCbP?(tG3V?VS*>%Q(Cpm-3(4vnFKy|y?&ANSIW_{ck3_SMMWhj zMz66G^zZpFg|sD`B#ew#Md~%)ZmF@l4%&`qpZZH`KvSHR?iT^^1x`=AVQ z^X&sp5TQ&LuLr$@oquNrshs=)o*wtcKXNcdRV2b%m#heWZ|Up?Q=3O`)j6qo(Is*? zLT`Gt2iNbQrzuv4ROLMTYvByEz+hhBxg;y5gz@W(xsh;@R+V+`rvBjGVSAo}q3V)G z8_Lm+p&HYqh*yIk<#}`^7mU)IDngtG4LH8ys9;GzMn76Z7k%7QNU9ElBdMhYMzFhU zxPa4pvVad|90uvp))3UiKmRIkT1M+bVb%6S8sEiAUC~;q2+SgTpH3;9!qySA^lmu` z8Z1&x3!kBSQO7YZ(h-K)8@;run%G!T@|)53b0KnNoKNkLiheNH`e-5xzRl6Mn)=Kw zCbm~Fgz8{daq?7WM{%auJ;5{PvW;q%w5`xt{gSp#Zo>RLCkkZ5)(-WnROoaN(Om9V z;=Cm7=ecq?Zh2MnQhUFo(Tym-@-R@Z*!X1Ses74;earobuW3pEuVRGjf=m?FlJ3#S zo(=ro9ph7K_H_*GYiyiI${#ul219jmww~=xhjiM1XdhT zN#5WAmwfs>W4)@e^uLa;6c`*6%1Ir9rXSBOFnS&Vf0drzpeXsYLMz6vCHPM<-HPg> zF}U`7)~QaI1?TMy^svIlpY37f!Ox9d9Sa`6MD{&wuftZh?&~lmkxdcopy*1RGok)0 zCa&uNlJ?jQqa*)_jjjm8{Pgr3aRUDv!9UWArCTaklX@FKh7~1Vy@z*lAo$~}7Dc~d z&hV7*%*&{&^ow1}Q;UA_1p`VTVP^+pY6=Z%xxsG27|2@N8zScY{tW+d2hqj;QfUxMS5iseXN-N+CkV$pXCCTU$LZ+cy|wW^EmPRcj})nc^tb?KLpbIxL(hh83?;IJJlI3l8a z4Lh;iYZMkt6*SYrN!N|XU90Hfh}N{{Ny^Jn^D6#A0PVUBe#U_gCr+^dI-dJt<>R)) z_gi&H0o7Pv1BJR%fBBCsa2zNYOmzJEI`#8p((ZJ{r+}6KsvE=$6=h6{7kCI~ezSV# zL?<*b(p-n}wwpdEBCGRIvCu~oLUe3Q0}b1&jG@+~HN0|wu*+F*BsRBsVwi2OKdCrd zc1|hQ1QI?#WZvU@ZO=*;6HgXUjs4v(Qcc8@{z8+=fr^p|O)on48|b_KS^3GbSb(8~ z=v$F|d`%_DFOq^1inSb!uVWh`j+sc6z@!|cPxVK$=fat*9p0koh$9(jt1P6Shny>K zTmHU4U=XqA_EuFs&z7W%XUC@{9r|~Pg9g;S7>z!v+^yi11nFF9ADo5L4>mrGl7sq4 z>LoE#ly%v(XwJQlE(xI(jwxG#5XE`V&F}3yL!L7xTxn=wb`QMJzAOPBg zD__j_vpdnL6;W*6Xp04xF3#p)DoK3d#e!0c_6Wl-s55DeaMLaH%OVeKEMK!ULjGWhXr6ZU& zOiQ3fvxyr*{fP6qL#~`|*hd~(ZN9*DO%>mVA9eZfwtQ`hqJEb@nfHE01rsxBH>FE0 z=9c{Jk8Hu8zQ#J>h|2t*wii|R*|fr}o6d(k@IDJkP^6BdU;rQqD@7$CBjiYEVLr#j zpvqNt^R%koUi#vW45&WuPp&W6ADuP`?WD+vn=--y;nQ+fB^ta@!?NO^8!uiYQC}Z@ zz70RLamhxRl1He*B)tbIRmxe}dN}SK(MqOH?NuEHi4)@xGosg@?oktD-;>FJUBsKN zC|mLdRMe+^02;{AU8x?7@kUrpsEgeSq{LJKHCi??GY5p|5b0tnWH6PuPFfbBubz+b zm9e+1M=&ekBqdlS0ko;EnDelST{mjk#JPN#OLDtbxCJ5wvpp}?iKYF@kKNlpk^8j6 z$Uf`J#!mGS&Q9fd3&rx>opM~@Tsm;e@M-B=Wd*FUy^b(EVHLP`U942#;Pv!Avw6>8 zDhY(9;pk&bFK4l9_E>Y8kz-U2#aDptEvBH;VU%3*eZ!*v2LIjp(?uI9W02Jo6AbJ0^AXUK! zvG6&3Pur0P7K7ySO?43V>c&W(_+B)>lh+V>_aPbXUZ-g0-Xb!Q<&n~TJ0bx-N6MdJ z7&3K7`@bKHJc==1(Xb?GC#Iv^n&G!+fg&!E`88BS1itB#_p5$b?60N}o=cbwQ}xoD z#~-dWO&J=lo1XBL=xR}LErR(@ZyL#G|i3|qSlj+@I}mFu(mQ&sRCqO za7UJjZ#F0e?4NnPa$y8#?%-%*zmt${1^q(L10fwCmW*&Sc3?2O{Qf6?M+}6_$trXq zb}?CKlyHz8Y`4yln%ulYvB}_$&vxw9H~MX%mb>l4Gt*iY{b={-pNY0$KS#zfWXd$z zP5j8?i5h#_1hSN5Q6P&g&qhAXFSoajsV*a&Dv^&(%+W3AjkbIv&|Y+Z7>k%!0>~7& zwGhl7ehzjIBYjb0VQ=t&7LL7#g-s5un-!c%9eUv z(k1Ia9wZR7`=u4^D6`LHcZmFkKs&I+zqX!SfRne-s%A0nPD{6)c5VwDBAX=gVz}<` zr1km%ck&$z)R(bHBh=O!#e@Dk+6X>2IP((|ipBruVnBhibb-OuN5p%T&LVMGJ}1tf zJj}5QYg5H%f%WQRa{Qq=AZiGHzm~h%h&10g@zL?M7qBT|@X;1`GI4x_Hmwht-eBAD z`fOCwh}O&S%~ss*=&R$Fj>q2AH{hy0wFQrB$3|2AG5dA(sqRcu;46(PndSP*!Hx71 z{N0Y3b%-dk_GJ;mQDPM%CeqHP*-4Vj#dtn>cw1aSozn%26%>SC}kiVC)DrCls9&_L37?UN4elt~Hll z-(6PKpI4Qk+)Bi$ky6VXQ%O>y{ExdR)~BGQ7JUSD)txkSHr&y;&dN**^_26>WaD}J zRHjEyjUi+avE-Zf^t3r*&M|fBOrE+VI!eN=59~CunUb2`J2}B84r$ohaiu>^fnI?n zeIWc`#;IaglZ%cyOsnVgeKfZoV*o3^zn8a&qyRk5Z$HCuv5ru`a2)E3L5|6dAk`%h zn5iA{B*n!6Xq;m0#{6KESP87no91ay9xtlavczCS3z5Jz|7bL2;SS-yTrIY`wM2E7Ca#l$tL%lryxW zVVri`w>iI|n4yQ_Blp_);tK}1>PJ(bwEDwjZG5SnjE%I;3DNob;71N|E{%J2_a3t( zCK_?2BDA;wO~4)WE?Wc=;g~tWXFc0X92siD&BAR~R~bo|6FdJlWugu}?7u(xa);@i za9@cEL$;IJmvbB0S23`;7UgS{l7>}L>fULXULWP{B&JN)0|29k5Yy7R z)gFodiAiwN5zNH3hFuyCRJ$51T*z1JjcV9wO8Mp7ae0#FQ9cg&26X6KOha5nhgW>U zkco53$PhM}SX5xz^eBsL#wxOqPZ?6rnGY@ zmYDL*^@1~2Nk*{(#zefwYbr00tUYfmyAR=_#Gk6dKu7Tf*rs7nzz{$A?x~R4^pWKO z7VmCa^=s{&@oKHTHXX9X+mMX(8HeDU9r0*;-r@U9l!dw*?L7^P(!mLPpjf0*0_-N0 zG{N5N9>R};3!HMsQ?Mfvyq%Jv1O7LMMZB|22Auk8bP|+EZ;5#VclxMF9sd!F)XE0# zoM!oU^Is_<-yb0P9{_wngTL=beUzoc6Io^rPp==RY+om^a_&5ro_&gCAJ!MMLInT> zc$6-F*1AHMNIh!{)p&?@^Y6w&}95=JO2f zH49$0~JOF8b=Y-P!4r6ojtAsTt&m9(%t1 z-h|;vY0wL9&UUT*8dDNd$G2}k;H?b!N15-JqO#2OE8DSs`?|#qptv@Ujn~~Oi6$os zxL{1i4k=Y0VfeKm6X4lwgQNvwDb*cRVMGGMAuA1GruHwn`OE38O5fGONm`Gk>ccwB zdkk{e=p2~W+hF)WI#3*S|0)ewrrqBTcY9eY{68^m(~_7KH8jV2SIq+8B3feuolOap z1&?nmAz>fl=N4RtK{^G zZbIrFAN5+e*3pZ|;JhCZebo5AEFhp9gd>vtfu@kaZ@UF?NwMs(#w$PzbiTK2L=6Jw z2bs_@ORIOWV7`@YJ$MQj`?lE{a)Qz_#>^5L(81=JxA9a5b?yXOz+q%UgM0Ep=*G|e z^wnn-J6VwB`az-+!khIK$uE_Ev}#|M#PY^s?gY3eReVwb2Zzg^F^tio(^ONi6XAQD z4T7K7%7Ow37gKy|^&gh%HF2Z5xxNND``|ogjI%9V5d>!veMh&xg3h=?007-%?pi@= z`}NqA#$ctao!Zpeb@#g9f!ex;pp}fYh|sGjIN6p4~h%WE?TJQ z1}KR!WFl=MhF^s8@jDID|9WJS)`w?1E$t4q5Gns6HE=P?8g*m@^T&!p-FMk7;ok!L z37)ggO#mq+{tMGrM#7=DVJOl;aeAkqit8NcCX~lMudBUO9?@oJ*aT`K$23ebH$RYH zP=Ho&p{(TrZ=}fQq-YtspwjaOxlpC6ZJekO8yXv0_`KL-e-PwROP-g2zU? z;*elsyulHA^J9~e34p~)zuZ3kua;u-T6Iw*LBqmz+=Mg6FvzjJRv!>;^N*{{tQ7!a z^hN7dTHy(ey0OY5;%xAN+B5Wu9|#`&HiT^P_%t)HnuFP7I3Uw>M|W$&c!;;5-kGb< z`Yg8jm}#id=)AqfG#8S)*DZ3P>z$hZO$|-2mgeIq`Z^(<$6Hn|JyHg5P4NJ3!-4lW z9}%!*D?*-}&EZn~Z-%jcv;WYlkj4=cg07wjo5G1p;tgrpmDlIo*m}yD0>jboP;9CW zK_3;%vybV%W8aR8XKx^?tCvr@Zw{1HbwHA8GQ<*k6zUGXcO;*`V3gO_c5;XSAdy%N z1-MXKkIUl3DLUALKmY&|K)=#em#OKb@$MoAdPk|XfU7MI5@ zFDA46p%E^atyYiKXP)-*bn%_DDt704cXumuwxVG7MiCTjpZIA8d>DyogFyAMAye-K z3VlnlW)Y*198tv4*s6eG?U&DCT!YnCl6XC`GmneVTpdX#Wi=9O4~UNBugdSd_ULgJ zokW7=hdec=Ibf0|OD92hP4-3--z!lwbdOXTW)6dLL>T>=zw#8934P7UEn&VHO*5mG zg3m;Mp$}wLl*rGn#2uW^o4Rvwi;8UGrA`&F6f|hx3_-~6!c{d$9b)WV{Y3wn3T&x{ zIw&U;1A6?2JrY6)&Q~K>wr5XMqkKi$19X-bcI&BS%s5o^2e>Py{16SK4+cK$d_-%% zK;LcMx4y}^9eQ7j@7DF!9D_QxTvl$F&w@Jf`U5f;x|304tlO&$e)jJmLTEM`N0t@< zDDcm>o7o2AzKW3xb5P@jm0LVU=Hq{71d~z!k=m3n=6A9~4n^j_E^=L_)<@ts4i%ARj(T8rOj(?0b2B6XG& zzr)9-^J@=2j%;u3RgAqpSuE#$i-|Lo8v-Wu} zIRc@TBIrH1JP6@ z=ghT`*hILt2XLGV{;7cEGt~$VcEpPg_?$>OX&YS!?Ow1()?^9I8M%!5`6SmZ{}5vf z2%~p7S2!yXqS#<-4gh>0?`uC7(eTSDlLb5-p>qY2WefeYH3gzwq<&lnx9C`FHnc!IOagvAnlZp+IwU zHH1ujz&vtR@%m~E1;;=K6s>2wsTS<+)|1?cM9pgS(Er{apdzixR+&SOr4qZ;Fc$OKmd+8~_008vkBR;#F zZXaGyuS*_ONun1W@-|VM{8@AO%v9Xz&_nXWQe zd(B-tBwWL04(%xxTY2Ch9v$a{J4XQ^4G!oDZ6oJFzjp(^u$_@o9Hi0TermQTw^e zUNz;954&_@2NhgMl$Ud^wH zX@3aL>sHuQ0aDTMYGp(d;?_Gg8cAih6zMl-Ae*r56VCp+8-_qdTe2D%rqIr<9-d-7 zsd;u!1TNC&MFRTeX;p5H1a=}vY13b?v25*{1nes7Bmsq;J6t3|RZrjIAVf;aN$JYnQj@`9?FViqbZQTptc3u4dN@9b+ zxjW*ATR-K~dG^c7+ev2f%1D0{0*dfCh;X7lL_Yu%BE_a{2!HC-ZOD%T0QM5_fc0bt zxJD1vcX{ZHK^+6P#gN220Rl^Ay?YG{fL zpA5sGr*IwyfH^Yr#6}A{sh9Km0@7Xy@pILS$k(426s^PvP18qrVK|ZJzeWcIwBp+= zCEiuaoisHS&s6D<+w!-oI=%<_7r?EeWGCmPy@_1JzIN13XYiH1 z<6rqq$SIw`@uv7;j;itN*U4dwW1G_l$1#vCv!gtES)h;U;HTzelfh}xR@XUs21GQ5mjycAA>iO(1K9; zdd1iNX%`!Y{G17o)%JG81%yLapa1{@+-Lv*0!RP_$OiVLM66z0^4TkMG}h>F?os1Y zQB8Z6Pgf45R7rOiXBaAt1GlmdLJdUTpFee?HkUCg9AqMNY8sz))rrG`b8ot1*EAFr zK{T298prM_`oK7|fJDk6ey^d+p5@MJzcE-1uP?(VHOZ~EXnB&_KIO?`W@CQ+%G`hE z^7q;+TF#w}*hWaeDkIsn5nUP7VMnO>*?t|D6g;1ZNZQ)+4+wO`PSvJVc|EKT{K$*X z^mR4Z@=_-Mh7u{bz8z*Ulp)8&&U;+6WnB zQ~PIpi_?XVE(uBpc(@=U$IY034vM;Vl$^ANuNgQts&qah4C_0gy)?RKgw&MGIvTFe zE^JTzN{o)+i6F83b1n;jAWY*luE@+dnIZU$ug;z|vYA}&*iQ~aVek*v zdi5GQ4bDa56CQSRa6?JBz~ByYU092Sc(sY>pa30s0000NZ~!8NEBqn8ARykd37mcP z#<`VoR^~&oQvzwU0eL+!Y1J2>aZfV%#isg|?^>hxOTx zceAwZgJ|6XG}!O2J|Tgu=^zE7Di&3|ek$H4m{IHZ@b)=KJ>{cyodd7<*vz5Vj6#;ejeRu!FV}FVUy*+r;05S%G%gvFCBFuPvQg#NGe-!6T z(D8!3QuC;l)`#69=}6dOEPU8to;*wg2d%sjlnH!8>clho$9)j{_Gl9Nv z{n}p^0066r$b-vB=tqS)C`}zef|jLK4KA!{&w-z%5Cm8>4f2Z~;rM~cR2MS1wh2p@ zuZ3fxti5gbs3b*l;yF1GZAu2%nJ1}=ZqiFU2coSW+@=fWj-4myAYaB6 zVe>IyN6~MxS+dxhVDhT?s5+dFOu%eIL2=21T}`kJK0%A4&w`VfEx7rgfpl76uW&9m_xXd(L<00vxz+sv$HPn zNiC@vQ|#hvU3Iqosm0&+=I6UKfasqdKg8?H*V+CFs=$R%&bpPv&;S4w`2e$62Jn`} zC;%BWq>xmd-URC))t+>G>#)nKZP;6ww4g3w^Gbk5R391&#k$ruFrrZw{F(!+?vdUG zlnol$;flb(hO~KaDbb93y?`T!|MH@|O8)XiO6^%lwIsL~tb8x= z=gE2Z*H95hJUzz9( z^UQu@F42n=1`PuvSw{ko2`?c+Y1hnPLEG}Fop!wqb1#1Kh;#gIWTS(|(+LW;0=Vo{ zoAa%#;+{jmm#*Ss7y6(>@y5p%tR(9B1fQ6<#WkJ9*Z(Qp0Eqoi!bFz=BxXW>Z6Of! zVgq`Zb_7Mckm8xgshcC}W)C{4(q%FXT4ZSbj71W>iMw3P0Hzr3%}oxbH4?j6>>1D4 z%dv$Z(0Kj$b&BG{d3B1`7}&2K2_=WCpa2BI4g9aH2A)84G76^^hZu;!{7l+DS*txf zsA3kW0r~Yr-k)q}UTAxqb zB)cO$c2C_ozplQHv> z6nG($`5^ri)uUH?9p#6m`vAc;w|0j)*b*cBsB-P zBWiBT(iqgofe$idvMwi*EaM5V(JwEdeUraTFldW*?m(qxk$Y9ksU?9k^+6~HpaY*< zuk)~(m-K@_IW0C(?ipA&GphiOJUyS#eaj~HNvS{;ZE~OjQdC`vu35FpXaE2aW`SV3 z6jBBh(x75pTd8r&U)qPo{`k}LgD1HUFi#2W%nzXi*bs5OGu_F7b%y{cyU@_pr>_(f z=F9zh$=EdmTmTtJ<}Mbf2UrP^lzZk=Fy>h^i{$y7sDr_O@gGi4hp0xNkvHs1OL{pu zRqvwG>PrvU7!hS!Gtf|3njQrT`UFEQ*+jysTWJB)Hy6`v^}8l#?YdZqg}-DwUg8$h z)~|5xB(i5w2a(_e{W{HTz~9pPx}%9Al6Yk8Z*9_c*KVB-+o=eXu%-G0kdtBl*}(F2 zyqk@dsSb*r%TK8#6wZ6;WkXT)WcL;AQlbpeWEmP>u(p@`iWPZWGFKlzpUE`^VHZ{d zSp@XZ5fU3*7QZbe0XbtiVEBxBfBEiDt}FzVsAv&lUZ2C#j$}gz2(|pii8;N$(+Cd0S1GE?l1sLMg%uX-_TL@eWB0{ zvvao?G>|zUF_FoPimrrRk4v>0fwTgw=CYCp2`b{S;a#FlK+bNlf#}R#=Mkdk9%iYE z=Ji2&S2=SX=NsL-Vh3;0IoJT3N$Zdt1WSB($JAD5^@^7g&}JsmJA2SO@b?(-_P{#m zbC6X&d;2SBKhB8?K?RGHm#dK&3pmm0@kPA);SLnX{?a@AA1V@qqGoG{SUT0Vhz$mB z!Cvxqp*P2x*?XJ}ZCU<9NQN^`#&$3>408AIxprL5XJSYl^JS!xsP_4YAr&YOD#aGJ zrlNF(2|aB8ZtBs&1bSglS%3g7D;`0Q7drA(w90_ikCD|(u%3WIZhiqsCvngKjzWoe>M)Gv zZZa561|;cRFKG@5xGMm6I4HW5k{oufHt)&j^!m_L2y*NRZvcs6A{3}+MLihtiX!TW zdPo~9Qt&zRSM>=4EqU-)+Co|e($c6SxcBpLtG+Ge)VHSu!}I8YXS1TA28i*W?QjEu z03@MvC&2zJTrQ> zpGzTt005)N2!#{FF(Mu@JoE4&jw)b-P?tY4U07^shY8!YqfF^3f|C3PpIcM+fCNMf zg<=BVFjCwLc;&)}sGh4grmNh#9)5=u$lkjRUOtLI5@m5_4U?|hyj~}97&9f=bB>_^ zvqNOJ<a$`1QkGKS+EtnEBDyqvhG9MU-Q=Y}OAovQkIpY?9#>SY*(? zF$o^EfgyBK$t^1kAVg#(o7hCNPr#$GWA$hf03!w34=ETi& zHk?M!Ka9kkvDPjnVjO0*7@iV^Zx@R>!t3>cOn6#VqqodV0JX|NfVPrNc*V={5&^3V)ugm~b(Hi(dV7wscQ=aPup8R&T%G5Pt_=9lJP-v*HYLmA@(1Jze;bW&bNc@q5%1Rah%4m3tLkQyn0uw|SL782c(pg9W?X=ZY zZjVFUx|{brxZoc&!U6%!f#Z=e=AbgQb1fhilq<%~Nl*B?t7}IBZ9E)6 z?|Um2g9p08EO^`f%Kj?F2HAITzklmS_0c;A;Ac_{2f}-f;m$(rL`6bbfWb)9i-Zf1 z2)n(DCQ81|Z^|hj*#5G*Xz#YQHCeH|M*aik{%n0fj*ct8KvXQ^?pca6qZi{R5WN~34D>ZtV% z=y;9OK{RHJ$8lyny!^9PK#}OrxGIFze*7IE)D$GC1KH&L;6~m+aPV zk?)ZVeR?=h49^auR_9%?S=R;$Q$6DC1?hs7>ZIFaS%Y!eOjT-Hr zHy|H4ka$}S0I$xeIkDwLvOS#gXe98OdZS>zAiPV8h7{0|gp5_WrBjkDP2qugH5Cb4lp+ z^kLqSRnjpUD~$UUg47)C)YqOyKo|LDUIC1Q`S`pw2WykX$0PeG(ZIa0o>pG)HuH3W z`hScNr)fu0U0VD+D3-L|N&JWfhxq63)c^nh12?c>rzb)o5rJXaf|7Rgkk3o3;a_lc zr~Kqnkr1K8zPJ0SuA8#x4ol*RZWXH|@SL6#X#d49Ea;~P;c7+WD$gjX1Q5y~h1zq~Fbjo<+oPBfiVIH5S3=CfL zm)d`iHQRzzm@!Ei_c0XQz@oBV1^CAj)P9xe3Vf{v>>JpQT`Q_A5Rz6 zpAiaH+>2DXF6c2Wdr05My!!YIMlrv4 zl7mDH zLbT78Lo`Pl5$Vn5ZGYrR_*TD^sB!rZ6oBW|Bd;pXdY;6OAW0hNFo%JLw3M7ZhTAz^ z0LE!cGf{m#ExXGZB-63zIH8GjGqc%6lvojsOx7-ZZ%}PHWV^PVX4>qMpF!TGp=eql z0CUQTBQyJ3=SnYYw-cJfFEjGkq>bX)Hm7llkX6XPRp(ZK3dl%`7 zWC^+#^-4;}=;CNa>tAuAwLsEJres0V$e}j;k7+BIa&9R;Jf=Zt$j|WW7RO~K+Crj2 zkUz5soZv|T*G!lBhA-L1;QaH9&p^7nNSAgJ z^u6@kEHA6fe{4q$6J}BK?QnB8HZc(ettlE}(ak;v7l@5HPel@0!ZxY?Lp>buC~l4} z%qSg{A@&A~3P_ygsN~a*5#(QU2vLy-XS6x|G#eryv@ zdh^3CKx<7P9hs0&zaBv7=IE;j=sL~wefU{eq6EOj{7uo(+W;-w1I)LZNbPdUwlZ3J zsgh^uBt5a8eL3l)5jyyepApJ}_ik9b#ml&4NBa9%I!G zwqav$pzaJHg0zui*&Q~QDVq48O5Z{$muxnfH~%A3TeUR=W0NbyxOadpHJw-nW8@8L z$;nau4{Q=QuFDG4TpizLGc(|`zy|5oFw?IYIMitvRqs3~_@z95&6Qx#qKGw#a8QEd?SQ2K zf8-|p2>y3+C2>Wj>{Rtxp|?b^a(c7NCP8>rYt({e_ixo5eTxYLT+A}dnj`Pg%AvRe z%~AkWH?;Zs!Pi^8(c%$U) z=pgNEe8qq60;CmMc_}`j3+P=(f@7f91G`*NP6uN2FU1D%Gpq(?G;)$mNQ{ue?NC~i zIVpc7IVg+rHpk1n?W&KsOC&}lob#Iyhgc&%I@i^qsdDo5^Cq?r{o6$1>MpH zS$kII#{4eXIxM~;F;hA5QrXdMxa$Fw9GgtNirZHWZgm`ox5QWyE)IoQsUP}%(PtHj z3rGUQp^(iKZnB`XZIuc&|~;z;mboYA3#UPyhz)4gp(y!$szGD}ief zpTX+`Tk`;F%27Kv*+?|@^EVM>9Ws5iy#1m7d&m=At)*O|#loKDVw5eSW2If3mR1@H%TIch8QOaL}wu&~wf!4+cxsWln7jz;W$ zI+T^cvj=35o>?}GuY#syK{RQ9{Zkkfc8)b;hM>|?xiF`!TUi*I6Y%@us4kp^FX9A> zmnTmyOKSHsyA64aUXnZHodmw7bO|_;i*50l9dXARDlWfue0J7peVGoOCTR4*;>8&o ze_|wtuN4P2vFO*;vjNiJJ-7_VHcZW|wX_~DZ8Ai5p`tbTB5m;lPlQr7TKj@;VreHU zCS{tq5?R@@cfwdyK8vIHtW)sh5FUG8OuirO$LATv<*0bYBzWU%j`7!~-9gZm&bVF}IaM$FwG<>PWx}(iopMC|h~zf~Mi4m4CuIHG_xp%Y0V8-Uh5^9)V?N6N3hF4|R|^ z!gBMjKw?PKUrs~)sd&riT@LMxc>aVc=6hqR|d^LX3s+p`lMMjPi%yu-`f+s{T!&YGmn?Ijs8E0*}NLKVN)FTF;_40d&&$!1weUENg zOwxb=0%1@p29FVb0o2|jlaRItc8iy)f@fng)mk<7iAf3>nGlSm25}wcwKw!z;q-U+50vfgBk9*zU{h)Rlh$Zfkma)Pz z7GCCGOnLlMX5Nv3<|3-oLzk1^-St^ktK~;$dI|+WP6VWyC^`6Yv0yu4nn81-YQ3V2 zEF+*d-dMwju|bkvSCH}Uf>5>9zDlI(wft@6S!yu!WsX>~GFMIuabHIHZ~}W{zU<;W z#{}UK%g}}D8V4`b7Z9_S7F{g<1)P)1eEu_}LZ zrrdRT1#={Ux)bbZHxwb48tOYtMCb(q;8h&}%QULlx4AIqHWc(@pgSN&N!^vt9v#Lr zhF4;@dlCOo$@BPwzbBxhL2hNrZL+9t@~dlv?6Q*JAH0Ho#iA8L$CEYoVJ%oq0+wdA z{b_3Vx3O0TL012}^$z^~g^*DzCx2Xq5O8#0|DsgeW4FRb;8AXsipX+atQ&?1`PiOz zXt4h1(IJ80;eZ5wqi6U{mSAYGQMTvCy4mC6$L-#ksr0jaqO|}1Rp=oY$= z;Wlo57Fwk@6TnjtVw(io_L@G4knR(LCB-WM&)UsOW!LY=#{kaQ4hRTc2^)p4d+}d` zNia#CtodkUxAsKC4F)#FuHNNQG`>kg(mC>sY5PURr%Ak2*U>p!MeIZ3aYql>oF|3G z{*RKh{?~p^!lsqOR3;8brVKdQT({G3yG;&lO}+pCBR>G$;O6^nL0gA1CK(AT;iW2k zwL22;n`QyCoFU6g2!wsZ+vX546$HubVUU3Wy`u)0u6F!~y!9MbXR{0em#cJwc&YOR zK?lX1G)EGD0|$ozslox^<9cg96efLflGP}~H6am^F|{xc#{{TdZ|N1LN!z;npq`V6 zXsnfBsKFW=DC`W+U3d4CTXLo`!jG{?9Fxr6MojYLoy=zU@Npx>KyAp6fvU+XxZUHk zDzG4!f#}tY8EO_vd)EIzgM-E6R;o&#l#s__*+5^ z%P|=0XDU{0hyX2&jNC~?=uMvg003dl80qTTl0tn2`POpO$>@UgGAv4}9(s%lM)m#t#?R?;;MAd zQ0Adl+;(0GQnod;C!l|}kduRlMBVpT{jFb0C?gU8@NvYF(+W#(VB${Ba~UjuJ(>Gv z(XE1;G3+|fbM!mN6Df~J0?CKmS`|%^wj?rur*!-TG8DGtfbHH9ajei;P>dd?`{oUx zcqZ9J$M5Y-Qosj;v?7ruKV)mgvuU94OmXryVoF-%T+a?>z=pQi$lGwpBWNKzO7tH! zVI}t`=}bd>^&oL^@g+g@_qn$_HH7M@mCT=(L!sdUp!fD*S6Y`GNUd##WEAjlM`slh zrM6pPY~NcZT!2yj%nx)HjuP8 z)`Pi%DHKAOPOQlxLzZ1akDVs`zL(Z>1uV`OOD;(Q=#v85B9em0Qe;^qzIL?qy!q zLx)+v+{^gQK#(gTx3k^P-gNp>+neLJ!D%P#v9u0d=d}$)IHBde-tiqG?dx(?m9sOk zkVD2=r4oQryZT2P(B2}}@J(*NogA>w2P8>C01L&Qv=a(FY(QSpdo?Sew8Gnf0006n zF`kE#NOuYHu+>Jb4bT1NRzGf3(Utd$jmE}nkgyUE?QTm9-! zxN^#!b}eQ}e^!yYjS=R-eVYiP4piYY@-3<4+^;+fHt+jJ#7wG?rFull7xaco&-f;+ z+K>lW;a2dkwXbL+&D}y+f1vsO4zm+2m{P&rLx)kwt$o3$aTLPA!>|yO=kud1!(5aR zPpieEJ9(wHZH%0C)3*r$HV^30u$E7TCAraXs#C)#AAx93Uu$N64F2UQyz1XRBqzf5yfkexW#3|(KjgH%k}i9DAbYRso

n7Wv$Y#bY+GT=uA%DwHUhYAJ$TK{gGsy8rtoyf@uPi7t>?I?Ao#RV^U8vv zR7RF+%@)#P5Y)u#kMe#mv6gpU{2wi|XrKLB-8J{`sl#DC6^Xr`Io!AB@#ku0O5#WQD&fAc>!2eKzmk5j^6=9c-e}$00E#;f_ z;Q^pJybQiy761Sh87%raCap|B1l&btTNWZM@^oESxzP8n95J||NbfWawnj;MF zD2gAQr`5#KTFDiN=4~?vp4`s&bOR)X0epu&lcQNpo&)~sLPJwwH2n7b_#+Vc!@%0r zdD2e{I{3*F4#v7}%|GQ>QWq*(E$|8`>s*jZU@Gru%dtoL!XlEgaWv&`SdBLJd;rueLpH>*OR;)-2$D7C~vTEN6gROHjSX*&C^MI;0 zD1Bm7gLCkG)Ho!s-}A2c>ycP`i4S&E!wi2kiDQtdR!kWYTd{K>9~ij!JLRu94n6M{ zzfVUB+bG`XD&RROH@kB{&8K%x=c;n}1IUHw?#DdFRl+Eq**Md{Q-!w=l}oysb?%s%y4Tjxd#JOLI)90c3kLJZcjgY_-3=4v0#*heq4( z7*@+wC>P01_%|dm#Qo^cU~_(RIs+fHQ0lEh%Kw3*AlbYP%qk#KqVrV%>z6alj0;Ya z&$DB`T|hPFuP4Lm35~=zyTE5!2SLfYx&>Vbqm}W1fk&=eVou`W*fP^G$3Lt@Z*V5g z4QvOP)`d4-ry6w?A-LxtKcZ2^4k5XH^nL+jX|2JBKdL9$?s?LMU|W1przO{M>OnXT zr34tIDwHnh_;){<#*qg2EG0HnyjH&Z0W2Vu<xA+Dhb8;6v$CZ-)d` z#!b5vL4)~o@u0O?^t|`c=ps|)ftKTGu&n6Bp|=0cQMN=IXd)w9eoNv?nXZ(mlP?!p zD5f7|Wh4&n_x&fDkb*k}R?q_2^pUh8{5D~kNyJf)U?~$mV3kJazZ2+WfDfDCDEpQD zieKsoJwd`@_NaisfPde&2=xSpMCL-9x8(O*neU$t!Eu|WtM{XnOF6VG_dSuK3C3>U z(uSYsB2Wl@LKbH6b7hqu`?)|~gkIBeaUS-o0GX|N#h%Y#msYLqvcyJw9l}^7bK;+Hc;$iPBQVxOZ z8$yRP;WWiW&bInK&mkO#m$wUqB^UXqR@<)3#sC=RZG^pO#SSMWeWIh>s~TIWfiF-D z-?u4B-WGmSuj zCDN{_X|V>`l3BoL7wy{zb%tggn-x=x{rz0J0()SgsELL;q005e@@ZpjX z)`n}jRMTp$lYLBqskRLX^{9S7xk|`w}fL;B2^XWfe9M0i!OkBhf{WlPFbBeR&HD=Sg`5>#n4x}WHRy;xh)6kR56wkBtUh!e zP;Bt;{6po>z^G+-?J@M$hyL_EX^bBOIOg5UvcdmV^RH`N>F+7Jp)iV%8M6>%jaNYQ zzo*fM2|deEMBjmLK#t$F8OH_PRgtB=tT9Xkr4faO9=pzel95tN_j|QN4>NI?UMa_oJI(^vvvIc z5}pZ^M&4Ck{bKAm-I@l}L6U@i2EyXAHVje!HK04lX**KQh#%B+*}lZ;Hw#Uwrat-3DXUHRk`3U0)PZ#;+Q^i>%sXfV%g z&QiK!ElAw;jh6A%9Y4s;2BqK^QpfZpp_(2b09e`&piRIKq~)bNG!y!xw1(-%Q?T=_ z32-~?E6;IaNEDx(_9W%+C6Nm)Rj6+zkyOX;otxO0001cNTl!p z6X5rJ;Vl*lkv@Rb88GsMO*S(?LJTl+^_3m zgk}e2%kab0U zgQX%2)#?;HMtL(*$}Az)h`CeL`hqmq*lS~+Ggcm=DTx4xuzIh%<}Dj7o!1zS0mC?U+ooPqOFbX!yKjl^C| zYXI7Coj{{`>8RnfVNbkR)k{dnZJv$f;(wT_JFn z-n!FtTA{9k%FvK(BS*#C)$aqnTh6lCqdHS-YX|PtQmS9ZaQ`BT1UNQR~{7Te&m5cjagEcw)0i233AXQQJFu~5C7p|{Y zpYU5Ys*$6T?@qAhBJyRmh+)y4lmEkZd&AU@+{BSC{tI>K$k^JKGMnanhNixEpN=q9 zHr1dkx0<5`h3q}-60%`Teo9j^DdBQP1pJ!&1A4ePY{9UG*p}PrM@J98txAnx2)rfo z4X zDR694lm17>m~qe0T{qGfmFjrpN8p423pCNj`?nL=Z|cdAx|-H#sndTVij==o1)?Bp zP+b2zxZn=CsqVcsSR*cu1guH8$a_s}&*FRYyk1k9ADyVDBlwkLOYMmM2e>h3LTnOJ}=P=4D_(0NqHhV$L&73YHYr6n84XAK~@)k@` zJ4to`o7y5gX>C|LBQ}*6HZQ2ylK-LJ&!;f%mgbr`7%PLex>XDS02jQmzig!xO?P#g zS|{Ukby86qw$HK&4@yqfp|xKQ+9J6ztxMinx4C4!bd;KkYmyT0AkJY$ro%^|oeuchz|W%3t0*rW7_b-385J~VUPWU@b}$!O_- zso%oNhdG~>Vu9aJGbC+;%!4m@Y& z=3>F+<^v$WIU=XonlgBo+R4p#lYvvrXYupae+CeHyo?|^_ajvW-JpgVWk-2D-3j`)j2z8Lh5pPX8 z(}=XVYR%MWIbNXg)k-aLmb8U2IQ4daWTDC%0qp|?D<<37r4MH64{9@HeZicwOHrt= zixE9B(0vj1nF8}fkNradREh@1&Ian5uETsFP;xA_CvvuF= zCY@pmy#S@t{!I74q@1IvFF=CX%Qkudgibr=53K# zUGGrzFc3vEmKJFrN5;^HO*qzOz-c!0os`Bw@hZ{`#6FL}sdI|ofA|YEc@TPKM;exe zTgqo*+BFVP&Ib1Nh=g)3W%d2M000000n19zvsAr7_u)_Gq3)ZG-k;MrYMsxWq(==WEd3P{+ zAcPa8F=txp5)H@v1zih$l{9F;4KrpC7>?>NLwyMp%UQx#0TI~fmY4mAgd0`A_1ttbL+ zL!Ns|=-y2o#If;H-`>Y$9YAf>jtiH0VRdrhEQKoFxJJrGEjJW*yx09%cBc>An%YJO z0hj?(8m{ab2~-Mpt*&3CfCfo;i&20Bw9+aE8Ja&4xg{V58Mwt_R}!zu+6`pm02>(! zvagM{`wFCKL-k&@lj=q&#QeB(6K}QF>?HE3X^9c9#JwT@o3w*IzuR-n2fu7%`xsG1 z|H`=9#&VkA?Q@LA<~oWC0l+ry1HvBR^zPVD#7tK>GE7EpM+3};I=x!HuzFJy8il*wli#YcZz{Gd z#BJidRoWhczM{{ko*gb$h*d}FP9m-DDC!j?C0SYE0n=Kbuh(4VzyJ~_g%hp;e^j*P z8jcwnq}|b!8mAsm3Sv;})!g)=i#z!<)5(k+0}ft|2BV;qZyS+KD#RMz2e*lcPqx5x zuFI4A=k=_af9nQ(EOjl6sBB}HbFH4VWjSQhIGH4o0jmQ2V>vYA>!8m-mm_}CNhQ_p zV2gdN-OvMtMF7OC6~6HHsRZQd^$_k4Qys7XUMKb+?_O4;@#(mnliDZn0R*?}(Z#!|1M@1H5n z7@huy`PQuvSuKS^BLr5f-H_Y;q6=hI0ADYQ05nPz+`Ma&fT(^uRFo`_PT8HF+;a>5 zSCnf^kX}E{d$w>rX~Mb< z!X}I{4Lh6sl9RXx!H)Uxgq@2myfjV-PTPr!3EQdfBDW7C({Pf(-`%5vKa1Zd?NKG> zpS~L{=n!r(T+Ap%|W z=Ret~Tuk3XpvC3)jKz%4JQ2K9N!exvh4IFKSmqfGyB9~AlEJ}x7@Tw;ltWlVcLv=t zBBttR!m9Uc+X~Jq+?`lpGISVNpkYN&;k1X$#AL<4={#w-sMHlt@!3ylGi*?*8Pc(! zKU|;#py-QzpQ*PfeccE8Eo~aQ#L(;gR~f9lohw3iL8b}3I7;P78C!NqzE!hu(uvbW zJfzK|o%&}N3V-V#at3$*K>)bae(x&BYm$gCP)2)LGOizQSK_9sbrV&!khML*^qr#wYRNUooMU_J!9SR zKO7+u!^0WW{$Uc#kF7b2YxSaYz#pZS4cx69LKmY&$09%wt>rUO&I6cxZ-+zpkPMs@%2*>xl zWpV%q-Pe)#EbF*7j#746pL8^?#|#PehW}ZXEm!-xrJn~%TTk!|PoYEb9Xg&Ck=&9& zPe%@}&1O!+kv56Bh~8T})tF^fg!?Wb?i&-fmJ$cwZ5H!)BdNN$%1zett!e~Wn7|g1 z_D1~*c%%Wg)>X$@IdM1OGy6|r!zl7Rs=yK=!@1HF}2ASx(hEM4B6`i z@;nu>B*2bLK1#y8RXBWK-9vZWt!cBbsVD{F9|v%z$g6y8=Yq&kwME;dcFb?k3WYYf zF;!GWfp`jdtctMgiFHaaw4t!*ZP@8f8L5~6dFIKb{BBw@-tSuEq`Cd*$qBbn8caz^ zfjDsGE#Sv}L4ayK(r6yxcZuK5C^ZNVslYVUhz@F5mvDA5hzM z(~6-g&pR6YWn$aB^`Ow8Ehw5SZG|Lm>ND=JP=*)&A1icKveyK#E7E-XgQ~UK>%Yp1kIS3wG1yu@#-o3wA z!TJ;cO%dpb1C>PkDGbKWlx12ocR_)Y@fK9YGK#`0R3wPy`7tPnqOn??oLNI+{4+V3 zz}!TqcHJg?@<*{*{IaFBr11IEqTNg==XzA$0G}PpyXol)wqPlD8xQz(HvkO8xt!mJ zi3pOFalOncm=Nprsh`zz)c1}aj!;~nw3rd`N$0TdO-i7gZNKH~g&41^c>$;ZFyzrd z3Wzhaf_02wku{skn3Uf8UQBIMCik9#B?$!eKQuT$q)(HF9=c|NLr=s5;RFZ%>@&>c z;!fNV?!X;N%~T0lqUVUDeMim>3ovk=oM_P^7+t1rl^cZrjFGt{7H^}t{fMLI{{5ybmh!%PzD%7QIi zRo4yVls)CF+E2%LrXT>sh2h6}G6WovtA_Obfj^)Z;9y(yO`~8yr~&&I+w+Bw;%KDU zdNrTjC_b>wkwp-@&wUbn)_*JV5aG;p<+p#?JBHX4!HAzVuWP$y4?b&siP)uOjOe6( ziP;`HubtK5K@!Su%gEgu;Sc};;u_~+f&w5&H?Q?}j*VGAs$(Biz7FU&8&3!qGGZPk zS#DZ-!bh6D9ddsaI&9l9^BhA>?9dCAo|n$Rt&vkRfSmSLl!BB1i*W}V2t`#bCwb}* zCkMr|yNJhfJuNdl@pA=}=vwa8kI}PE`LeBbPHrA4aL0|0Z!P zOVHd+Wh;6dkDx!>!NR65n3mUMZ(goV=!35(^)#Kl7yPZH_x2rhDimZsByY852xErdtw6?h;#&XRrJN_49^QaJ2PZLaNqg^xSGQ4OgoDn&GG%NH;`Nnb}NH5g#E8Cc8 z;VK?i$l>CN6Q1giRC#`%mV^UP`_GXVu_g_Soz=7XO@XHEYTW-q!OQuT5g*i%r|d^N zOfjtP4{Q^~k>J4SZQq1^)cQdD^P#T+xgKv;hz1!N?!gs9UfAryH3pkJt5)|I*)Wqk zT&|25kzms2Xj(<0vdZKFwe@R7D10aZNrCO>^dIE@zo3y4r-z9j9%J@&g_SDfo4M3Q z-~a*nB3&JYv|UTK)nw?nlRhG$2v?4w{Dz-I6*Fu|*~z}}Ef_OG=H?OUtRZ=#HD*gM zYwpWX6(|Ku{^?)C-((q8?LsetrWEUWHll7r-VpPvR)GW0Nm|h;at&d1nG}&?IS&LD zHupX-zOno$$9bUKJ#ISJ!FFR-s=gf>%=;qQtWp&{Y|xt#(wbrr09rQ+Pxpxk=jM+- zP>J|Op8o!mxAchb)33Z|>RU6NPyn@)?wJw5W?L`C@r|C&nY#n>FZ0+dmz?aBh9JA2 zTk?CpD&^eZ9<}x`=rh;uZdM;8A<0`mhHXZK)1dMWX87)r0RAXq{+zcm-T}JC^7ZYA z?JKodZ8p8oe$I}8w(87(!SU`(=K1#cj&wjr68gk%RG(yoJ9Olci&SCPbvANb4?op= zTvGwE)svUcP5OqsK~*0qds3du`#I`pdv-$>Ca6w$S@2e#ei%O5rkq7VDiAcZ57~l{ z*cu|3pEp>Uf++cu_VKDc$8jHw1S-=00)VYS$7L{j#`FU zj4b+K2+lDn8r&}z9F9fC5SlSl@68~kZf-=>oTGSRR=q~&zh&iW^*>R1&9l8b)ou20 zc}t7An)I-e%^ug9-rMl#rvFlP>}TJ5ki>;>YKIsE?SQTV?Cel!hr^pv$G+{m+rR(- z000A7&XKSN69TqVY9W7oAnjHjk^E%6XY!bR`t4BRtwz0>564RBs|Rw0RhC^Xv*y*61d43Y+-~?0Fi)x zzaQmPU&OnG>&+~2Kl7s5Y7FOfG-zLzgim&LMvcFZZH<2TYiE>)cz^R0?vc%$jn&@y zy6T_ga=SO-iFM+Ud*YY;$#sRWGptBEyD64Tbuy>~_D7m^@{nv@v+zygM#0$Q=Ai(N zl(nXqaRu{Z&>qx&X)rYz7d?N;KzLYIScljg6+%g|9bIFLV?Ta zif9bMBpU6*2c9aOd;oI;19q9(qRIp&>@d@;|tBEV^YgfZUAKT|7i86H|JejDxGobqf55b zwNmQlk$mUBU1qxstzrnO`#s*_X%C(uEEQPe9P!Bak>y@dX2F=Gy68M?1XZ+Hmj4$m zWc?brmBn>XqveBW{ZXF%gHm8%_+{PTyM%|pLlUs+N0-su2K|ou%mpz z-5xcZW49Y;Q%{CHb+mLuixmbLoG*Yb6H+-$7FIqs2sHko5Lp)2_kIrb#eL9kVWW0`&}sG%vF_yZL3uL(*<>pI~IOkLjK zUING&Y52BO)`?CjA*3G7 zl;D)@kxK{ln_{Z!h=+8v|92ZekJ@6Vt2h9mIVyTP$3q;P4DSm~1)X>^AdRC9Gv{-j zL@l%L#O+2k0J`hH*_oE6sGE2xfx|sWaJ@ff!$N8SGN6bGPHZ3~kqG+HVI4|;o24G~ z0=-w%l^#a+Qw%`pZjF?RH%5-;9;-?MvcN%$oi+EIm-#g4jig;E{17 zftAXN4{?v-GV3cu|&&;NerJO z`=m%t2Q{p%-2l%Q^NTP%@eT01`+cLoG?4Cqu8U0F~EP+>wbd3yDe9za$Bg7J@alxcfpymtX?EHM zHufDM`ZU%saA|on3Xdm(f#MN80kPr1)N$G=aIu2qu)9ai?OefN)v^n0;L1%WD7;yR zDut|^>d$qD0ae{lP1pX)Y>j-V^F%^tIC$iu0}W&YbyEbDv<4v)>FH~AY3v~9_rV76 z3PZtdyhr#lOul$9cx207aJzsdPmiJJ3U7n$u14Iy3)=W&vj55H{QsmqE^Li+o8kpm zwnG2{j)%gFr2Hyly=LLD02_nzM^jR;1%5*tGg8Hb%;JI~y(k6I#Q@pc>>bP16=gGI ztoN135T8D{Vof|K&`wCvpJd2^e$+5gP&(O?crLYDxqftyza<>jWHwO&ucoS}6Stha zrLiZ=w{kUfe;oc0(Gye!>Jn3&AS5xP5rP+6GM2G&e!lFjiyUU9C2;Vz5>QIoo5$iA zZ*9s-{>7T1Uuxfb$JP}$UF)R;A(*iyIH$oapnRgk-;~yrPi4IBgV>X%J;quBryo5V zt=U)+x{F)4SZpGkfTYR8zoqH(zOkDUTY9>sNFS0*fyr9VnULU?wJP>(dskC|KmY&$ z09{^W?>HB3+F8wvfkyrKqf@etBHY0wOq>i@f1VQiIBt3so)%N^R~jB0x}fi3aaD39 z=$uUusz12sI%g-c`UlDY2q1N|EAiWFDfnFsJl*;!s*(zeBNohs%Oc&Syxc>hiTdIz%erAEjycMfdyR zg3X7bFb6Qsaj@dae6+ua0kIJYfwBaHybD{ru7Ja1bY{$oci43NggZF|UJx`DqfLYp z__a^VwH!V(=~v)&QMH&6qDlM@sQeO#foYL_duYSZyj@tMhPLiL?&ta}r+9{S?)Hxq zP{MKwwT{1iRDEiETvIV&T29||FiVA?$I@F3`<}X3rUiLrk}at6M#tY`Wlt56PUpF_ z?9-~7xNPy$2;Pc?09}sU=E$z>WJ$>ta40q=_7|H*DDf6SuYCh1^7`p_chEypahpe# z31kd`WqUP}at7agL=i-+`;$jIgp}TF=1>(D25|Mj#(BqV)EyW`PK#KpXsl1FkS`Cd za81vDJk_|ZxF}M*h_OHw{8ljPfS(mgd}C5FFc4tG{|Sjb$_CVrSOwPdzO-eS1{t18 zr;Wc}upSaAkY|e-!MR>^QA4#K2fi%a?j`=)si0%26#JI=EFb3f{wm4y0f=lK<(>4y z^Sp!+t5=E_6I8CE;t@Kr-t9R>!8Cwbsvb%42ZR~LI*rHSsG3(a0QE+f3@tzgFO6fJ z5;r?A&yJZ!F8)+!wMr}&5FP$~r-1qaJ`E0927`DL6fI+SvwI#X-@qi}E{>!_wSW`1 zv5mVO)z9c6^{XGi?LmgUzZDc%Tnx*jb`%g3@j9O{q-&8r0Bz@Y8!Tif}u`SEHGwMQ^ zqb9SVt>>4miDC*qGQj~J!*}gO%rWDtVs6i2Lg$c7YFs$+-kE#tv1YI%8LZY^Pg}NI z=@%HrJYl5<4klc->vzfEx&%X@+E)pAqP@TX9q!m52Hk6f`j*n;9Ua+5J}pYVqjCUN zs2vyNqGQ2ba<9s7=HPCzGy`zOgiw`(6f_k@U65y9WATc(QTCgTLT95$04JRAup$AL zU`O|`>{ZWzr0bBBwr9;>P*?&2-zkvhHJ{*VjH$&GI({gTMHf-}BiUHzm zpqIhdTff#-WA2*jL2C55UKe-J7Ul%F#l}B`Ov^Fy12i9KT+T)cB5Pl*{!Y-zNK_?5 zth48YKUO$X00jLZD}w^CLd)u)QLAhU4_w5IgbzRIO)0)?|H$+WXShMGs~PzM{(>y~36nHew`(Wen~xo@Z)`t?*I2eT$B$ z@-?GKA==qx^kEorpAGKStwl*J4V>O|XPrOwKE?iUZ`4>O9l;XxSj)#d{IflrT7nya9C$y;Yx=Sp4?Svu(y$W zG&Q|Ii->TpFS$-oiImeW8_5-mxqfq<$f&WQ01`A7a=O4{>IarI`{aU_06RQ+6PHwE z000000HSN9UqeRs2hETR?b zbk~PlU|Yb_Py`4}6RL>N(PFZ2W=cN(sdL!X)MpDto=(pk`S>9DjF%ar_^&Ed34$ImwVxoiRN!%vKjeLhoEm$hLqT-hR^KEMkgD6|$ zWJKeV5*$4MS@pi{Y*ag8Z;)1(2(up36vzg@nPwF>;BlO1Sm1W)JVd~_o?ja@L>;m7 znU~>AMxbqNKYHK^R1$E~u`VJ@W>?0+=hVUqiK$PbRq);N;0F5u%t4szMcnV=Gwe=8%GS8FRHS3!(eH?aGrLS|n#iYOHem0>LS9x2C7OXAz`#1LGvR1f%O1LvdwEmv{HxU;p=by}k#p`^6!oJ1!o&=Mmhv^~N(a z?sK#zV~R!ld0Oq3ULESXr=}+C_7pC0+C^T%zo~kA>ZZIc*M^~_$&Yifr$?!E!EW@K z!}blX@c`xeBS)hq$s`J#khB9bHWQvwv3uX(00l(`rR%}#*a?R*Zx|s{gZ-V8d(bIo zgUa-N(K5nIuUeTJa07cAJiJM}5*0?cm*2?8L`=^K)~*3>_wHluC+DBRhF+Tlu=opm z{<2;5kQ3omO#vE=U63^lq|+1@Im^p_*je zbeOu??0)+bpi3|ve^ygfn}b1>K_Ge*nyma{i(EV~#swM4nzOI5TB6CnC+37#HZ#29 z3a0iK4Y#bP*)TY{PUBx;Go`Y8Q$cfC>v1&ZE#dvRLFm!GNtQ2 zg1{{!i$w8^Q0lAvNGoXd80h4Qb-5qnsLJjiuAOR>*1jtbuh04=NTnKKXQG+M6OfcE zoNy4s;u!q5tZta--Z@8CFM^{y?jI4-^fUj4ts!B9M46XhXKr+Ncx!ur zEw`%g*zvg1BTvTh6+NWZ`)u+oPxjT!kSg_^Z4wwMtdOqFJ-_B_3_|8UjkLGpk6yPh z=-dpP6aneFq|cM#$_}VKlRne#)XlGpwIO06$Sf_X0|G?~3r759Ac%vj`HzZ~vV9=~ zttO0=*W|!!CxA+>U3t?;(16+I`LnuE8F37WLb)nI{k=k2NR1@Iz7S3LlgpwW#9g7e z!o)AZb42H96)cJFT#cwmsYDsZltn-&7n>&Z2@!s$iDnXA;Y7ulyiI&&j|=b-TbIE@ zxNb%DbSMrvQNoF-nM(v|enTrFjOd;E&j_EaIJ{RxOV^0dC<73^J>;O+*0uByOxT{c#4?e0?mc0g zn`w$56A5Ba!wP_>AxJ38I!2`uNKkSoK7sc2LHMh4aH&#he7u)LC_jgp;JOD&Ri}$g zRRO!?L=%x6f+si2Q13cOu%GMd9N+%8Ni!9POrX+Cqe`?B$LA6isGHqQ(aP2b( ztkfveXhVUBBvD8yzBLKoO+r8+u@b}MW)0RtAZEeBkO2aroafuqfB*mh001?F3>Lzn zNkLZ_oO@q7QY5Ql0;qAMVl?suvDbUF(ysTi$r3@pjld@@u+9o-x%4kFx*Hel>2b8R2I zytpE{O*@(?`y;h8jPYtj$os(iLj)GICREC~y~v#bcsCj)engE*UvW}H;ZverXz1Ou6A+P{)%>pfFvMSs#RHdUnoZLpMj!+n zWm+^+G9BSzjQb2@Jlk=<-1~&MYZPLx_9V8;F00SzX`={RO%h_&_4i#YG8RV9PpM~+ zw7{c?Lo3ZUUo{_hjwzCc#F4PLhU$DNqquR(mKn!*8zg-Fw^&TjYBKi3U|q^(nM>Rs za`iy9iwWvY1|3p@Vj2j<=YT98#$A&A^{CQbW*_4E??6lJrS6<%xYC6}6k)SjyLDq7 z^oEh9xfF|vtZ#h~NM3+)6q6w!odf^8C#^2IWp>o!QQ`sO1(GLfEM&m9w3}n&35+oJ zf1-~mrz5zrb~um<)m2<8!GvLle5G(@^O016Rq_1N4pK0O|ClpaW4dAm7l?B(U-0-W zvBvmaWV=Qbq-_?U-mfO&VtLAcfDK`HCG7rW&2~!8tmV5Hx0761vZsFDtzZ%t&|oD} znu!Xq2ec?KgNOwOu*u0ZoS2Xu!NFFKQ@3RqQ9kfHwWz(Ky?qFCec$!|=r@LZB*}Vm7EHLo z*wPbUdsn)}eD4W;G4~NQ?j$%eX25VHNMGIM^$E4BHYDPNZ0I?Xqhf$1e_+PT$-cK- z$*xF=iGmHS(8M~jHjDyyOxOSbDAb*qS{tl>frqtUN?6NJ%hDnAVxGTLoH8K?O>>fq z$}zC@TsJ9yH#=K;$to0m`}1=TnX{h2`J zpGEOV>Asvj|5^S|xhPjJ6RZaeF;mu=1w)A15TY64T zDWp-#Ft4u$G@LX zM*kaJun&fQ)TU!?Ldsxn9);7Ta^LW2awXy_ot6;&bn*((cS5qsPdC``k5(;71CZ9( z)e|5$k{|jo#R%9SHeF&q-scDafKky9r5U&)#vY_m_76%>wHYH88WzwJ{4KH|1h?(- z*x&#F>JxgV_l}yJyx#K)SXz)bM$WcnO~z>VMMEK6IFf3(Fb5Xh?NzYlJOsIwc@-vL zhl|Ipb3C!W&bX93k>=+J z9)b5DsdSGZipF-gT)w}sZ*>^OTkhJba_4EK(A#M^mwv4-BL5ijGXA8}>t?mjKR-Lf z1R**gucfPyYK(>Vp>&%)aDXtW@GNmz^n9Rkx@zN@kq}XmEbyi+*0UnFE3}Hoz(R!- zf))7*F<+|1XWn>8@^5Aot}DC}K5vs~E$+GV*~P$F+p=o)UnVIm(Lu-a8lR^aroBgS z-Kngm+V7y*lm=)!$*js-x!KAgp7g7aeuK3YFK(BY#=Cud;Z35kr&i0EYQ={f*$Nz1 zCV!K(CJT$K8bZzKnL1QRTk^An^iR3gmu12m)S^q z&)uoLiFwqd`HVBb`uUk1|J_I*7i2PhzEhYwb7iT53}_B!d5UY=2F>>1N59jlE=2tl z+LNn-f$$;Z>o(9ZuxRMx7YIP<;*tb@OWg27WKM1=Flw9DWAF9cOzb`zQ;j=^BD)tA zj|B)u?ML`8%CNVZAW@5-vcAjGa${Fw%NMmyM@%KMn3o9evdP5OiZ z8pYd8`t4uCms$Zn;Rrn+jQRjoYk=`ZAJwt7U9E~ zUd&&q-gk?fS#D+DCm!4q`R1sa)W;3H_oe!SM(eeQ?05#6TJ&P zYwyC1Y*v?66h3*^_p^DV_^JLVZn5B{Hi160DY!} z4oPh}H!DOi>@^LnQUD&apszB@N#>*O0%dIkE!B-NrW&^=4Ru$U%|F#3o(&S8HMB#b zG5^zxgW_e_o;u(DoMJ5EU=|5UY*nSa_?Qr>funtusy=nr1aw26un*7gVoXWOQ6jAe zn1HmHA{`Rx1mGO%2-Gt5qrb!ua)rX%TC)YDE%0Mv=Qo7p8rQX8;n7^V@>eC^S%=aH ziE_O6k`UQ3ku|fvAr*d6!}mE$6l(NhJ*#R~H{e?0I;nDd5}CXR7N4_hAN>zh#^9^$ zk@#9S1?F8bqTBL(dLknBqA z3I^QeV=E@qlf?E1W`o7DT7YH86WU2<{weFh`-AW z)!+(IUq{}7v|NNCSj}-peGf$k>;Gw=ib-m(mnfAHzHLIbTBe#lB4}xGB2e@UFE=-D z+Ts!V3th+rhqyKes`MpQQ6Smjbe3-XAzYrSNZ#DnkFU0ga@qch${MjKVEz1vo2$mG z%Ay5R=w6U#l-0aEnp-dgR{FNEp+(7@PS~j~=T=M`D8JoLEgM3g03wUhJ6*SOSy_uH zg%^q;@|hDO{a5gJ>#Q+t&dW`BnFVCWD9=dL6;%q}Z{aeU9C`*nzhv{=YR;Jci8$F9 zYn&dkc z0x_sg2m%*vf8_^FF-wg)&_#Mh_!g51y7dIIcZAr#w|*-mvkvyYr6JCTI{2y`O=|ZO+RVtUZCg>a>lC@NeuWbrcL`MY6wg^J zO1DG=4>r6s|8R6!>*`q^B@(BjPam}1GttW!Gvw|1u5g2MpExZocmVzc%M0H$Si-Qc z$itWf1lipZ;D-1m*y<>OfYzNFH9@%yE)NdfcFSB^X+o(X+tAbAy8Z=Q*)r3?LzQ4a z>N|4Y)u)_m#-p?nHi>BTmhU*F8+u3#mCU#Sg0Yu#6G_6fPz2bkjY)F*p$$2PKgmz1 zuWX_8sVO!vn~%{d6K7V6-67#7^^B8A= z_46`8XVW+mu5|%9DcEo;$RUW+y9VU#N#M;~ zz6wD%e7t!f4Y9WJ^=R7hJ!~6W63OW2ygud(I)KYBl$w`ooyxF@^%6C=#>eC)gKCUw zebSL*OoxP&Ym6WQB_pIz<$+_;PsZE!Ws`!Pb<+}#UY-x`P&GfsTk^lX;EK14f&xbm z1JZYZ0000000GKcI8q~C$22R`AmMxRkU*uyTh;{E%FzX@L!j zSH>vvHahTl_AQ+F9e;W2jW>#aTFa7koYSSjYjy4-x1{F^dr->FU5#+FU3%Pz(q8^MQ%6{-L{ za(g#VKjYF8 znLE^FwK=ObBJp)zD!AgW)W+8x5t-yuLA90+#V+_|UL#0~_=TJ4 zk@7EO>b+)SI*x9|;NKU>3`s2ZW}01tvS=FH-XrrCiu4#w3zU0_X@CxS3{ESxA7UKq zC7*^CoT8?-T-^g;T>3141?LadisG{s>gGhPA?$Ere{gzpC=5Ngh%+(chJEiDvCZMR z#;Au+?8{3%jzu&==(oVNi$HqtZdWD~s z1ATk`M)DjMdR#KqZy~aQwqHYmc)tr9J5Hh9y9KD^v~vwLbi07wtM>gBqM@Wz=SFy& ziiI?UTBA&<{{k6O?U0rE8;^~D%>LjE=ZK&TmKusL7yI%pF7{H)ec%(2uJTUNkN^Pr z6f|&{re!((BH)v-E7vmtP6t&;9VS$Fp>ji^)@NS*k_BX4Icg`K&(Rt_( z!8BL)(LOD>%EZ3Vz0LP1FXocIVRtPh=tONs=kpK*5z#~KZ2u_0uQ?vpzK5*OaKMqK z-2zdnwBTC8LGUQ@7#2INj`$l?F; z(*;4C^Q22PSL&IEbd&x#xvafaKf? zwHdoZ)aV}%pnpU?d}Y)mqE&zO+fYkmIl_c9AqfjnG4{m;TKO8b`hoRPb<4wN5;UXW6k;`Y@B1g;#@lXqSzO~OqIIB44+B|0WLef|TG-!XA@kkre7CR9fH1V9?rDfr;6%koj1v&ytKBkf(T2wlEAe=g*#4M&Jo6>ws*RB8HQ zALwDMcr1C@Dh&3aqA6I3nPn7;paaxjSILRTdqn$7O#7`)oK0%=?HdnFL{P*XB13Q)dwu1EmO;76O8cVu)t$i3KYPix;wQr&coK zexh3NQJ;3g2}iEikCKA{fdr6no@bLNBGp#6{fX%<5`pm0@1_yP1mXcMia+Z$hvt01 zM(f08!I<=q5@+`qJD=vA20RP#lBo)DF3uYXt&Iw~^HcScAc}y-nxnmm0Fgj$zX!4d z^=t87y2y{5NRJZBV%5gA-|nco*gs@@PtGhzhhV7vmb*LY8xDxdG}^F!KXHVn`bTpuy@oliHU`|{&>nrwW}xEsX;9g5r5&Q?{-{6#I#s!>m^-v6^Q5Vo z7yK>T_QapD5eo39TUn*C<-jn?wtzS`nH?c565lLpr>I=UnzvyZw>DG zkM$LgoV{|XsU!0zz`&2`ZuH-x5y^byKYb)@p|xXBJBq((ZpB*kc{LlDTN*Iz+HNwZ z@h4PBvK;Z*Q)Y4F8e6H#6|;15LBxr89VkvKtc6jk<2!VRy`p0s0E>I|+C{tefiEd? zr$pA&!NYOZZi;)UPAgvTrcUR;Txq}FuIK5;lqtv)c4Jv2^uxTt&cE{<39GnWlbpY} z18n%bQn6?(eO$#%2-{`h&sq0kx^7Nk_9z7nr0{h2tpcS8jzP1jshNEHfGv$;VPTTF zw-=H)=5^uMvF*lqj^W1!o}iev;-6k;Zl!pq8c`RFi1vTc-~a%BAq!{d5zT{ZdIi2u z7n%)YHlhXhr07<5laUezbMHU0R{R5`&6J@vwJfi%$2!JwB0<;^j>Ip|C(9u!h61+Z z^5&*h&MDG(xTfLCKVo3#SUUA5fBxT%RYKuiom;$Mr=6PnAC_2#nWgM<$l*)TuO;A` zDPoDSudviq*C*E@ZDPNy-Bw%A#GcgmS`Bnfx%G}QJz_Ei&-zOoU$4#HkK-6duQ~)s zXNEi#$x?+S!EEF_54s1u{y9aWpmV5RZ$@yXK<@l;Ts!5C>hp;_0?UH;c5Nc0r0mJ| zdkzKQ{g2|yUQr!J2Q)NI7re|cW){ofes23D1IPmLQ8mu9Nu!B3H76GVc-u`vo5In8 zFNlg?nLdTOZ4BgsEELx1qr~SJN+}U}g_iF)Z%PmUPDFjC|1aKFSq3wTQ-0)RfDlEU zNa7}3QxhiC$n2)ze0Hr#2SX4fG&Nxkt=~@O|2**zDbW!OfC|69+al?02DfoU)rEq$|B;lu)~nAr$rpB+W6{kc zUm~pGop2jdk)0rin4-u0CL5!1!AV5(BrT6+qW21`$qh{}q(t|LPZ|SI_YHbwao{qC z_bR*@Pt-RhCsAPk^oJd;k9SVmehQ!Se>~f{?4opwb@)`y?@TacPRjiZ7ggwC00000 z0000iBYQ&g%_~DY2Lpd9uQK<+|BIr}Oz@7@zbjIfsp)43fndqEo#yN~_bh*lArq}x zAriivup=CNthk~>6F8f>8l{)cT7DNt8;W>zrlGJjC2VAZ!2na@!WUq9P#jM3QXKUO zT5G&&F%3&l`GY5(Q>}+TTQ2rJn5dR}YzXFEC&{tqu5KN$$ifATM;Nb~pvlRP7%)K| z6vGtc0m-KFeVYNLK+rOOfk9mNP@bYIgRR+>*ctx~KeBdzBCL?wIII5B-$fF5+$V@! zhS}zwBB>IYvUOzF*F*@{4OR|98Bx*)bh7Kdk-;cIEL1&ly^#`GQ2ptZ4=Zd}0BO)v zd)<%`1+^5<@sU5dq-)I1wlh-bpeavTz6E*VKb-#)SW0PJPU13 z=*Ww89ICI~-2dYXkGn1&=L%O*%+1hCO+B}!z3`-KS@#QNWEmEBsk`YhlV*Zw!T;4Rs+d%6>fsxI-SCCtuMv=EqQvuh`v>yRLKd^}UZ!_>!?8NI0Scaw{yThdHlj&*%))r~rdY zx6H|e*a!0Qu!f-cbe7!)o;$EPfZ7()7-*gaYy}sVr!rlT$wJTS+TP-BZpGAbRy45K zb7&&;k;rt~zk^M9Ju-t}PbnHs?Xz*#WlHl?l1lbF7&f+#WB$S*?5R~ptP=YCeXLZ* zo`6mgy^C>n$bHq$$`|_cStdx)W*AGJ-Th#oJFkSkLu#^!eEUumtk5?_(dXRSa12@& zQctAlm4AQ4m58%AdP0h}&5!!rFkY3Lg-D)48zc4NK_%+%nOoi>^ZuQ3_t@D1YTe9A ze;U;6K;{5&Gy)a}wE^z(St)bP@X<*)uZ6EPLSBv!bmi^j&rzwPU>^Kh!2k8_X)=b= zNY%%hO5&Z?4@0%oKMFT=AVFd7-kR2XG`&hV!9%I{Xz&$z2Xv%MX5%>(rVdIRWlJ+n zk2uE#zJ63)y?>N-g3HSnZS3~|N2AmhRC{nllFQd%MB*^_2(zOaKBJ0zmnemL8VD1N zLfxe8l#aJG(r2<>Qk<>x&I`z9%Xa5}%)EE?^e(Uf00V7F7ckf_IaboacG)2Y%hpmH zHBTyd7Pf`8-+tD%lq|zQW|{csBHGU|4si*(e|;gwA8AM;1g1p`Akn2O|S$7ImX{ zYBQS94_CwV4!>Xr@Y+9rJj=E9rKn?8Tel7q>Jcat%f_<9T#(MOa^D!9zruENkT3w7 zdEV$O7xaMif)j3l!(ABakNO*10fd#-GsGe&T`INJ*gcB6D2vnmy6@#=9Yl~cRNair zpC;t>!@!$rB7s&nl=`~A1oooE3Gs;V*uW#xcg}z!T%kd(_m}zt#WZ?(6_m-Ef2p3Q z|77LSGz|dB-Q`JbDN9G0$;@JMXFJ=oUq2fISqj9i5Z-wfH7#k$YkxVh_1Po6b+oH00000 z003Kv0*D3wFS~*!8c*WjC_V;z!89))<5zM! z#c)<<@Hf1qPUu?y^Oqd>=Lx8X4L_Eor%=~Qu&D8R5i(MD_kdwt?;iS)p)!-1wj4h- znosYahAr4LCx(W~w;GY>HG1WNxgJF|JgC)_8p(OnBj$`CTa!~apm0IR8am^M^9kXd z_ct|kAa26+v5I4TLv(6*IS{XNQ=jh){zhsAHyNihwI)`fBy-4=VI?mW38zK5F0ThK zePH#){8Y)_dU&9n4{PNu`cYG5936ZU;eo)katkeOc0>gpcd z<#KhVGFEhH?K428SxG&nb*IQYO%JfuxFMl zFbp=8POPbP1%TL`p-;!Y1m_cssr8c44#vvt~x8%OKS8^5K&jm9csz*?;C4-u8FHYT*dR$4}?JvPQ;Bk*p z>OJ2WMIUZ+xFvk$uD^e?cb23fveAd zuzo8JTljTlo04mBhKsQUJYkuqpOE2sOH}|Nl={!U{kgqg`kf_&_Z6FCgwV0y3L=uT z%a0ngNd#)Gp>%um7No3P5!q!UZN;PQwuB&_BOTS40G+$`E3Jijph(1LT;z`~(*OVg zQ&U5R+>I3B1ztlmQ9!{Emg-Y}vaefK$W=oyvSF$$W_3uN4!w`3;z0fN+SSd@rWpCD zsUyjSP%>k+RtTE5H(`~Ztzenlb&+=&j77IwK3<}m8mcxGDXQ^+o@kf<=XHd3K2;*p zict>4Ya(h1skoK$FKE<|jTYXQ4SkdEM)WWLR1dLRTv5wa#b_N7DQ!?VUmu#^AWtP| z;AmK}{90%~$$!8N%b3Ii*aefeD)>6C@uYBJB#x@U|E^qH8>Gf(kto|;X7r&r>q0<9K>bZ;_v3y^8ivwKLlfIB^3WE)6{tCD z!-1%MsLVEF`@k3MnLCAl3w{6fW`LVM9$T-V!pJXiol8G~QIk_IBozymwGzZ9MEo zYjsJ*7z{r@fQHj&dB6P}tf!gMLz|-Ca`Ggg>WK*vo_}$w$b^flR?e4KpZ$%H zMz5wJm=Q)gy-D8&dUU-y+Xui}-+{Frjf)&8NL{14rJ7NShR3A7H9QBXq;{EED@I`Z zy#GDL?uMb-gGnW+g)t6UYQEITaahl&@oE4jCAf!^b5 zR`}Ogl6>~KFt+H61hT8DAT+lb>}z zNo8a8wN@lOR)fC7{{N~ZoDdAv;Avv0Wk&H93KqLC-zEwB>-pd#Qtuy=fA0&N-kAL6PCTS(4ZK8U) zV^nfs%}d}BiGw6NF>{juL`E>EJPZVioSlPY>*kLT(Xcl@UqBtfDd%-q5~Rs+T~c zW=upauZ_k(m~j2>`{Fvg&Eq)`XZZPHWB4kN45x{E9B@_M(!|U5Mj*N+h5iAE;r#Qb z!HQ3vS#cavfjo7~q^clN64%FTtl(&7GwH@u)PmWA!-~4tX<8AYaK&bkIEPE!S>%;O zHE!5zYmt$))3k_G@&Mf+KX~>xgEEf|z%kS?$Ebm9xPEVj|NcdmmS-UI86`TUjM`s` zd8U0empA|SE!y%zXqt|H00q~a2e7L511+}`+Ac&E^_Ezfd)TH}mU+vp^UuUc@j1va zC?bivien*;x)_#JaT2g+kj5K-J~G?7e13A;npoSDCc3lP4HikQ6+CJ2=l-seoN~)w zL_grnD#)B6t_ctLWqLjG;K$y@#FvSXvZGOWP`vZ$*w804HKtgX&#u!ZjXn4sc; z8&CiRFvpcxj`zsesAlM#N1qXzku*|PysGZ{)vD0YGg8o}&~8c#PRvlTbCR3yE+9N| zf?>=&T_if;;&ydebDD4@19vXA{b5+yV3Fh)xR#$X)OOe5mv&Ww!dKv&~Wez!EK_0l37DM`j1VR7$WO~2!BBCMWt9J zH-}+slyRMW)U1s_HOE*dA~q2aYFloF(1#QAS}y|iL^VeirgHH;9etEO zDm_~uxYaoJ(~`jGO`+01qJo(0!Et%A=|CLH8)oolM@V`y=nnZV1)~D_PL~j)4 zr~7Sgmb1{&X5o+?aLYNxC?Pst8>i^t?`DI58^$YMlA<{2Vp-wiu>BikErm*y+sKMU zc&bh;y>e0oBQ?sX&(3ziv57H;_38IRH0D0@Ca9#gz4fD%e+5z_yQXTky&8w-V-DJc z(-4%@y@&|#M7WUo);VIvb>mJ?>OJs|#b_mVmh1T*k zwnK60M@8(rACNT&-^TE;oOt`_sRR^Uitp4hLy0kIxB$`uDxEndYV)CvC=hMbo+M>_ z7phj#Tn0fLe~e#$`$5dZC+SbU5+&>?ftPaGeu<z}2OU^U(cj7uQ4f34$M0cEdqbu5W$L9J8(F+-YEkQ5}H8mRgPc81NR- zvv)jTBGd7I%FBrU$@{x`-z53$e7>j|_Ts)gaWem1*8aD3v2Q#QZYj9ZWl^VeeBloX z*G34Bo4KVM;{}>Io~~LhuQL}6H~377NP^=~tk7#dUH0!9y#e6glc+94BKbW+@2B?^ zthHqB|Hg7XW=_P&Konf^Ldlc7RyyS|giXb)m8=ZFX3?#=!nu)l?nmV6B>^ClruFUJ zS$f0d!Oyh$X@z!_C!K!_3^&_q9c2Ps?8dPblTb?Todhxh>6^Cd6j_z!{OpnR!O|!{ zPs}@`Yf{La{&+5i?{=Wra!R07xycj_59diZ>v9ZdJIDjtw}VvfZ%Hp6t!8F-rdd$C zf5%%tXi1t2^kd&RO=yU)bEAx$xeiNqFtpU|WL%%a$-tj!tkMr`)+7i z+hHEgD_|}&4FY)QiW29xkZxy3O=^*5#IkKjO``V7AFaB|x`R}aIWFHzqO8^e71MUx4vsPhso|c_OONWzPECz(sU%(h>2d)cLmyn*d2aLb5!$9Nvm;lZJ9= zg2wo~GP4LNHS(}=Xd3I$q->mcsr)>PaZ_SCKthw{ek>Q|Rh zep%nbuPTIFmgkLsN*bjl*}8x*phzcCd@h595nvgUuB9xa6>lNKcB45Dj9v%&AdyKj zovCmx)XAq;zH;MqKc_8Ez22W*%ONCu6T4UNdka2L z<}z5=9gL6xcJ;w~^rJf3+Lh1&_bDo(n@LW;YstVeIkRw_oBdWyuy3Y68?vH_Ww7HF z$^T|TW7{@;@qL2cYnX_}Ov#@qCQSUu#8Yjfg|6TB1>ffJ<$O3z1_wADPS|4rwq%Cs zrf_}NFxTrS&#EF*h9=JS?9lnr^Z>$}8JvGJtELZwwNrJ8TVFv6^!!f;kf}p8Pib$x z!bLWCW<;L^R&yuiSKQ8C29W8bqYjz{;*6n@c$5{O5#dAk!lDqa*3;;CMyB>4iEuXkqIXu zm-}^D=$r&??i+TG!{&Vx;#ZwoMVGh--&U9ze1?JZ@FuDrnGEOMUqEgntWXw&3iQIn z8-RCa?Z>iNVSgfi`}^O~*OR4a`bu$xjR2f!cK$tS_Ed7_3o={5xMlGKFd%3?waMcH z*B-~ROJ5(c0f$8AnV~LJVDpNA04|GQD&Xv>8rz!Rg43OUmNPzyTBV6~GKZZPk0%}k^x30vf!#fKYp|O+RV1%Vq=ZYQF0oO&4jVSux zrA~uF(mN_}5UX?!8Rdwp0amEz3LZ8)*6&aP*yfLS%lB=Y zL@V%Y=!F6&NjQMxYD#3N&U(^e%Pb|2d027j;(YJzsag}t?L?~%>i8goG%Z_M=Dsi> z&a&PB0000000J&?o}h#jYrE#|{R9-flN~(n;BFi40dgSx{hX5a8U6Ksemm_+g13eM zNhbe;!Gqpr#903GlaV$cwzs=#R2yC2K*W+n5l7gd(n-Za9~&K#>%e=7tliYD9&D{$ z9D>pW04}ezQ^8aJK=^RZ2Lr7{Q9efa^7FuaKe=R0> zMV{@H2hED3`)r=^hiKu^NW&TT{Z!J3&j;Zko^%N}I_XW)MrkLMl)q+`V*(cHU8X7xlqV-_OVNPz9wfpfabwt><# z_*kFCCYcccV;Yit5D&!XU*nz*u`*jjhf)y{hdVaKLv4z$(q5J!ZPf3cA z{hJVsJe8kc(~qD_K@dRSXt&OS%C8EFc_zIFBoW8jw(a z9XAN^Tx&wHF0VKZR&5PM4=Mp{Ocbm`eO~1K9%8v<6wSR%)9WAAuF;grBMB(y1B;(m zD7T<5X_=wQ^_F*tK{q1OQ!g`yEdg+Ti0dZocE?co><6Q(AD1Czi@(#n<{J-Ge#q?g zL2z$;*j!lK$RJ@G?7kw`PGie*s*pp%QXldv7`{fe-du%^gt)TuPX>)$!=YsLEG>U) z>Y^lKY4(d7O_pv1ep$x&UNv2sKX23tUOLk=k9tr8%91ea-i40TDgGX{U7NOC&~8q* zN9G9U^jFNW5>G5No}iG1X5jVdX~}J_^6r1#fq$Kp%KjNH<-ELv8$cZwMh~1}x>x3>rk_E3OA_c4ds=i4z}nNMGSe-y zr#(^tgN#+qz(HWwU4IlwUP6l{hW7t0x3kwU?FLc@^tMlJSc_EKJuM(W0_GQCbuVvl z&UF)2mn8Mb7_&Jc3*{jHeYpQ1+=u;6SkRR|XeC8F!qaSN;YqX|74`Uf0L;D!Zld>y z2^gFEf3~~>STf@cG891Xs-(07;hf-n-8Y;zIee`jr60rN5DRiQ8muXu8G-}J^E^E6 zZs+TO_a?oi3&2UCZdu(oeu94HJah}_le_-Bwn+Fb#$7PN-@xgdg3D5A^qF&o-G-K1 z6ARnQi@Hwya{jO|Pq8JcgsNIZ5@PbB@SQ1z(6fR|QLpgtYe-A`3SOy z_TRk)(kcewXdvwQ)x1it)Y0#|R(@&P=AX_um7B&j1!CXBj0096a`15zz`72*6DWU`jyg}c7T^A;# zL4SZ8bN_}us?X=9hTKiIxS5QYuF3CV;~pqf6Ji{`Z(frS zM7TTDTQ!+m^;vCl-~Sx$at+Y?U#=7OtfWMlToqbemxX*))v!trSZ}(%J8LgdG(!9~&75}J^OIpC=R zu5&s$pVxKXAmbv^Ud;?5r`NQEnR z%lHXPu2Z)4XC&}kj37^)Bk##cML09H;P=&fJC#yqH-7apc49*fNJTW#W))YT>n`1# zQFp0Z$o4T&zPFdRe2s9#U+q1Q) zh?%%|2SL2!O#HoF0=d-E9P!X*HTWfASx88m*FGzS+@coXDi!k?h1LXMHLe*wIwBRa zpL5CJB`6kDF6x{);&RUdQcU^Zba7Q%Janydr6uqR)V zK;W`_TY%a48S0-A?*N8d7*fB(1)9dQV^b2feV4*49AWmLMDI0$%9uUlch6zv$!g+l zSTX01-d8mCl)I@`_tz1$8Q#LEVmSR+{Rv0GAjd;y3QqB>dlm76T-K(bJk#VJg*hj8(n=Z;wa!g zeLe)jNqB;I@fQ2sJV7fa##h}E>J!=6fZ($S*MSaL@#$;~egeq(?~m1daIamco)R@w zdN!GaztLqRQ_i}x$>Kq*@e}do(uj+L1}oH27Y6^3{7FIuZ`cYC<2G(v>K|*7v)^3D z_rNmMJy_2fqT_He<*`I`e2!Zj#ZUB)%xH^3iA|AF4rdv;G7}$&qboBH?aMjkT|}Wh zp$4rfu4gmo7BXT2_c}?=ls@7}!!yt*&>a^t*{8^N-t%dQpWaM6qxi0eC26}*ImC(D zg|iRO%$;bosMhB{d-2>myYbTdXifP&Iqg%k4P8efHg6g zq#U93V2N231_ceI&&t`D+rnNk?p}zW|5MT(EN6`99UxW?5sFS(^LRwT(d#FX!M&?i zKd_B=PC4>3`{K0HA7s{~?CYT`M|zf8I38lWfGPu!&GItIvAp@jw)+yKJMy~BCNNM& z0|lg5_0l&#)3{I4a9JMb3?Sw^dit#O2`XQ9x3d(1ixiV*Ds|&ThKX>I^>r*ppvAsm zv|)z@{2DEQ$(NNr9UAYJ%F&`EmX~*WNfBi+9 zubZyHrRbIzjS$Z1N_yA!2FKcaB#bJp4ukn=D@umk zjZ2v&U@3{ZE)M-#?(i(%vK-aw&HO4BZf;)nV;$#0s``6bY9%i~>k;i4HO5dIhCrk9 zI$L}w#pQPV#I_C;f!OFoZE;I&D=KUwcnB@rVrHYMFjBAV?^6tI^k9)=Z+S~+uyzSF_ zZwUA95MY)O2tf+J)dfFb;AxFTKK@R&R}hgdVhmvDZ?R)J-RBp(35ZM1k@w`H46{Y> z>ba8eGuzmFH(yvO|8~dQFwbej?QQ%8J2?Q2S;#@EHId9w0iQtH-`x$JXb~gpM{EdU z*YwQv=Mjl9fbu{&zF)sDn45S%QhQteJ(e7Rs_VZ3H9H^640G_!BagVJXcyd>lj4ph zN3@eo<$cG$@Z*V`&vFlmWISe5vbFV+5x0H}MW2LzG3-3GjLD5%Io z9rNwycnbzI?ICu*c|dSJW=l+vIo2WAI?A#G|HD4lyY60q4w)kg9uhC;79J2pxm^WQ zPvfyR!FLEO$c}vGyc75o>>l~S4M#JbnDQj#+v$L9ej<6{&Z!ke@a6{0$a|osD*LC* zw=q*sKc%LQFvMmSu55q2HE~^TJKIK2sD&H440He@YT8w^&=bb^7!kMS>>i&u#Auz4 z@zv@d?=V+A`>x^r@hl+HOM>o7*hrM(b8&w8{*u|Qn~?VY&-fJ!tYWx*gqwi*|8b`z zg2z6rlE}Gx)PyV`U1x7W4e%zNv?C@h5VJc$w`9W_&2NYuk!=iV`k;$#b=aLFiP!l? z;80#Y@~Tn+B&i`MCjcsFcGnvgO^zlpb3ffqRzpn`8+f(e!KY@L+mVJ9{uArKjRZQ{ zn7Yo=Sc%3Pmev=8cIkS{QAaMGI3e#vWM}?Gjo+em?~1koCtw|+-~Icd;6RHdYmvle zU;q*V@rbahn_v~L7zLGL#ymvY?;XVknHq7yYjaW9_)trZnV@3;?bE9k4R{P&qj=w@ zbF$uqGn;sUsPb(g;U1CS)z$=9jRo$JYqaYVz{AjK&y6Huu)n6|EBIpOq)!(T3#{Ic zte8t#B~k+@NYs;Mp0r&`&r(lH@zfcb14Q&)XW9ZoroGD#EfF9q=HbRc#tgw<2z-wz zuJap$p-{%b@a&6^4Q5z+xVq}ZTwAH5ZyzlXF~Qex1)3N^8%hUr)i{)6>fEO;Ht9+ZMxP@mTjyKvcK5JHQrnsyU04kV>`gs#Z zPuH~T`kDj7T^s&gH6;I0g}v$u_g?VHlCVE{ zt3)7kU}(AvJ=x;saLfCefer+C4I$#7Z_-t0uIhp?mtjh6UJi_$*w3??hbgE*%C~oL z@H*%PR#*se;P%@2H%-Q+s9X~x0TVMv~t zBL1f;BWfGrIO3n*;yFI0!_4gSH^OkL)<|ud4cfIlcQ`{K!G$JWU=qKAZJg9F&S3D0 z9chuWD!_Ci-jH@hqT7UhHEqQTexp}xuzZ3X{L1@X_>{yBFDPas*|Ao{#KUI!+N;8N z+n@lAspVbbW>WneIt8^gS)w;A(gCu~)woty_fLl5bql=#xbV&5zjlC6y6j4Qh3IS{ z;KYCOw9qlUBpX5gdJ1)i(JKh{9IeJ5JJYx|I#l}_Y=kHl1Lla;Zi&HIz$_oJnP28RC>IiVjaxLmM`^MqQv-O))D(|h zgHi>kIoegn!}{@pB`(9VBRt;JR9O@uMRLvYu2QF)ftn$G4sJ`5kDT8g!XMpbU??9v zj?v;%pxRTi%L^@*V55~g;J-)TJ5@KUe%KyzgCzWG0qBeG@S2-6n;sdjH+)*_x{i&7KEx(#f%WIUJZ#Iuka!IQw2##-#uo$+)TwN@slFMb+A ziy3AIDD^2l-nN!L(ksG^*QqB-?}41W_FfrjM%phfh={yfYaXLOd90uF z0$-rMD8@u4%9cP)35?UU6$f469JGSf_v`bEsLy1aq$@UNQ+JI@Cvb6UB$wcPND3-G zM*BMl25J!rnVRcZ&5vBN5ocLJ03<7z^5u(ezA$0$U+;xtN@+9pG1h2ldW zl_3JodttPX^|WNe>3f@;+8K(ZMUWw#8&1iRSuIge0s}k)RUQ9#QCA)DJz>*+7kH*BvGNc|3douB;*b3KVW(uR=7~3*sj{QOD z@c%|3R21|bebY{l6Tc5r1HPya*D{`;eGb<~1`oej!w?M?cE}PcQ3i3P5l{fUz$!&t zYD?Nl!@K-F%A*u{u{f<&2ZJKmGZvtU=H;FvP zCOaas{Q_hi`od`LLoj!WhV~`rQj_K|&jah`WE3>lFWk+B#J|2nh`m6`V0qPt^NaiHDT)Z>&l$r!(~xu}cV+po~_h~PAJHbptN8);R!o(t-n z#6TOW9>QHj~mn$HjbAD2#I$>*PWO4zo+qgUmoey0VPLwDzd+UWXpUls_M z&sszg>;F8gmF({VXxxNN2q<(tA-qPMIsv0g!>Y~P!)S8`$M?ATw-`cH>2lHO0Ix4S zy4E|I_*P4|2_@Py66fp8{b0ktbg37e$MAdI3<-SKG_03aS4rQy68$Nav+gChu-v=S z?}v`*#I7SJ&jddPXj*FGl}e9M(Bp(J`#ww>YXGO(5po@bL8-vIq=c~;-xbz`L!Nop z@tt{Yzd}6x9W!Rrqe8V#Cckyx;x<;uBlvC^#$h!iSkiZx6@Y>^pK9M+Lz z4l7F;pi(hhKN{G$=G8)x1hdo~L~6!0m(x%)OQ8u%el+vm&k96*{#~Uu6WYLXzbztw zL+;Us?U{sXq@=PJzkJq549kL3Hf%5$JGgQ=%|;|=c?$IIR=IjAO?r@kH5x>R*w}j! z`3=zbHVc?a%yBB}TO= zf8?BIaWQ~PQ?omm8~wejn?zwitA*q#uJZU}r1Vu7`&W$lXdKX?U1{UfWYuh|D|>SL zHJRk!%}<4=L<&Btik!BrlgGcXAOe$TF~Fw< z%pQU>@}I$MM-(!-1XG*&D`-%f{9Sg=;})d3223=tWulbBG9ov*<{%~(~5M1(okoU zyn|jI;5%S6f*9MbK`l9r>`Ts>wX9*D2iMAcz$5x`D%z_YT@^_l-|AoQ?4LvJ-tGP} zk8qeb69{f@KH+ZSJp<`Fx5XRDYIHxes?a9_UdR}}4#5~eYILsPreNAyz5(q*_sE3A zl-I^CD|weC@7aYxv%M0S7u7hU5^GWK72WB!Twaa~&8`GXM8n~$i)Wc_Ic8Y15Q!Wy zq0(;tndjl|{gm}=MuE6{Zg&Vda#nUa+u8h)?cf}U0TIH#Xq=#;ND$~x|JS2)neylp zhv9iZ@Gx1k5oH4(och+N82|tP000000PJ#hJy=~mh}Oi5&}mi*S)`Z^O*E;%hgZ$BXZ6PN@>gJThke@wTb8vS0qZn(-Z&JHDn5o&a(@6LgT)MXJ{BO6 z5r%g?m8XXPvL(C7e1<9KgLW?~R1k88Ur&Hm*O9#3QiYv6s=B7Y<&a{FbKO!(Q0U5e zzZzw$vZ~d6RUh_-qsT9Fr@X?pX8q(FFLcd5FIJ!^dZBJ{^^T=2m)kYZcNBPBL5D4B zqGN0W?Yulx7E68bquNy}8`=~ShNi8N&1uIlGMdF_3) zYPB#sRkojeLJ9!}CCAIX3i*UDypNl+MLq$WEliS{AZc3{9ovL&0x?%Dgz>p!<@YDW6V+MBc&MLEV+MMyAsekVn{X3?Z_ z(#S~uBbNUJK7k!!2O_YvF0t{+ly@pNa;OWhd;@p^qc~*SY=oXV1n_8(`_S$(b%Va{ z?9d~!jEf*?9%-^6Ho*W$D7=7_o&Pc0|DNJHB#^iMpwETY8zTosiw$W}yINseLL^E@ zDeZ<pCdPc+cE`tt;Lb2XA zQ7azsZCW&ZltH}z^@30#SUy!DIAftlPKCPtl%gIgM}qS2xT#F?m4lweQBPGj7yHyB z%U&|3td*-zGV-VnU-l=f;;_8-G-U9TW6uVxAJLKT7@%xYdmCClR5tCsQ@3crwxm04 zdrjN6ZQHhO+qP}nwr$(CSFKaE&;AAX@#fQb9+|DT=$Spf0KQBVtvNpNi;^K#0=MOI z{fQ2tp7E*sB+j!L#z-~ErxJJWtdtt4?oR_dqgPy$?m;I&gE zJyc7|$B1n1dQ@6gOrR3U`_u?0ikJ>s#0Mb?&27qXA$Y-SS{3U^m!~eV-$bcK3 zR_{?|ny!ri#_FrYz=D{CGhcI|d`yo9rO>U!Fg7-N?(7EeK!aFWwTEbRqxvOHEx+Sc z#$cP@N?FuVGGz7D_sfopZwcvp999hn^NIKe;x02s!4u)tWXMHGrcxBhxP_~8qo-l=5;u}i)BvR#u^NNvSWqmzdmj>fxx%B9 z1Be_(X8{?{u(+LikxmzK>)5q=j^PB8`i)yJMnZDfbRR}9l7I0_A5QhNm6{XZ^_biS z?u0&5~Le;?wZxib2|*>*s`&JJAjbIu^Y>E_caQD zE~5?K&jEVPx5KOfSDw%jfy#)d1>1yHwZmGDnl8>=jC?Jh(Dgm1a|tAVo9b6^E&g*C zbSjjDZuR=**q{mXYi^-0g!#)Obhzg0EqEIBYC_x}odG&rgaW;7HQ!GP=&oS3F&F!0 z^rV2IT;0CM2ai@0p^0nbmxURiO{zm#IplK)rQSXZV>k~=FG>-pai_}p{;rbR&H{yE zDo)5N4Y(1=9M)v_e4YibZ!}nPOT3W^rIl-_VSHPN-EezAx0F~rmOrz);&2TGf7Wjs zGbUDR$V?S4hM?pWHH6Su=#u(=@?%7^FzwqQgi@m|N2kH-RYAQ~@Ms>f7v%*$rKyW* z1k%p5|FAU?nW8zW(LZ~%?A64s)?(=QxOEZwQA}Z%QKPeK?g$z5K4tGch26LZVF1sK zHg8%|q#Rb*k~_nAjUNQ^2V-F`F)6u?o>gDn?{7fa#q|@YI%<#k06Y|nKlUk5x9C1p zk<9XE7=`6ha_jDy;j4f$uo}?w&)|j1=w`9yWr%e3v5x8K|Ahb05;w9{+v4pYOU@5t z3IIT!o&FNTn606*2mFRn#nW`n8y*uvPVtyQu#Z%)d_$hz7uFFeYG<=m&Viq3zKm%j zl|l=MhjjfBnYf!&`TT}kiJY9-Qjw>8z>2eG27l`|;#pAm64Y;>ak)z@UK4VFVg`RV z8QWI6JulkIhS(5emhZIsWozXdFBAodsenkptb_AoFkfNdkh0xqUGo{lk$mUF?-<=h z;JH)$Sd4#%dtDng;WCld2DEgq5tCEBGX>trlab5$xp=ulQsDrxo zhk$1F(=O?q{VS0jp3`2?t8Nk+(IIGKs)P}aeS8BL5S49wrt9C5{Mb{n9;Xv9GFt^^ zhVTrueV@az;`gENGf8s8^u2xS=3B#eG35?EPxOL2&;1-bXY8(Eh_MbUKKmK|EuTNe z<(kRzZf$)kwqs_EClRZE9cf9|zVDZx5vZ??=m+G)#%HBlZu=Q08RYEitX0$wqpS73pig z2%tf$%X(ubugr`qK0f@VGf;*EPDgP#!F~6x4_=!$3M(x4vK;NgJEoSiT{NTwd@Y#h z8s>E@mVV*67&|vBDn{6ufy2hh{SnZS7TV;+UuklIpxamad{4|AwUwfXp6F5FNtQ8{ zN;7+Iav7KIdd_}pF*RDR>v2yXd_aS;w;vx+HVTL3-CJTaC+4@mw8uuXT1&4$=L1cK z392TjZNCi!#Z5YDPQf_jEUIV<4L;B~+7Bu*uh4VI$APK<6s&5Fs?h>O)Gj$5!7d*t zEiRlwE4p%fD}&DKU)8Rt&60YMMJRFuX4IEHF!=w`n?UH`b+;p4qpq?&V4?ui=c{#{ zZ$qzS!%}fN>x%q0COS88Sg$BDSp8+dX1v0Sp!|o3tP};2f$_qakpGI^pZzgk7yoq>Lz@fJ4I~f$Z>X${hgUrWZte$TZyPVg8l; ziTjLObyG^j_}_cEmW?)EyIu=0Hu~llAl+{hG0((G9)XJe7@=u|jnv?I98eu%mA5Ec z7@Qy3_4UB%zdD45ypBmC6MIvD_G_OaYfwD*QpWhzAcIeYSt*--LXpJprrk~=P1gQw zfL*lr1Y;mSjp%=P5sxrq!ZvV$elcSX#=Xg23$%VeYT~+<<^5vaBa{ovS)C6LnVAnA zW|9Q0P6@vrR>ekXzJk_d>(+BN18A;A64H*v@!Q`A^^Sh&nDT*#$uv zgcF99?1EDyThIuE3`pBY0pV9K{JiaQVROm}%k<)3A(ooje9~?j=Q^=XG9Cb~)@=N} zqq(W6_3#2@^yi}leF6Z-7-DT8CVdCxC4S&caK)xlZxaGWowhx; z)z?7+A}GR*4R%-a0ZiEKPI?V02gX}_>Fzatuk;)0{yhVB1TiUh8f(md_0~gU>JCnSUfy zbr0FdQ`ywKxp+zRJN@g|OJ$8i{XJs^R~Hb1nyMoepIm8}hO7@*QCIvaVqTjrhWA{fMTDzYsVOrm94f-DN@|*l*38*#Kze zwot{_8TE+X`841dti?}DpgL$8p^tFhpO=qJ&dg4!5bN6u8*!>Djn{oR`B*HAdo`9~ z7(M=rGmwMhZfn_{Dmhd_&_v$CCX#_|M-Mn2jM|F=irCm`M6Cmq0JHWM)9>08aN1{c)8j8cz(lAyLoQA39Df zA}zRa@K|n3bUj|+!A|3}~We=FFvZoN#ANxDL~_yOAD z6Ow?b8wlU3ktGc6i#~mlSYsPw3%RrlF366=Ry$i_!4KjPHTb5nT86?p61gnpk#9S%F>Z{FmvkL_eLls3KA(IY^8up629|1j ze+Tsk0KDK<1i)vZNi?M^RL61WQ0BgG=&x;$VmqcP_?6HZ?2EF}4A`eZ97&5r`m`yg zl~Spu3Z{LA|%95e%};3mrV3zr~Q1 zpDt61 zZ|qzm;eGOm9-_%#Ldar*uGsWVti;FcgXBo0 z_s~c}Jj5b?BR-Nz<$&ijNxi`h0wA15n-?9ONsT3mgvn1l2x!?7{?E6+5obNtGGgeC zt6C0zaI#`0mnq7$b(*Qt`Y`asek9C~p`dac_*rpasA6o=`IsJK3fM$#pXXy;1#0Y8 z#zfH7-DK-A*Jja_Y-L|rH()fC7soz7G}sXQs3bGQ*icrpXIiminvDuUFEna;@NR1Y zSLyY5ep%l)(o%6s6pK&iEq_-h!D>68UMltjc~Bx9=A{hUx@bObjRPnlORFpn^6!UU z>cR{|nSGEGqg1%JBX5B_q*_w1G?0R15JK~XdmfoD7T)~(VqAdO>ZBOJDC@3njvRx` z%?`p_lZGpBH#o1nGh5fUFMgfy_d)b=Qk^V}? z*AscY9^4+aJps4EFOA<{)x$h}o!S+mgy|9jfC3A5hf7_|QT9{0j64vXq|JBE=Up-? z)z)QiD%j9zWdt}e=M|kd0TS+Cl_3IV!Kr>R-^hdoV@bU;dbuVu5no>QM6Pn~wcN5< z<&15D6XhnXgYD*)0KIiL!V=ncX0C}csx6G|tx36QY>cv-;6BZz`9xi~{7t^^kn(*s zENPLR*mjLdUf+RWhFBGAw#}}8ffEd^)3QyE`NaAMB-sP@{=zBV*u%C{US^Y+uT+y6 z&b~9{DY(J2OKe) zn#>p8`yRr2CR)<#C>+6~;8`q-{R7G%hO)6(80`=rZ)o*zL>yYoavvBOqkE5nvqp#GakUxq{CtNHV+}!@sy#WaUPqrwH#@ zOSHtjU;<(q6kw-&z%={aYsf*KJg?vYhmwyiPuR;i9UchGs_?0-!q zKx`tWO9B(#nG}#jPeKr{sddt+NY9NQ3yHOxhDq$~iIHtWayQWj2xz^RqSofUjKRXB{pp-Tu2)ner z6Mgzlrz&QsclHLOa&dEk<@COmWY-ulv?{9x9h~Xi|KWF$y18|R-**4$PQnNnapctx zo|seOR^ZOsYq$$b%t_BR6yb+kiV&uA)PgH!IL!5jA5VLE=xcrskw`2mkIh7B2ZF6G zmbtwMaU3*np$G+GcdPth`j!eH`}kCGZ!3YS*9Sn3p>&hFT*euWYViDcAFtQnXvgQ1 zVD-Ls89|8l7B|@6Z@OU^f+Wn?)ZcjeF8f1eS{oBTJaH-NZcN)4$%2A@Mzm@RBz4#H zcL@zL|LsY>D`)T7nAaKqc3&{J`{m-bsOC*fP6YeblTxwQ=rP>7FCg0HTVgC)q z4Aq%CDb#;r>s)g5Z)SU}8IB5fyR!Vc?EZO41bGs1fG8aCWT3$T5KDsEY|{O`@nP7i zsz{i$KuJHVRPbUHKnzSymgwB_U2fP;eH!cZ8-qnmR*6*toZY{)Om#eNp;CHa=z=sj zZ-9QhHFJTiUUaoTU zhlC!VKLHVpqS~^TnPO{ZfnrnO?kYqbsN_#RP-dCL+!>59Eu=0M;)kb*7~>2^V-35JC|x^o)t z;T2c0Mz4KyA%f*4k1MQ@yk5ajd)Q@oKgExAD30tCBn3@*t`M2Vw)%%GiAi$fsrRwK z0lCT3V=Mnn`v#Pt*MvBsygphsYvAfk@FbnD@R-)9M@8}Q%&c5|^fQ#sA8^WxV3@^+ zVIJOxd8gwS3DvEM(i?2{5G!uFO4m0Cq`z*@RI#$u#vP+7c&brH!8Ra+3Mn#%t7e>e zAkS+!164chn=XAvzMS8OHsJ*5866)FgxOJadR;{@NsL{S9Q97xupQE35M`aUVZ@OA zS1kj(ccMkHydgi8icN2SZY2IvKWsn_GjyjhYhBEv+xaL77wE9HdeiUXRP zj7l^R;;!mUUT+e@c=W^+kMzky^)gfA?Hj8k&8je`L3qa15M8ST(rq>FV-T7?Hf0i5 zYGKi_<6YKErPLn)Hc}h-QLnmHH@0YW>+D^xyk3Gx?zVAO?u=zlFY-S_67VP$@Xk=u zA2vyMJ5i8_*8uR3G)PvD~d^SqYr364(Z zWq;G#+&!Ns;6P1Klg11x$%H(D1Wg(tken(YHUR~NA8aOd?e@>csU~^-iKca6KSSQ$jwCv<6P_Al6!%$o4{MaKihW@GlfY>+(r#f0O{qJ`BZ|d`=F&+mH z)aS9w+>nRRulK(4Kfa-Sle*{bVYUW#j4|vLu+Sj>jOEs@FOIuV4FjHMeyZjmDuf$n z{2vK!wn-8~rKiRUP|2-Gq02fTGU##@Ejgv6!_P4Q`eadXFP3LY#OCoP32y`7#TWBb zlas0m?ErHL(OlyXGg1Yc+?uZg>& z4Og+clp0(Q-WVM=b#T!7gu>K3<(%SRBVs0B^DB{H^A!~#^QRDUU;?C zZPdN_F?E)a&?~Lasfb+4qUy;^sXOuVhfYqC~ug*x=GG@y@l<&pDqvtw_Ccgc-H6`>K^sU^t%Y)_d2{Ls^H74OvQ zJLuN{>#~K7)@#D+-PZk;ZYnyz{x8WHH@+xGuDT>|ZJqj#V@-4OB_}U{jfp}95uat+ zx@-Q7Z;(Q>Qk)J9x<(k!(>38F$5o$Amm(bGAu}ww9LED@*or-D=)D=hPD)(LRB^DshVtf{js_`lUyI0bC;7T+Q_{HU8zb2Z72p%}4NU0AGERjK@(0);b>Z~B z9Ts2SMi^t?kK4fHW4`vef?Pe`)3F-^6ziwhxY>$uJ1D&|1F6*K0xR4vvq^#^?+11hol!AZ6j7lQ!G#6*!iz}98=7q%A|6U8q zugYRW+bVSqR-q=5HO+LJ`XJ{+!!NcoV_m7G;HVQ|&K?%x=}ID0kIao5T@%@wZfmeG z&HJ@v;{Oe2%zvu*O~U+&Gi)$*xkEac#Fgv$mW$ZooAJI3m)EDWCfiCDW`1hh9AReq z5h`vh2y&!pyTlEpKknooz&lpU3ca7zIT*{$7Fzg8#^{-YIjyhv8dQU`Rm_5ZS+mh` z7=RKisD#;~Fpt_hiZS$W-E+!1NYkd0C+OV$PfY}X1J#0LCJe!qGVN@eB)Du~#)3+D zZgLRycmf{2EOeBSy6YEX`Wp*x2vj!FS~TbB!k?9twFbb#IJa)gHwI_z1 zgno+OUZL+T-Gw}+`8VeH*BYdN02oHI@0JjB#BzPgdVS3NV@(}aJo*WKV>Q2QVOOr- z21g!J-vRwZ`6G=onmoBJQxrpW8qxKg@v`V%44Vp4Qi-D8q>{*26>k`n0C1Gh?2A~| z0*uTp%BV%e&WwFQqCf0yn8^V`?&kRK`o}CqH`D?LCo~FH)yQ+x4T5OkMr3870vOUO zJQPLLsHH&{ApBILe~Z*j#pPV&o{HvmpS6IC5rjffCRor&!;!!n@I2&YWLUW@IKa@u zu8s8Oa0QwY90QadW^h*>!X}_?8!)&3^~)z=fXi(EHLVk(*Ci*unv*C+U({E%3CK-x z+aq=+R+qBA`fcpgtXq1a;)rX_B`VjL(j_63TAR~3-ea$lT43)Y7y> zjGJn`tJbKvx=dv3HOK-tj<{lJ6-3_+7|9uFlCIJ`C~-x`5?^_rhLNsE0FPeyUr6K+ zPEc&xDmyW_TT?m=bxnXL?X`T|Dk2ci3c-MQO$3f{CY|1cfHG4njNI%2C@i#zG{!iI z;z!s!_rfaM5tz$Zo->fm+yh652$TIMQ8nzif!XeCC9R}pO%pfx4^l^hmIsiz&C95p z;(qRbIt0(c>w`qIoJ(WX|6s?%@2u2=&0xpTT)BmR8oZW(BzEk1lGB)9CG|HIMlCIJ zf9NrI3-`>0ye;V6ahOYKM9tW;9fpCLUTH|vKZi;RZ{Ye05iQ>B`+?mycyU$VJFPBD!fikfETXmQH$%^V=5-m@=N%f;CY8keUwB& z4MUZ!d9j~slU-yUqPPOm0;PrCyLh7{ue%~5(o%yHu*vq}NmMG}2+g*(18MwyC57y-H#o?wPrm(-YO>9*YD z<)efMU{6y>3_nv(_(FuFYBDTEY1KLGUOQj0)Q8klRl_ktyZ+z_5bv5auh~JtsXb%8 zp*I4plHq1QbTGE$VF!q=WYJ}lcO;`9U~rqHA5#>8yon#=x%9IZb|6$P7DzITa}n>PW}daqgxJwm6g#Aq*4K6)NFxDxiy93c>_jeerDaaTFLA^ zNE(x`J``O)Xb|T(z^P%_rkNMR=l9y~Dp23hbYQL6cOMG%yM-q@opd{Vm1=4Xxz>vj zah?nP-RM0kIJT2S#v+ z|LcoA}69L`!R}nCVMw{Xr#h@Z>BBU~BlimkY z-f4u%Wu7LP-6wXHOX_EYNokpEZtUBu86mXsN@cVNEwftdtO67P)|?*Nb98rUT{3!F z(jhv%QL!*sPSsuh$vWTLm6SI}gEg9%!4QZ?%yMbEPS?XIL!{uQFm`z;ZE4*Qj^%`6bgy&(6p2nzGqko;R+%i{ny%ObK$EW1W=%XJQ5 zoX!A_@d=j^6jzZyo&bcu1BWbjL#xR-du6Uq@6xE8JC0d5=vG)_0n}33K2b68p z)>v}OS{nFOp8>XMcRAKA6`~qukvdfqAbFN%F>QmeW>*}<0Y`Pbz?I-2FP2=m8>D}N^!OqSaVU5MgQ zs+XG9p30s;hqcK;dSoP$YFtySl>CXvHn6bG^<~#d@r{6)%Lp_^2asw@j&y*8{0LXy=xQ0Y_OwKZ!RW`%}#yjU%`FW^sE=7d<|ai z-Ik_JCeJceTWAKFNRxwyTkIgclVW8iwwaGH-vIYi801BpQEuCkegnxXT?Eo|{REll zO=BW&Fw97y&5XjfmbA!9*OdCk1j^5|8zb`Q3#EZ{Q(h>0&7hk~^#T$}A4QTa&+t`H zzeDcqYt1Tf06EE*)l#I}j69vJ(j~=? zIe$xHivYcdS>m2+su>~MYyHRKD8c>~Pn@Q8{Fdc0a7}^H$CZZ$(60qkv&}s#BGga) zT>pG&KNu<|u@h4Su>t(E7$k>fNl)Kr#;Nm8&Kuf31A@aGi#*B&7a|6LsC3Jmhlv7+ z0RWjHs6h_CUU(s{Xtm^;bL1GK>KnNp_=Jyy&PZQ4Tc;ePl6F318)n|y#oM8qBcCNX zXwp%)bp=&gi3>?&fP#nU%EJL7R?<#nYF(TWdYlVgv!{V~_J1waE21DS<{0`BIc=+L zx*)4DVz|#``Bkz~9DgqT{|i$WG(6v`>O+autT5EWI^1q^Wdw(Txc$G)%iI;V54j&~pD+*1?{! zI#~t~=p2=o$jbD8aRBIulAI$6_oT63R@6-5KOz)_`u*_ZO7TZi{#pEFaElCl(_bJQc3ba}&_%s7(VLVu6e5m~t4bsy{JE)C>5bpV+_!brGW!525Zu!1ki+LtUyBoAsj zj{$F$VdORe!bzgJsGb7&S&tIOhWZt#3u}w%A`9i>G5$`}Uq0>8i-%HkkouPF$ zYM!TC1N}MkweCl?$wBmg@8BZ1w{xA)zp2hu=1!cj+6Y~OmRZbCqZ^N2my!Z0*)y8g z#UI*Iz*Pbe8-$R0yT(F3mE;V?0!}}GUJP-!nQFpu{7t1eLr^FI`|q&HCj;}{KvPtyuteP{Adxq`I7QbS*V2VelFy~giN zHdr{XTp_NxV1klqwXq-ZF+Upr5fWLFp6qP+g-&cRnsu^^EW%24~1jQsoF#ggP3y<;FV_xpW6y1-MIO!M3-I zY8AFuqbC9vykxBK^dzWbLAoafDHG?zumOq@gBO?pU550h=JzO-6UQsHjq)Y3x*A)W zITrw)H1A|RHB3NaS`1skeExrMa65@QkAz#uHbOc{BdApDE=n_4A zXeZkCu~i9g9hF_~1)%+Ghlg!m^CB)0NW%~9U-{Few^w-Jv_J_pT5O_)Z%ttI$V)|!rG@Z7VMwa zPtZf0!mvHm6C*ao3#K4ZegzO#&(bYD($jS7cs$xfOjH$dW5M`$bLzW2SoPNtPQwg# z)d1-Xs_h>bUWoDn?UzIKzR8jz3Vp*1F8(KcX@%8|7Iw}BMCE8ttFl3uh92IvLGi-Zzi?o6sbQZwVtc)(7Bt6 zxG$n(x4nhQtX+|^9)fGUyPN~pW-_1s2BDSa6HQaOZK*N!hVIVgwY+_=;1dmik9$Q&*TC3w%pZeau2b&TNCzIpSocxHLtTYYvSTcoR zY~}uuAOEo|sI=*F-&~yf)WZm}BJ;tHAK2JJn_Zma_s85rmn%yt6-7RySLh&r66g<# zW3WF$S8&%dMKHFhHRCpLXP^(B!)UW_(F*g98NTrG`nAESq83iR3gjtClEvNW^)D1+ z$L)~hh;N*}nrF6i)_dli@C$Q;|zRKK4Oyev&nNzbJyH?-m_fn5FRP&b9TQCzIr#(qIj#L5p^8ZKxzCcx^`IA`&nijUY`#g zI$co$b>XIM+ew6gy>b27eI2Vg-1c_k@7}wQg!u{dM$ls&w2HY3<+absLQyOYIzPnu zHG4pUwQ&$|O1F#UY+Q4yLVM%ttNjOFrM0y4&^TOBm+DEztgfes;F1K(obc=zS1YMX zq&9wwXR6&mHKqtlVzzj8Pa|?El?|c=A#2eB1q0Tu@}F%C_^A;<|F(` z9SY|FK`aY*Hp;tI>QWp}F1h`F^%;O+q>1Tm(E7CFL9Nhe{E}b7t z#?$ji@*{&O2GimB>{fkoh7f?ei6w3*fxHt=$}1M+0o_oA7DMw3JXPPpPRShY{@}}- z?whT4m8Oax!bfN@(F~xkc|I)&Z9!zKBZHSW!o=a6DIotuG1vdG{>t&yqUnNWU3NKV zz&@$~Mv{PR3?g+R{4n{QWG-f0?I!K{#QcpY>%8`XfZ#g=O#O7L{}kZw+wSk#oMGs3 zDxQk1+mfSB5LDVHx!o3ldt_ZksazpfxY}^Qr#{F%8O2>V=XuN6pG}D(niR6GX3Arj zxG!}WVsdwJmvJR^5#354i6g>NJ=EQI5cyh9LUK$Nui|~^0E?`&I3+i-5DAq7grYoB z)Z~cKHr8;h^Q}wuIuE&yuB`7v+MD8Awv@F#=OI%Q6T<;BU7b4BbvR-$T#U!o%jDKM zGh*B8xpPYSmIM2*|M5WzzcyI>sEYX|Vnm~da9dd7yP*Ju+61BJ&%Fm_oS|$KbPGOy z-RXPM4hW^BU2$_RF}+5Q_sD2%&7E*_HV)z^n>Ty*L_@GcqEjmD?&8ULEaR3M7%nkj3oW{N_cC2 zK5+?a%ge)R(J9Kmn)@;ALe#;Mpw@qK>kaZ7vX|aRQ3Gj(!Id0jgW2 zIrRVcV3_#~KW3I3W&P}zQ!Cy5fOz@FHNzI~?B_;Fvo_BiEu*jHIc6F+3qS?z8G>)) zL6RB_W2CWD1Ou6u30TQKZVwUImv#lu;Th6#z|0cm?Wx3i`t5vRihG zeLYY^mzO+P5`ek*SKGL!6=W`Qk$zG)2E2^b4UMZK-R^MehWIzU&Qe-Ga$zkC$sT?J z1{bsqH|XMyTh$ai$>z$9$w!Fn{3KZaPHJ6r(?Ww`M*)`K;OW;Foj!j3dwb5%JkS&_ zo!v!S10AR7YD1_yo*u=>=l)~zKc&bG^tk#ijfs2B4FbIq)C`+B6Y+^ck^hu6UXOW{ zpK+XdC!U=sgyWGpu_MzP*s?Xybo4nER79_Av%Q^imr(>CQy|2p!N52S%PmLh{|l`+2O zw3Y3rF!A6t7wzWKqYudrCy%ISwuzpwSvBSfwrTfP4ef(({D3)t4~zZh@fo;Fr&`@^ zL`W0-nKldulzXlNXcrM&Q3juF!-D@bux`BJq9@iQcb9WF4TIc*=T2lAvD(`-r2L8T zAblaOP)J6rSyDqtq zyV^1nZgZZzpr8#7S)}%0LPgCESp?K*^;pbRQ@klsFG?GC9=t)oruFf5^MaYZfoasJ zXx*nZ1By^Al#b1T~M!M@-+IY=4$vU%6aJNX^n>M9PE>-6h#5|^bQ0y6d#&cBfA^m*PIxF1xget{|M;Y4=^beZw^ z?2{0Ac8MCEo}Dr!iZ|1)j|wxp+e{?`s7rO>4Mq6h;{gDw*6A#sL`LpNC>$g}3Glm^ zSYsk#Kk`XdSu4%0JwIj^zsvPEqXQKn89!!=W(qmNLRVo!{MY=(S48CmkKkb)Y|Yc@+JiE_5aQw_Sq z<*=3873}3g*ap13KtH=95aoUC!c?6JPgMWmNMN>-OBB`f_}&X|WlMkMK^-4VJR}{6 zCc6r|XiBZGKnNO)`X;5izAkrty-CuLdoYM27G zWz&`?PY2Uaq_mBEp4R;B4G`LPTKk=b0WGNi)3Io2A^izhwmJ+h`;4|fR7AgV*&nnQ zv5kukdju!$q)q)z-8hXv)0aXGXGNCLSM3?Z>+$U02p!A7(n5i+B&Oaj75iHTHTb}+ zhN94qTb8Xy&^b)+>r->m`{^>qzOn$PFlc$Fx#6#}rgOdkKk6>ULyB>tz55jDY>{A;GM zGZN~0evOY{A0X7g>7YuqAHr)a-_YYqI;Oe-Obq}}Ylsio225}IKJrb5Naqsm=E+iu z%;$BK+q~oz&S&AsuaBh8gA6_BNLv$1)XBhixkRknFduKji{u{{r}h5MRAyGCGV_dR z$S-)LVfzG=$=AGyYm-JtXh3nUOflOl{~AdDCv|*xEs0e;4mO!NWKu?(>7aHAG9B-y zq&LzTg*KK{RX0{CL@87I%aBSY%X{WLq9Wv6bdAnB`^72i6UUTPi=G3t#m4?ie4n!zKkjKH#i9~PGu+kc`e0X zKECUbYl=Fr-8|*4wiv;gty#W`Ny{LQMdI%trZ7UJF&Zh&0H@x3jyj!0u3Z^vuld64 zjtX$ijj1C=x$aT@o4gVH7Nx`)&9dAMz=2{Yd88BPh$@h9wqz*s|86=|u!k%XM4qku zVEQ=xdv8@5iU#RCx@g7*Yc$NoqSup~$vksj90dDOp1sA3v zBW9=`%k_%##Dt0XD;xB$8hM!2G_HnBu=@do6jFxxp%)hQh*DQ@)h1-v61?p- zRzVT)*~3~ToGXN`%#o}AnNkWuuEW(usp>DcUEcmk8=P}BLSx134L-TfC7v1iRlnJ# ziBM%-0Vh2l!5CY5O*oN_q>!_|?;F0RyuzSrgHX)wFF zA#hHw)E0C1z`ie`VqVZGq9CUDz&Cjya+`#xn`jAgi+or-uKMqY5&!@~?Aa2M zW#>dz7o7QuQfzOH7q1fJQ*ypL%W2m*j)xyODU;AVnI^So!LY!PC9UzXF<=Dmn?;`P zO@$r)={zqL0js{Jd4O79W6PJ6Wv(_ge4@v!`aV8ekt}~3D7gnXPwwq$Ax>Hm7?npj zG)Z=mcWV9%0DfHj-hDbyPD>EccABjE%kYR}lVvCbHTliKK_IScZRz@}`+?k#Lcd|@ z;oQ1%Ws*iD!s_~iZy2_vt}3KPWgC?~*xVJ+LNi1tkhyuRN$FD-l07jrW2~gKfcZ)Kz&={7=iUHJO_$xlENf@OwGMYR3uKUc$arTB#OkL5QH01x-6O09 z$p)mJc1BZ)IrYCB@)HKZicIc0b-Jqw-BG5+(W(8o`KvOZN$1P2r^`2=%!LXiy5&ai zeh{0A4!WK>BODx3B(J@YiHOBs7+Xd_@qtbF?0=~qEmDLSx?Vyj2Xi|)=IGNk_&kC& zsZEH~7@UFmI{_1zRso*gNt8-t_tiSqSEW93g1%0dycW)*H|EPzKik*yYP ztCxJ0w(&`G^i5gMS0k$azWqK|%it{0jNRTQ>*SEGx#D@l#ZG!f`sT;?0C)UOMqfMS zy7oFC$)ulc6_W|?FydhkwEY4yNiT-NkxWO1j0UT^r)_@Vyg@$8rI;m3hon( z8hpJ;T`d{zkko2WjQSU4y_n{Z@uB3l(Wr};??Orpm1*9AJTY! zdXNRi8+Yi*j*14?azX}W3mh{h4x^ANYbp64Tq>ix|Zve ziQ((5W`>j$oyHs0$FJPefQ3BWuh9YP==>`xv+}N%F?C_byywRck}-4rOlEoIX?z0K zxL%8F%40UT8)nGcqF=LtHgJh;(SMx%lQJ zii$reoC_+UDSHPan=g2W%c1`q04bWxOsD>=?sY$^Na!8In7FVI1IH@2Bcv zy^Cmi=kJK^Dj=f&Z1XBJI}lV1N-d+ZI&WedQ+N>gXzj8D%ub#2LiiJwU=JpKuocuN zG+NE(2~wB%En&Je+b>_kbIvJXowIdUw+>4s!pnf=$NyU;+^OgIKxd&PAtcfxj(U+K zDJ|h5)emqy)^2y9xA#W5C70)*vWK%a*9!qd1smagIBLBDvl(@u%r0n9dn0Q7l_!=~(9!nha%24CckmTi7Mby!kgI}fVzPs8g`El`7#w0R_ zT#kwIi!cI4J@Mh`dNpdr{D3J$o$aLjDwws7^~;XDO1(x3N6c|4w;(T_yGS>K-`X+Q za@AerZm8NLhS{Hp!X{k_3(M!U5Dm|qd>fgDGC}i_NUbUfgzaT%A`+pr^S6$&buMgN pXJ$EI69Tu{lrtMhm-vr}m%Bl^yYQX2MC$#2ckuuJ`2X$?{2v%&)&&3n literal 0 HcmV?d00001 diff --git a/backend/src/install/progress.rs b/backend/src/install/progress.rs index 80bee0675..61e58e0e6 100644 --- a/backend/src/install/progress.rs +++ b/backend/src/install/progress.rs @@ -6,14 +6,16 @@ use std::sync::Arc; use std::task::{Context, Poll}; use std::time::Duration; -use patch_db::{DbHandle, HasModel, OptionModel, PatchDb}; +use models::{OptionExt, PackageId}; use serde::{Deserialize, Serialize}; use tokio::io::{AsyncRead, AsyncSeek, AsyncWrite}; -use crate::Error; +use crate::db::model::Database; +use crate::prelude::*; #[derive(Debug, Deserialize, Serialize, HasModel, Default)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct InstallProgress { pub size: Option, pub downloaded: AtomicU64, @@ -24,8 +26,8 @@ pub struct InstallProgress { pub unpack_complete: AtomicBool, } impl InstallProgress { - pub fn new(size: Option) -> Arc { - Arc::new(InstallProgress { + pub fn new(size: Option) -> Self { + InstallProgress { size, downloaded: AtomicU64::new(0), download_complete: AtomicBool::new(false), @@ -33,26 +35,25 @@ impl InstallProgress { validation_complete: AtomicBool::new(false), unpacked: AtomicU64::new(0), unpack_complete: AtomicBool::new(false), - }) + } } pub fn download_complete(&self) { self.download_complete.store(true, Ordering::SeqCst) } - pub async fn track_download( - self: Arc, - model: OptionModel, - mut db: Db, - ) -> Result<(), Error> { + pub async fn track_download(self: Arc, db: PatchDb, id: PackageId) -> Result<(), Error> { + let update = |d: &mut Model| { + d.as_package_data_mut() + .as_idx_mut(&id) + .or_not_found(&id)? + .as_install_progress_mut() + .or_not_found("install-progress")? + .ser(&self) + }; while !self.download_complete.load(Ordering::SeqCst) { - let mut tx = db.begin().await?; - model.put(&mut tx, &self).await?; - tx.save().await?; - tokio::time::sleep(Duration::from_secs(1)).await; + db.mutate(&update).await?; + tokio::time::sleep(Duration::from_millis(300)).await; } - let mut tx = db.begin().await?; - model.put(&mut tx, &self).await?; - tx.save().await?; - Ok(()) + db.mutate(&update).await } pub async fn track_download_during< F: FnOnce() -> Fut, @@ -60,33 +61,35 @@ impl InstallProgress { T, >( self: &Arc, - model: OptionModel, - db: &PatchDb, + db: PatchDb, + id: &PackageId, f: F, ) -> Result { - let local_db = db.handle(); - let tracker = tokio::spawn(self.clone().track_download(model.clone(), local_db)); + let tracker = tokio::spawn(self.clone().track_download(db.clone(), id.clone())); let res = f().await; self.download_complete.store(true, Ordering::SeqCst); tracker.await.unwrap()?; res } - pub async fn track_read( + pub async fn track_read( self: Arc, - model: OptionModel, - mut db: Db, + db: PatchDb, + id: PackageId, complete: Arc, ) -> Result<(), Error> { + let update = |d: &mut Model| { + d.as_package_data_mut() + .as_idx_mut(&id) + .or_not_found(&id)? + .as_install_progress_mut() + .or_not_found("install-progress")? + .ser(&self) + }; while !complete.load(Ordering::SeqCst) { - let mut tx = db.begin().await?; - model.put(&mut tx, &self).await?; - tx.save().await?; - tokio::time::sleep(Duration::from_secs(1)).await; + db.mutate(&update).await?; + tokio::time::sleep(Duration::from_millis(300)).await; } - let mut tx = db.begin().await?; - model.put(&mut tx, &self).await?; - tx.save().await?; - Ok(()) + db.mutate(&update).await } pub async fn track_read_during< F: FnOnce() -> Fut, @@ -94,15 +97,14 @@ impl InstallProgress { T, >( self: &Arc, - model: OptionModel, - db: &PatchDb, + db: PatchDb, + id: &PackageId, f: F, ) -> Result { - let local_db = db.handle(); let complete = Arc::new(AtomicBool::new(false)); let tracker = tokio::spawn(self.clone().track_read( - model.clone(), - local_db, + db.clone(), + id.clone(), complete.clone(), )); let res = f().await; diff --git a/backend/src/install/update.rs b/backend/src/install/update.rs index bafbf04ec..694051213 100644 --- a/backend/src/install/update.rs +++ b/backend/src/install/update.rs @@ -1,105 +1,18 @@ use std::collections::BTreeMap; -use patch_db::{DbHandle, LockReceipt, LockTargetId, LockType, Verifier}; use rpc_toolkit::command; use tracing::instrument; use crate::config::not_found; use crate::context::RpcContext; use crate::db::model::CurrentDependents; -use crate::dependencies::{ - break_transitive, BreakTransitiveReceipts, BreakageRes, DependencyError, -}; +use crate::prelude::*; use crate::s9pk::manifest::PackageId; use crate::util::serde::display_serializable; use crate::util::Version; use crate::Error; -pub struct UpdateReceipts { - break_receipts: BreakTransitiveReceipts, - current_dependents: LockReceipt, - dependency: LockReceipt, -} - -impl UpdateReceipts { - pub async fn new<'a>(db: &'a mut impl DbHandle) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks); - Ok(setup(&db.lock_all(locks).await?)?) - } - - pub fn setup(locks: &mut Vec) -> impl FnOnce(&Verifier) -> Result { - let break_receipts = BreakTransitiveReceipts::setup(locks); - let current_dependents = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.current_dependents()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let dependency = crate::db::DatabaseModel::new() - .package_data() - .star() - .installed() - .map(|x| x.manifest().dependencies().star()) - .make_locker(LockType::Write) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - break_receipts: break_receipts(skeleton_key)?, - current_dependents: current_dependents.verify(skeleton_key)?, - dependency: dependency.verify(skeleton_key)?, - }) - } - } -} - #[command(subcommands(dry))] pub async fn update() -> Result<(), Error> { Ok(()) } - -#[instrument(skip_all)] -#[command(display(display_serializable))] -pub async fn dry( - #[context] ctx: RpcContext, - #[arg] id: PackageId, - #[arg] version: Version, -) -> Result { - let mut db = ctx.db.handle(); - let mut tx = db.begin().await?; - let mut breakages = BTreeMap::new(); - let receipts = UpdateReceipts::new(&mut tx).await?; - - for dependent in receipts - .current_dependents - .get(&mut tx, &id) - .await? - .ok_or_else(|| not_found!(id))? - .0 - .keys() - .into_iter() - .filter(|dependent| &&id != dependent) - { - if let Some(dep_info) = receipts.dependency.get(&mut tx, (&dependent, &id)).await? { - let version_req = dep_info.version; - if !version.satisfies(&version_req) { - break_transitive( - &mut tx, - &dependent, - &id, - DependencyError::IncorrectVersion { - expected: version_req, - received: version.clone(), - }, - &mut breakages, - &receipts.break_receipts, - ) - .await?; - } - } - } - tx.abort().await?; - Ok(BreakageRes(breakages)) -} diff --git a/backend/src/lib.rs b/backend/src/lib.rs index 4e4b1619a..dda755dba 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -40,6 +40,7 @@ pub mod migration; pub mod net; pub mod notifications; pub mod os_install; +pub mod prelude; pub mod procedure; pub mod properties; pub mod s9pk; @@ -105,7 +106,6 @@ pub fn server() -> Result<(), RpcError> { install::sideload, install::uninstall, install::list, - install::update::update, config::config, control::start, control::stop, diff --git a/backend/src/manager/health.rs b/backend/src/manager/health.rs index a70a19f37..17e968f21 100644 --- a/backend/src/manager/health.rs +++ b/backend/src/manager/health.rs @@ -1,111 +1,27 @@ -use std::collections::BTreeMap; - -use patch_db::{DbHandle, LockReceipt, LockType}; +use models::OptionExt; use tracing::instrument; use crate::context::RpcContext; -use crate::db::model::CurrentDependents; -use crate::dependencies::{break_transitive, heal_transitive, DependencyError}; -use crate::s9pk::manifest::{Manifest, PackageId}; -use crate::status::health_check::{HealthCheckId, HealthCheckResult}; +use crate::prelude::*; +use crate::s9pk::manifest::PackageId; use crate::status::MainStatus; use crate::Error; -struct HealthCheckPreInformationReceipt { - status_model: LockReceipt, - manifest: LockReceipt, -} -impl HealthCheckPreInformationReceipt { - pub async fn new(db: &'_ mut impl DbHandle, id: &PackageId) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks, id); - setup(&db.lock_all(locks).await?) - } - - pub fn setup( - locks: &mut Vec, - id: &PackageId, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - let status_model = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.status().main()) - .make_locker(LockType::Read) - .add_to_keys(locks); - let manifest = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.manifest()) - .make_locker(LockType::Read) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - status_model: status_model.verify(skeleton_key)?, - manifest: manifest.verify(skeleton_key)?, - }) - } - } -} - -struct HealthCheckStatusReceipt { - status: LockReceipt, - current_dependents: LockReceipt, -} -impl HealthCheckStatusReceipt { - pub async fn new(db: &'_ mut impl DbHandle, id: &PackageId) -> Result { - let mut locks = Vec::new(); - - let setup = Self::setup(&mut locks, id); - setup(&db.lock_all(locks).await?) - } - - pub fn setup( - locks: &mut Vec, - id: &PackageId, - ) -> impl FnOnce(&patch_db::Verifier) -> Result { - let status = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.status().main()) - .make_locker(LockType::Write) - .add_to_keys(locks); - let current_dependents = crate::db::DatabaseModel::new() - .package_data() - .idx_model(id) - .and_then(|x| x.installed()) - .map(|x| x.current_dependents()) - .make_locker(LockType::Read) - .add_to_keys(locks); - move |skeleton_key| { - Ok(Self { - status: status.verify(skeleton_key)?, - current_dependents: current_dependents.verify(skeleton_key)?, - }) - } - } -} - /// So, this is used for a service to run a health check cycle, go out and run the health checks, and store those in the db #[instrument(skip_all)] -pub async fn check( - ctx: &RpcContext, - db: &mut Db, - id: &PackageId, -) -> Result<(), Error> { - let mut tx = db.begin().await?; +pub async fn check(ctx: &RpcContext, id: &PackageId) -> Result<(), Error> { let (manifest, started) = { - let mut checkpoint = tx.begin().await?; - let receipts = HealthCheckPreInformationReceipt::new(&mut checkpoint, id).await?; + let peeked = ctx.db.peek().await?; + let pde = peeked + .as_package_data() + .as_idx(id) + .or_not_found(id)? + .expect_as_installed()?; - let manifest = receipts.manifest.get(&mut checkpoint).await?; + let manifest = pde.as_installed().as_manifest().de()?; - let started = receipts.status_model.get(&mut checkpoint).await?.started(); + let started = pde.as_installed().as_status().as_main().de()?.started(); - checkpoint.save().await?; (manifest, started) }; @@ -119,56 +35,22 @@ pub async fn check( return Ok(()); }; - let current_dependents = { - let mut checkpoint = tx.begin().await?; - let receipts = HealthCheckStatusReceipt::new(&mut checkpoint, id).await?; + ctx.db + .mutate(|v| { + let pde = v + .as_package_data_mut() + .as_idx_mut(id) + .or_not_found(id)? + .expect_as_installed_mut()?; + let status = pde.as_installed_mut().as_status_mut().as_main_mut(); - let status = receipts.status.get(&mut checkpoint).await?; - - if let MainStatus::Running { health: _, started } = status { - receipts - .status - .set( - &mut checkpoint, - MainStatus::Running { - health: health_results.clone(), - started, - }, - ) - .await?; - } - let current_dependents = receipts.current_dependents.get(&mut checkpoint).await?; - - checkpoint.save().await?; - current_dependents - }; - - let receipts = crate::dependencies::BreakTransitiveReceipts::new(&mut tx).await?; - - for (dependent, info) in (current_dependents).0.iter() { - let failures: BTreeMap = health_results - .iter() - .filter(|(_, hc_res)| !matches!(hc_res, HealthCheckResult::Success { .. })) - .filter(|(hc_id, _)| info.health_checks.contains(hc_id)) - .map(|(k, v)| (k.clone(), v.clone())) - .collect(); - - if !failures.is_empty() { - break_transitive( - &mut tx, - &dependent, - id, - DependencyError::HealthChecksFailed { failures }, - &mut BTreeMap::new(), - &receipts, - ) - .await?; - } else { - heal_transitive(ctx, &mut tx, &dependent, id, &receipts.dependency_receipt).await?; - } - } - - tx.save().await?; - - Ok(()) + if let MainStatus::Running { health: _, started } = status.de()? { + status.ser(&MainStatus::Running { + health: health_results.clone(), + started, + })?; + } + Ok(()) + }) + .await } diff --git a/backend/src/manager/manager_container.rs b/backend/src/manager/manager_container.rs index 198cf70af..a4f44dbb4 100644 --- a/backend/src/manager/manager_container.rs +++ b/backend/src/manager/manager_container.rs @@ -1,21 +1,39 @@ use std::sync::Arc; use std::time::Duration; -use futures::FutureExt; -use patch_db::PatchDbHandle; +use models::OptionExt; use tokio::sync::watch; use tokio::sync::watch::Sender; use tracing::instrument; use super::start_stop::StartStop; use super::{manager_seed, run_main, ManagerPersistentContainer, RunMainResult}; +use crate::prelude::*; use crate::procedure::NoOutput; use crate::s9pk::manifest::Manifest; use crate::status::MainStatus; -use crate::util::{GeneralBoxedGuard, NonDetachingJoinHandle}; +use crate::util::NonDetachingJoinHandle; use crate::Error; -pub type ManageContainerOverride = Arc>>; +pub type ManageContainerOverride = Arc>>; + +pub type Override = MainStatus; + +pub struct OverrideGuard { + override_main_status: Option, +} +impl OverrideGuard { + pub fn drop(self) {} +} +impl Drop for OverrideGuard { + fn drop(&mut self) { + if let Some(override_main_status) = self.override_main_status.take() { + override_main_status.send_modify(|x| { + *x = None; + }); + } + } +} /// This is the thing describing the state machine actor for a service /// state and current running/ desired states. @@ -32,10 +50,12 @@ impl ManageContainer { seed: Arc, persistent_container: ManagerPersistentContainer, ) -> Result { - let mut db = seed.ctx.db.handle(); let current_state = Arc::new(watch::channel(StartStop::Stop).0); let desired_state = Arc::new( - watch::channel::(get_status(&mut db, &seed.manifest).await.into()).0, + watch::channel::( + get_status(seed.ctx.db.peek().await?, &seed.manifest).into(), + ) + .0, ); let override_main_status: ManageContainerOverride = Arc::new(watch::channel(None).0); let service = tokio::spawn(create_service_manager( @@ -63,21 +83,30 @@ impl ManageContainer { /// Set override is used during something like a restart of a service. We want to show certain statuses be different /// from the actual status of the service. - pub fn set_override(&self, override_status: Option) -> GeneralBoxedGuard { + pub fn set_override(&self, override_status: Override) -> Result { + let status = Some(override_status); + if self.override_main_status.borrow().is_some() { + return Err(Error::new( + eyre!("Already have an override"), + ErrorKind::InvalidRequest, + )); + } self.override_main_status - .send_modify(|x| *x = override_status); - let override_main_status = self.override_main_status.clone(); - GeneralBoxedGuard::new(move || { - override_main_status.send_modify(|x| *x = None); + .send_modify(|x| *x = status.clone()); + Ok(OverrideGuard { + override_main_status: Some(self.override_main_status.clone()), }) } /// Set the override, but don't have a guard to revert it. Used only on the mananger to do a shutdown. - pub(super) async fn lock_state_forever(&self, seed: &manager_seed::ManagerSeed) { - let mut db = seed.ctx.db.handle(); - let current_state = get_status(&mut db, &seed.manifest).await; + pub(super) async fn lock_state_forever( + &self, + seed: &manager_seed::ManagerSeed, + ) -> Result<(), Error> { + let current_state = get_status(seed.ctx.db.peek().await?, &seed.manifest); self.override_main_status .send_modify(|x| *x = Some(current_state)); + Ok(()) } /// We want to set the state of the service, like to start or stop @@ -159,7 +188,7 @@ async fn create_service_manager( async fn save_state( desired_state: Arc>, current_state: Arc>, - override_main_status: Arc>>, + override_main_status: ManageContainerOverride, seed: Arc, ) { let mut desired_state_receiver = desired_state.subscribe(); @@ -169,31 +198,24 @@ async fn save_state( let current: StartStop = *current_state_receiver.borrow(); let desired: StartStop = *desired_state_receiver.borrow(); let override_status = override_main_status_receiver.borrow().clone(); - let mut db = seed.ctx.db.handle(); - let res = match (override_status, current, desired) { - (Some(status), _, _) => set_status(&mut db, &seed.manifest, &status).await, - (None, StartStop::Start, StartStop::Start) => { - set_status( - &mut db, - &seed.manifest, - &MainStatus::Running { - started: chrono::Utc::now(), - health: Default::default(), - }, - ) - .await - } - (None, StartStop::Start, StartStop::Stop) => { - set_status(&mut db, &seed.manifest, &MainStatus::Stopping).await - } - (None, StartStop::Stop, StartStop::Start) => { - set_status(&mut db, &seed.manifest, &MainStatus::Starting).await - } - (None, StartStop::Stop, StartStop::Stop) => { - set_status(&mut db, &seed.manifest, &MainStatus::Stopped).await - } + let status = match (override_status.clone(), current, desired) { + (Some(status), _, _) => status, + (_, StartStop::Start, StartStop::Start) => MainStatus::Running { + started: chrono::Utc::now(), + health: Default::default(), + }, + (_, StartStop::Start, StartStop::Stop) => MainStatus::Stopping, + (_, StartStop::Stop, StartStop::Start) => MainStatus::Starting, + (_, StartStop::Stop, StartStop::Stop) => MainStatus::Stopped, }; - if let Err(err) = res { + + let manifest = &seed.manifest; + if let Err(err) = seed + .ctx + .db + .mutate(|db| set_status(db, manifest, &status)) + .await + { tracing::error!("Did not set status for {}", seed.container_name); tracing::debug!("{:?}", err); } @@ -238,40 +260,6 @@ async fn run_main_log_result(result: RunMainResult, seed: Arc (), // restart Ok(Err(e)) => { - #[cfg(feature = "unstable")] - { - use crate::notifications::NotificationLevel; - let mut db = seed.ctx.db.handle(); - let started = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&seed.manifest.id) - .and_then(|pde| pde.installed()) - .map::<_, MainStatus>(|i| i.status().main()) - .get(&mut db) - .await; - match started.as_deref() { - Ok(Some(MainStatus::Running { .. })) => { - let res = seed.ctx.notification_manager - .notify( - &mut db, - Some(seed.manifest.id.clone()), - NotificationLevel::Warning, - String::from("Service Crashed"), - format!("The service {} has crashed with the following exit code: {}\nDetails: {}", seed.manifest.id.clone(), e.0, e.1), - (), - Some(3600) // 1 hour - ) - .await; - if let Err(e) = res { - tracing::error!("Failed to issue notification: {}", e); - tracing::debug!("{:?}", e); - } - } - _ => { - tracing::error!("service just started. not issuing crash notification") - } - } - } tracing::error!( "The service {} has crashed with the following exit code: {}", seed.manifest.id.clone(), @@ -289,55 +277,24 @@ async fn run_main_log_result(result: RunMainResult, seed: Arc MainStatus { - async move { - Ok::<_, Error>( - crate::db::DatabaseModel::new() - .package_data() - .idx_model(&manifest.id) - .expect(db) - .await? - .installed() - .expect(db) - .await? - .status() - .main() - .get(db) - .await? - .clone(), - ) - } - .map(|x| x.unwrap_or_else(|_| MainStatus::Stopped)) - .await +pub(super) fn get_status(db: Peeked, manifest: &Manifest) -> MainStatus { + db.as_package_data() + .as_idx(&manifest.id) + .and_then(|x| x.as_installed()) + .filter(|x| x.as_manifest().as_version().de().ok() == Some(manifest.version.clone())) + .and_then(|x| x.as_status().as_main().de().ok()) + .unwrap_or(MainStatus::Stopped) } #[instrument(skip(db, manifest))] -async fn set_status( - db: &mut PatchDbHandle, - manifest: &Manifest, - main_status: &MainStatus, -) -> Result<(), Error> { - if crate::db::DatabaseModel::new() - .package_data() - .idx_model(&manifest.id) - .expect(db) - .await? - .installed() - .exists(db) - .await? - { - crate::db::DatabaseModel::new() - .package_data() - .idx_model(&manifest.id) - .expect(db) - .await? - .installed() - .expect(db) - .await? - .status() - .main() - .put(db, main_status) - .await?; - } - Ok(()) +fn set_status(db: &mut Peeked, manifest: &Manifest, main_status: &MainStatus) -> Result<(), Error> { + let Some(installed) = db + .as_package_data_mut() + .as_idx_mut(&manifest.id) + .or_not_found(&manifest.id)? + .as_installed_mut() + else { + return Ok(()); + }; + installed.as_status_mut().as_main_mut().ser(main_status) } diff --git a/backend/src/manager/manager_map.rs b/backend/src/manager/manager_map.rs index 0e4f39db7..07f128ccd 100644 --- a/backend/src/manager/manager_map.rs +++ b/backend/src/manager/manager_map.rs @@ -2,13 +2,12 @@ use std::collections::BTreeMap; use std::sync::Arc; use color_eyre::eyre::eyre; -use patch_db::DbHandle; -use sqlx::{Executor, Postgres}; use tokio::sync::RwLock; use tracing::instrument; use super::Manager; use crate::context::RpcContext; +use crate::prelude::*; use crate::s9pk::manifest::{Manifest, PackageId}; use crate::util::Version; use crate::Error; @@ -18,31 +17,16 @@ use crate::Error; pub struct ManagerMap(RwLock>>); impl ManagerMap { #[instrument(skip_all)] - pub async fn init( - &self, - ctx: &RpcContext, - db: &mut Db, - secrets: &mut Ex, - ) -> Result<(), Error> - where - for<'a> &'a mut Ex: Executor<'a, Database = Postgres>, - { + pub async fn init(&self, ctx: RpcContext, peeked: Peeked) -> Result<(), Error> { let mut res = BTreeMap::new(); - for package in crate::db::DatabaseModel::new() - .package_data() - .keys(db) - .await? - { - let man: Manifest = if let Some(manifest) = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&package) - .and_then(|pkg| pkg.installed()) - .map(|m| m.manifest()) - .get(db) - .await? - .to_owned() + for package in peeked.as_package_data().keys()? { + let man: Manifest = if let Some(manifest) = peeked + .as_package_data() + .as_idx(&package) + .and_then(|x| x.as_installed()) + .map(|x| x.as_manifest().de()) { - manifest + manifest? } else { continue; }; @@ -58,14 +42,15 @@ impl ManagerMap { /// Used during the install process #[instrument(skip_all)] - pub async fn add(&self, ctx: RpcContext, manifest: Manifest) -> Result<(), Error> { + pub async fn add(&self, ctx: RpcContext, manifest: Manifest) -> Result, Error> { let mut lock = self.0.write().await; let id = (manifest.id.clone(), manifest.version.clone()); if let Some(man) = lock.remove(&id) { man.exit().await; } - lock.insert(id, Arc::new(Manager::new(ctx, manifest).await?)); - Ok(()) + let manager = Arc::new(Manager::new(ctx.clone(), manifest).await?); + lock.insert(id, manager.clone()); + Ok(manager) } /// This is ran during the cleanup, so when we are uninstalling the service @@ -83,7 +68,7 @@ impl ManagerMap { futures::future::join_all(std::mem::take(&mut *self.0.write().await).into_iter().map( |((id, version), man)| async move { tracing::debug!("Manager for {}@{} shutting down", id, version); - man.shutdown().await; + man.shutdown().await?; tracing::debug!("Manager for {}@{} is shutdown", id, version); if let Err(e) = Arc::try_unwrap(man) { tracing::trace!( diff --git a/backend/src/manager/manager_seed.rs b/backend/src/manager/manager_seed.rs index c0ea72b5f..890e4a886 100644 --- a/backend/src/manager/manager_seed.rs +++ b/backend/src/manager/manager_seed.rs @@ -1,5 +1,4 @@ use models::ErrorKind; -use tokio_stream::StreamExt; use crate::context::RpcContext; use crate::s9pk::manifest::Manifest; diff --git a/backend/src/manager/mod.rs b/backend/src/manager/mod.rs index 875e3eeff..ceb535302 100644 --- a/backend/src/manager/mod.rs +++ b/backend/src/manager/mod.rs @@ -9,18 +9,14 @@ use embassy_container_init::ProcessGroupId; use futures::future::BoxFuture; use futures::{Future, FutureExt, TryFutureExt}; use helpers::UnixRpcClient; -use models::{ErrorKind, PackageId}; +use models::{ErrorKind, OptionExt, PackageId}; use nix::sys::signal::Signal; -use patch_db::DbHandle; use persistent_container::PersistentContainer; use rand::SeedableRng; use sqlx::Connection; use start_stop::StartStop; -use tokio::sync::oneshot; -use tokio::sync::{ - watch::{self, Sender}, - Mutex, -}; +use tokio::sync::watch::{self, Sender}; +use tokio::sync::{oneshot, Mutex}; use tracing::instrument; use transition_state::TransitionState; @@ -28,18 +24,18 @@ use crate::backup::target::PackageBackupInfo; use crate::backup::PackageBackupReport; use crate::config::action::ConfigRes; use crate::config::spec::ValueSpecPointer; -use crate::config::{not_found, ConfigReceipts, ConfigureContext}; +use crate::config::ConfigureContext; use crate::context::RpcContext; use crate::db::model::{CurrentDependencies, CurrentDependencyInfo}; use crate::dependencies::{ - add_dependent_to_current_dependents_lists, break_transitive, heal_all_dependents_transitive, - DependencyError, DependencyErrors, TaggedDependencyError, + add_dependent_to_current_dependents_lists, compute_dependency_config_errs, }; use crate::disk::mount::backup::BackupMountGuard; use crate::disk::mount::guard::TmpMountGuard; use crate::install::cleanup::remove_from_current_dependents_lists; use crate::net::net_controller::NetService; use crate::net::vhost::AlpnInfo; +use crate::prelude::*; use crate::procedure::docker::{DockerContainer, DockerProcedure, LongRunning}; use crate::procedure::{NoOutput, ProcedureName}; use crate::s9pk::manifest::Manifest; @@ -152,7 +148,7 @@ impl Manager { self._transition_abort(); self.manage_container.to_desired(StartStop::Stop); } - pub async fn restart(&self) { + pub fn restart(&self) { if self._is_transition_restart() { return; } @@ -161,7 +157,7 @@ impl Manager { pub async fn configure( &self, configure_context: ConfigureContext, - ) -> Result, Error> { + ) -> Result, Error> { if self._is_transition_configure() { return Ok(configure_context.breakages); } @@ -204,10 +200,11 @@ impl Manager { } /// A special exit that is overridden the start state, should only be called in the shutdown, where we remove other containers - async fn shutdown(&self) { - self.manage_container.lock_state_forever(&self.seed).await; + async fn shutdown(&self) -> Result<(), Error> { + self.manage_container.lock_state_forever(&self.seed).await?; self.exit().await; + Ok(()) } /// Used when we want to shutdown the service @@ -229,7 +226,7 @@ impl Manager { .send_replace(Default::default()) .join_handle() { - (&**transition).abort(); + (**transition).abort(); } } fn _transition_replace(&self, transition_state: TransitionState) { @@ -238,13 +235,14 @@ impl Manager { .abort(); } - pub(super) fn perform_restart(&self) -> impl Future + 'static { + pub(super) fn perform_restart(&self) -> impl Future> + 'static { let manage_container = self.manage_container.clone(); async move { - let restart_override = manage_container.set_override(Some(MainStatus::Restarting)); + let restart_override = manage_container.set_override(MainStatus::Restarting)?; manage_container.wait_for_desired(StartStop::Stop).await; manage_container.wait_for_desired(StartStop::Start).await; - drop(restart_override); + restart_override.drop(); + Ok(()) } } fn _transition_restart(&self) -> TransitionState { @@ -252,7 +250,9 @@ impl Manager { let restart = self.perform_restart(); TransitionState::Restarting( tokio::spawn(async move { - restart.await; + if let Err(err) = restart.await { + tracing::error!("Error restarting service: {}", err); + } transition.send_replace(Default::default()); }) .into(), @@ -261,37 +261,42 @@ impl Manager { fn perform_backup( &self, backup_guard: BackupGuard, - ) -> impl Future, Error>> + 'static { + ) -> impl Future, Error>> { let manage_container = self.manage_container.clone(); let seed = self.seed.clone(); async move { + let peek = seed.ctx.db.peek().await?; let state_reverter = DesiredStateReverter::new(manage_container.clone()); - let mut tx = seed.ctx.db.handle(); - let override_guard = manage_container - .set_override(Some(get_status(&mut tx, &seed.manifest).await.backing_up())); + let override_guard = + manage_container.set_override(get_status(peek, &seed.manifest).backing_up())?; manage_container.wait_for_desired(StartStop::Stop).await; let backup_guard = backup_guard.lock().await; let guard = backup_guard.mount_package_backup(&seed.manifest.id).await?; - let res = seed - .manifest - .backup - .create( - &seed.ctx, - &mut tx, - &seed.manifest.id, - &seed.manifest.title, - &seed.manifest.version, - &seed.manifest.interfaces, - &seed.manifest.volumes, - ) - .await; + let return_value = seed.manifest.backup.create(seed.clone()).await; guard.unmount().await?; drop(backup_guard); - let return_value = res; + let manifest_id = seed.manifest.id.clone(); + seed.ctx + .db + .mutate(|db| { + if let Some(progress) = db + .as_server_info_mut() + .as_status_info_mut() + .as_backup_progress_mut() + .transpose_mut() + .and_then(|p| p.as_idx_mut(&manifest_id)) + { + progress.as_complete_mut().ser(&true)?; + } + Ok(()) + }) + .await?; + state_reverter.revert().await; - drop(override_guard); + + override_guard.drop(); Ok::<_, Error>(return_value) } } @@ -300,11 +305,13 @@ impl Manager { backup_guard: BackupGuard, ) -> (TransitionState, BoxFuture) { let (send, done) = oneshot::channel(); + + let transition_state = self.transition.clone(); ( TransitionState::BackingUp( tokio::spawn( self.perform_backup(backup_guard) - .then(finish_up_backup_task(self.transition.clone(), send)), + .then(finish_up_backup_task(transition_state, send)), ) .into(), ), @@ -332,42 +339,29 @@ async fn configure( ctx: RpcContext, id: PackageId, mut configure_context: ConfigureContext, -) -> Result, Error> { - let mut db = ctx.db.handle(); - let mut tx = db.begin().await?; - let db = &mut tx; - - let receipts = ConfigReceipts::new(db).await?; +) -> Result, Error> { + let db = ctx.db.peek().await?; let id = &id; let ctx = &ctx; let overrides = &mut configure_context.overrides; // fetch data from db - let action = receipts - .config_actions - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; - let dependencies = receipts - .dependencies - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; - let volumes = receipts - .volumes - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; - let version = receipts - .version - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; + let manifest = db + .as_package_data() + .as_idx(id) + .or_not_found(id)? + .as_manifest() + .de()?; // get current config and current spec let ConfigRes { config: old_config, spec, - } = action.get(ctx, id, &version, &volumes).await?; + } = manifest + .config + .as_ref() + .or_not_found("Manifest config")? + .get(ctx, id, &manifest.version, &manifest.volumes) + .await?; // determine new config to use let mut config = if let Some(config) = configure_context.config.or_else(|| old_config.clone()) { @@ -379,31 +373,22 @@ async fn configure( )? }; - let manifest = receipts - .manifest - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; - spec.validate(&manifest)?; spec.matches(&config)?; // check that new config matches spec - spec.update( - ctx, - db, - &manifest, - overrides, - &mut config, - &receipts.config_receipts, - ) - .await?; // dereference pointers in the new config - // create backreferences to pointers - let mut sys = receipts - .system_pointers - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; - sys.truncate(0); + // TODO Commit or not? + spec.update(ctx, &manifest, overrides, &mut config).await?; // dereference pointers in the new config + + let manifest = db + .as_package_data() + .as_idx(id) + .or_not_found(id)? + .as_installed() + .or_not_found(id)? + .as_manifest() + .de()?; + + let dependencies = &manifest.dependencies; let mut current_dependencies: CurrentDependencies = CurrentDependencies( dependencies .0 @@ -420,29 +405,32 @@ async fn configure( for ptr in spec.pointers(&config)? { match ptr { ValueSpecPointer::Package(pkg_ptr) => { - if let Some(current_dependency) = - current_dependencies.0.get_mut(pkg_ptr.package_id()) - { - current_dependency.pointers.push(pkg_ptr); + if let Some(info) = current_dependencies.0.get_mut(pkg_ptr.package_id()) { + info.pointers.insert(pkg_ptr); } else { + let id = pkg_ptr.package_id().to_owned(); + let mut pointers = BTreeSet::new(); + pointers.insert(pkg_ptr); current_dependencies.0.insert( - pkg_ptr.package_id().to_owned(), + id, CurrentDependencyInfo { - pointers: vec![pkg_ptr], + pointers, health_checks: BTreeSet::new(), }, ); } } - ValueSpecPointer::System(s) => sys.push(s), + ValueSpecPointer::System(_) => (), } } - receipts.system_pointers.set(db, sys, id).await?; + let action = manifest.config.as_ref().or_not_found(id)?; + let version = &manifest.version; + let volumes = &manifest.volumes; if !configure_context.dry_run { // run config action let res = action - .set(ctx, id, &version, &dependencies, &volumes, &config) + .set(ctx, id, version, &dependencies, volumes, &config) .await?; // track dependencies with no pointers @@ -453,7 +441,7 @@ async fn configure( current_dependencies.0.insert( package_id, CurrentDependencyInfo { - pointers: Vec::new(), + pointers: BTreeSet::new(), health_checks, }, ); @@ -475,47 +463,9 @@ async fn configure( }); } - // update dependencies - let prev_current_dependencies = receipts - .current_dependencies - .get(db, id) - .await? - .unwrap_or_default(); - remove_from_current_dependents_lists( - db, - id, - &prev_current_dependencies, - &receipts.current_dependents, - ) - .await?; // remove previous - add_dependent_to_current_dependents_lists( - db, - id, - ¤t_dependencies, - &receipts.current_dependents, - ) - .await?; // add new - current_dependencies.0.remove(id); - receipts - .current_dependencies - .set(db, current_dependencies.clone(), id) - .await?; - - let errs = receipts - .dependency_errors - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; - tracing::warn!("Dependency Errors: {:?}", errs); - let errs = DependencyErrors::init( - ctx, - db, - &manifest, - ¤t_dependencies, - &receipts.dependency_receipt.try_heal, - ) - .await?; - receipts.dependency_errors.set(db, errs, id).await?; + let dependency_config_errs = + compute_dependency_config_errs(&ctx, &db, &manifest, ¤t_dependencies, overrides) + .await?; // cache current config for dependents configure_context @@ -523,29 +473,41 @@ async fn configure( .insert(id.clone(), config.clone()); // handle dependents - let dependents = receipts - .current_dependents - .get(db, id) - .await? - .ok_or_else(|| not_found!(id))?; + + let dependents = db + .as_package_data() + .as_idx(id) + .or_not_found(id)? + .as_installed() + .or_not_found(id)? + .as_current_dependents() + .de()?; for (dependent, _dep_info) in dependents.0.iter().filter(|(dep_id, _)| dep_id != &id) { - let dependent_container = receipts.docker_containers.get(db, dependent).await?; - let dependent_container = &dependent_container; // check if config passes dependent check - if let Some(cfg) = receipts - .manifest_dependencies_config - .get(db, (dependent, id)) - .await? + if let Some(cfg) = db + .as_package_data() + .as_idx(dependent) + .or_not_found(dependent)? + .as_installed() + .or_not_found(dependent)? + .as_manifest() + .as_dependencies() + .as_idx(id) + .or_not_found(id)? + .as_config() + .de()? { - let manifest = receipts - .manifest - .get(db, dependent) - .await? - .ok_or_else(|| not_found!(id))?; + let manifest = db + .as_package_data() + .as_idx(dependent) + .or_not_found(dependent)? + .as_installed() + .or_not_found(dependent)? + .as_manifest() + .de()?; if let Err(error) = cfg .check( ctx, - dependent_container, dependent, &manifest.version, &manifest.volumes, @@ -554,28 +516,49 @@ async fn configure( ) .await? { - let dep_err = DependencyError::ConfigUnsatisfied { error }; - break_transitive( - db, - dependent, - id, - dep_err, - &mut configure_context.breakages, - &receipts.break_transitive_receipts, - ) - .await?; + configure_context.breakages.insert(dependent.clone(), error); } - - heal_all_dependents_transitive(ctx, db, id, &receipts.dependency_receipt).await?; } } - receipts.configured.set(db, true, id).await?; - - if configure_context.dry_run { - tx.abort().await?; - } else { - tx.commit().await?; + if !configure_context.dry_run { + return ctx + .db + .mutate(move |db| { + remove_from_current_dependents_lists(db, id, ¤t_dependencies)?; + add_dependent_to_current_dependents_lists(db, id, ¤t_dependencies)?; + current_dependencies.0.remove(id); + for (dep, errs) in db + .as_package_data_mut() + .as_entries_mut()? + .into_iter() + .filter_map(|(id, pde)| { + pde.as_installed_mut() + .map(|i| (id, i.as_status_mut().as_dependency_config_errors_mut())) + }) + { + errs.remove(id)?; + if let Some(err) = configure_context.breakages.get(&dep) { + errs.insert(id, err)?; + } + } + let installed = db + .as_package_data_mut() + .as_idx_mut(id) + .or_not_found(id)? + .as_installed_mut() + .or_not_found(id)?; + installed + .as_current_dependencies_mut() + .ser(¤t_dependencies)?; + let status = installed.as_status_mut(); + status.as_configured_mut().ser(&true)?; + status + .as_dependency_config_errors_mut() + .ser(&dependency_config_errs)?; + Ok(configure_context.breakages) + }) + .await; // add new } Ok(configure_context.breakages) @@ -746,7 +729,7 @@ async fn get_long_running_ip(seed: &ManagerSeed, runtime: &mut LongRunning) -> G Ok(Some(ip_addr)) => return GetRunningIp::Ip(ip_addr), Ok(None) => (), Err(e) if e.kind == ErrorKind::NotFound => (), - Err(e) => return GetRunningIp::Error(e.into()), + Err(e) => return GetRunningIp::Error(e), } if let Poll::Ready(res) = futures::poll!(&mut runtime.running_output) { match res { @@ -808,8 +791,7 @@ async fn remove_network_for_main(svc: NetService) -> Result<(), Error> { async fn main_health_check_daemon(seed: Arc) { tokio::time::sleep(Duration::from_secs(HEALTH_CHECK_GRACE_PERIOD_SECONDS)).await; loop { - let mut db = seed.ctx.db.handle(); - if let Err(e) = health::check(&seed.ctx, &mut db, &seed.manifest.id).await { + if let Err(e) = health::check(&seed.ctx, &seed.manifest.id).await { tracing::error!( "Failed to run health check for {}: {}", &seed.manifest.id, @@ -830,7 +812,7 @@ async fn get_running_ip(seed: &ManagerSeed, mut runtime: &mut RuntimeOfCommand) Ok(Some(ip_addr)) => return GetRunningIp::Ip(ip_addr), Ok(None) => (), Err(e) if e.kind == ErrorKind::NotFound => (), - Err(e) => return GetRunningIp::Error(e.into()), + Err(e) => return GetRunningIp::Error(e), } if let Poll::Ready(res) = futures::poll!(&mut runtime) { match res { diff --git a/backend/src/manager/start_stop.rs b/backend/src/manager/start_stop.rs index 66d0b112b..3842abe57 100644 --- a/backend/src/manager/start_stop.rs +++ b/backend/src/manager/start_stop.rs @@ -18,9 +18,15 @@ impl From for StartStop { MainStatus::Restarting => StartStop::Start, MainStatus::Stopping => StartStop::Stop, MainStatus::Starting => StartStop::Start, - MainStatus::Running { started, health } => StartStop::Start, - MainStatus::BackingUp { started, health } if started.is_some() => StartStop::Start, - MainStatus::BackingUp { started, health } => StartStop::Stop, + MainStatus::Running { + started: _, + health: _, + } => StartStop::Start, + MainStatus::BackingUp { started, health: _ } if started.is_some() => StartStop::Start, + MainStatus::BackingUp { + started: _, + health: _, + } => StartStop::Stop, } } } diff --git a/backend/src/marketplace.rs b/backend/src/marketplace.rs index 40b81d1cb..6c0bcb96a 100644 --- a/backend/src/marketplace.rs +++ b/backend/src/marketplace.rs @@ -12,7 +12,7 @@ pub fn marketplace() -> Result<(), Error> { Ok(()) } -pub fn with_query_params(ctx: &RpcContext, mut url: Url) -> Url { +pub fn with_query_params(ctx: RpcContext, mut url: Url) -> Url { url.query_pairs_mut() .append_pair( "os.version", @@ -38,7 +38,7 @@ pub fn with_query_params(ctx: &RpcContext, mut url: Url) -> Url { pub async fn get(#[context] ctx: RpcContext, #[arg] url: Url) -> Result { let mut response = ctx .client - .get(with_query_params(&ctx, url)) + .get(with_query_params(ctx.clone(), url)) .send() .await .with_kind(crate::ErrorKind::Network)?; diff --git a/backend/src/migration.rs b/backend/src/migration.rs index 3961907e7..13f14c7c3 100644 --- a/backend/src/migration.rs +++ b/backend/src/migration.rs @@ -10,6 +10,7 @@ use serde::{Deserialize, Serialize}; use tracing::instrument; use crate::context::RpcContext; +use crate::prelude::*; use crate::procedure::docker::DockerContainers; use crate::procedure::{PackageProcedure, ProcedureName}; use crate::s9pk::manifest::PackageId; @@ -19,6 +20,7 @@ use crate::{Error, ResultExt}; #[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct Migrations { pub from: IndexMap, pub to: IndexMap, @@ -27,7 +29,7 @@ impl Migrations { #[instrument(skip_all)] pub fn validate( &self, - container: &Option, + _container: &Option, eos_version: &Version, volumes: &Volumes, image_ids: &BTreeSet, @@ -58,7 +60,7 @@ impl Migrations { #[instrument(skip_all)] pub fn from<'a>( &'a self, - container: &'a Option, + _container: &'a Option, ctx: &'a RpcContext, version: &'a Version, pkg_id: &'a PackageId, @@ -133,6 +135,7 @@ impl Migrations { #[derive(Clone, Debug, Default, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct MigrationRes { pub configured: bool, } diff --git a/backend/src/net/dhcp.rs b/backend/src/net/dhcp.rs index ccf2b109f..cbe7ff19d 100644 --- a/backend/src/net/dhcp.rs +++ b/backend/src/net/dhcp.rs @@ -8,6 +8,7 @@ use tokio::sync::RwLock; use crate::context::RpcContext; use crate::db::model::IpInfo; use crate::net::utils::{iface_is_physical, list_interfaces}; +use crate::prelude::*; use crate::util::display_none; use crate::Error; @@ -58,12 +59,14 @@ pub async fn dhcp() -> Result<(), Error> { pub async fn update(#[context] ctx: RpcContext, #[arg] interface: String) -> Result<(), Error> { if iface_is_physical(&interface).await { let ip_info = IpInfo::for_interface(&interface).await?; - crate::db::DatabaseModel::new() - .server_info() - .ip_info() - .idx_model(&interface) - .put(&mut ctx.db.handle(), &ip_info) + ctx.db + .mutate(|db| { + db.as_server_info_mut() + .as_ip_info_mut() + .insert(&interface, &ip_info) + }) .await?; + let mut cached = CACHED_IPS.write().await; if cached.is_empty() { *cached = _ips().await?; diff --git a/backend/src/net/dns.rs b/backend/src/net/dns.rs index a8910f698..c2e445ba6 100644 --- a/backend/src/net/dns.rs +++ b/backend/src/net/dns.rs @@ -50,17 +50,15 @@ impl Resolver { } else { None } + } else if let Some(ip) = self.services.read().await.get(&None) { + Some( + ip.iter() + .filter(|(_, rc)| rc.strong_count() > 0) + .map(|(ip, _)| *ip) + .collect(), + ) } else { - if let Some(ip) = self.services.read().await.get(&None) { - Some( - ip.iter() - .filter(|(_, rc)| rc.strong_count() > 0) - .map(|(ip, _)| *ip) - .collect(), - ) - } else { - None - } + None } } _ => None, diff --git a/backend/src/net/interface.rs b/backend/src/net/interface.rs index c7929ab65..a055bb277 100644 --- a/backend/src/net/interface.rs +++ b/backend/src/net/interface.rs @@ -4,10 +4,10 @@ use indexmap::IndexSet; pub use models::InterfaceId; use serde::{Deserialize, Deserializer, Serialize}; use sqlx::{Executor, Postgres}; -use torut::onion::TorSecretKeyV3; use tracing::instrument; use crate::db::model::{InterfaceAddressMap, InterfaceAddresses}; +use crate::net::keys::Key; use crate::s9pk::manifest::PackageId; use crate::util::serde::Port; use crate::{Error, ResultExt}; @@ -44,33 +44,13 @@ impl Interfaces { lan_address: None, }; if iface.tor_config.is_some() || iface.lan_config.is_some() { - let key = TorSecretKeyV3::generate(); - let key_vec = key.as_bytes().to_vec(); - sqlx::query!( - "INSERT INTO tor (package, interface, key) VALUES ($1, $2, $3) ON CONFLICT (package, interface) DO NOTHING", - **package_id, - **id, - key_vec, - ) - .execute(&mut *secrets) - .await?; - let key_row = sqlx::query!( - "SELECT key FROM tor WHERE package = $1 AND interface = $2", - **package_id, - **id, - ) - .fetch_one(&mut *secrets) - .await?; - let mut key = [0_u8; 64]; - key.clone_from_slice(&key_row.key); - let key = TorSecretKeyV3::from(key); - let onion = key.public().get_onion_address(); + let key = + Key::for_interface(secrets, Some((package_id.clone(), id.clone()))).await?; if iface.tor_config.is_some() { - addrs.tor_address = Some(onion.to_string()); + addrs.tor_address = Some(key.tor_address().to_string()); } if iface.lan_config.is_some() { - addrs.lan_address = - Some(format!("{}.local", onion.get_address_without_dot_onion())); + addrs.lan_address = Some(key.local_address()); } } interface_addresses.0.insert(id.clone(), addrs); diff --git a/backend/src/net/keys.rs b/backend/src/net/keys.rs index d406df9c0..50193e328 100644 --- a/backend/src/net/keys.rs +++ b/backend/src/net/keys.rs @@ -21,8 +21,8 @@ async fn compat( if let Some((package, interface)) = interface { if let Some(r) = sqlx::query!( "SELECT key FROM tor WHERE package = $1 AND interface = $2", - **package, - **interface + package, + interface ) .fetch_optional(secrets) .await? @@ -31,16 +31,14 @@ async fn compat( } else { Ok(None) } + } else if let Some(key) = sqlx::query!("SELECT tor_key FROM account WHERE id = 0") + .fetch_one(secrets) + .await? + .tor_key + { + Ok(Some(ExpandedSecretKey::from_bytes(&key)?)) } else { - if let Some(key) = sqlx::query!("SELECT tor_key FROM account WHERE id = 0") - .fetch_one(secrets) - .await? - .tor_key - { - Ok(Some(ExpandedSecretKey::from_bytes(&key)?)) - } else { - Ok(None) - } + Ok(None) } } @@ -150,7 +148,7 @@ impl Key { WHERE network_keys.package = $1 "#, - **package + package ) .fetch_all(secrets) .await? @@ -194,8 +192,8 @@ impl Key { let k = tentative.as_slice(); let actual = sqlx::query!( "INSERT INTO network_keys (package, interface, key) VALUES ($1, $2, $3) ON CONFLICT (package, interface) DO UPDATE SET package = EXCLUDED.package RETURNING key", - **pkg, - **iface, + pkg, + iface, k, ) .fetch_one(&mut *secrets) diff --git a/backend/src/net/tor.rs b/backend/src/net/tor.rs index dcccbfe54..d1d8f0b80 100644 --- a/backend/src/net/tor.rs +++ b/backend/src/net/tor.rs @@ -617,7 +617,7 @@ async fn torctl( let mut last_success = Instant::now(); loop { tokio::time::sleep(Duration::from_secs(30)).await; - if let Err(e) = tokio::time::timeout( + if tokio::time::timeout( Duration::from_secs(30), tokio_socks::tcp::Socks5Stream::connect( tor_socks, @@ -627,6 +627,7 @@ async fn torctl( .await .map_err(|e| e.to_string()) .and_then(|e| e.map_err(|e| e.to_string())) + .is_err() { if last_success.elapsed() > *health_timeout { let err = Error::new(eyre!("Tor health check failed for longer than current timeout ({health_timeout:?})"), crate::ErrorKind::Tor); diff --git a/backend/src/net/wifi.rs b/backend/src/net/wifi.rs index 5ed233856..d0d0dc6c0 100644 --- a/backend/src/net/wifi.rs +++ b/backend/src/net/wifi.rs @@ -6,7 +6,6 @@ use std::time::Duration; use clap::ArgMatches; use isocountry::CountryCode; use lazy_static::lazy_static; -use patch_db::DbHandle; use regex::Regex; use rpc_toolkit::command; use tokio::process::Command; @@ -14,6 +13,7 @@ use tokio::sync::RwLock; use tracing::instrument; use crate::context::RpcContext; +use crate::prelude::*; use crate::util::serde::{display_serializable, IoFormat}; use crate::util::{display_none, Invoke}; use crate::{Error, ErrorKind}; @@ -52,8 +52,6 @@ pub async fn add( #[context] ctx: RpcContext, #[arg] ssid: String, #[arg] password: String, - #[arg] priority: isize, - #[arg] connect: bool, ) -> Result<(), Error> { let wifi_manager = wifi_manager(&ctx)?; if !ssid.is_ascii() { @@ -69,26 +67,22 @@ pub async fn add( )); } async fn add_procedure( - db: impl DbHandle, + db: PatchDb, wifi_manager: WifiManager, ssid: &Ssid, password: &Psk, - priority: isize, ) -> Result<(), Error> { tracing::info!("Adding new WiFi network: '{}'", ssid.0); let mut wpa_supplicant = wifi_manager.write().await; - wpa_supplicant - .add_network(db, ssid, password, priority) - .await?; + wpa_supplicant.add_network(db, ssid, password).await?; drop(wpa_supplicant); Ok(()) } if let Err(err) = add_procedure( - &mut ctx.db.handle(), + ctx.db.clone(), wifi_manager.clone(), &Ssid(ssid.clone()), &Psk(password.clone()), - priority, ) .await { @@ -113,7 +107,7 @@ pub async fn connect(#[context] ctx: RpcContext, #[arg] ssid: String) -> Result< )); } async fn connect_procedure( - mut db: impl DbHandle, + db: PatchDb, wifi_manager: WifiManager, ssid: &Ssid, ) -> Result<(), Error> { @@ -121,7 +115,7 @@ pub async fn connect(#[context] ctx: RpcContext, #[arg] ssid: String) -> Result< let current = wpa_supplicant.get_current_network().await?; drop(wpa_supplicant); let mut wpa_supplicant = wifi_manager.write().await; - let connected = wpa_supplicant.select_network(&mut db, ssid).await?; + let connected = wpa_supplicant.select_network(db.clone(), ssid).await?; if connected { tracing::info!("Successfully connected to WiFi: '{}'", ssid.0); } else { @@ -131,19 +125,15 @@ pub async fn connect(#[context] ctx: RpcContext, #[arg] ssid: String) -> Result< tracing::info!("No WiFi to revert to!"); } Some(current) => { - wpa_supplicant.select_network(&mut db, ¤t).await?; + wpa_supplicant.select_network(db, ¤t).await?; } } } Ok(()) } - if let Err(err) = connect_procedure( - &mut ctx.db.handle(), - wifi_manager.clone(), - &Ssid(ssid.clone()), - ) - .await + if let Err(err) = + connect_procedure(ctx.db.clone(), wifi_manager.clone(), &Ssid(ssid.clone())).await { tracing::error!("Failed to connect to WiFi network '{}': {}", &ssid, err); return Err(Error::new( @@ -176,9 +166,7 @@ pub async fn delete(#[context] ctx: RpcContext, #[arg] ssid: String) -> Result<( return Err(Error::new(color_eyre::eyre::eyre!("Forbidden: Deleting this network would make your server unreachable. Either connect to ethernet or connect to a different WiFi network to remedy this."), ErrorKind::Wifi)); } - wpa_supplicant - .remove_network(&mut ctx.db.handle(), &ssid) - .await?; + wpa_supplicant.remove_network(ctx.db.clone(), &ssid).await?; Ok(()) } #[derive(serde::Serialize, serde::Deserialize)] @@ -397,7 +385,7 @@ pub async fn set_country( } wpa_supplicant.remove_all_connections().await?; - wpa_supplicant.save_config(&mut ctx.db.handle()).await?; + wpa_supplicant.save_config(ctx.db.clone()).await?; Ok(()) } @@ -645,13 +633,14 @@ impl WpaCli { Ok(()) } - pub async fn save_config(&mut self, mut db: impl DbHandle) -> Result<(), Error> { - crate::db::DatabaseModel::new() - .server_info() - .last_wifi_region() - .put(&mut db, &Some(self.get_country_low().await?)) - .await?; - Ok(()) + pub async fn save_config(&mut self, db: PatchDb) -> Result<(), Error> { + let new_country = Some(self.get_country_low().await?); + db.mutate(|d| { + d.as_server_info_mut() + .as_last_wifi_region_mut() + .ser(&new_country) + }) + .await } async fn check_active_network(&self, ssid: &Ssid) -> Result, Error> { Ok(self @@ -682,7 +671,7 @@ impl WpaCli { .collect()) } #[instrument(skip_all)] - pub async fn select_network(&mut self, db: impl DbHandle, ssid: &Ssid) -> Result { + pub async fn select_network(&mut self, db: PatchDb, ssid: &Ssid) -> Result { let m_id = self.check_active_network(ssid).await?; match m_id { None => Err(Error::new( @@ -734,7 +723,7 @@ impl WpaCli { } } #[instrument(skip_all)] - pub async fn remove_network(&mut self, db: impl DbHandle, ssid: &Ssid) -> Result { + pub async fn remove_network(&mut self, db: PatchDb, ssid: &Ssid) -> Result { let found_networks = self.find_networks(ssid).await?; if found_networks.is_empty() { return Ok(true); @@ -748,23 +737,16 @@ impl WpaCli { #[instrument(skip_all)] pub async fn set_add_network( &mut self, - db: impl DbHandle, + db: PatchDb, ssid: &Ssid, psk: &Psk, - priority: isize, ) -> Result<(), Error> { self.set_add_network_low(ssid, psk).await?; self.save_config(db).await?; Ok(()) } #[instrument(skip_all)] - pub async fn add_network( - &mut self, - db: impl DbHandle, - ssid: &Ssid, - psk: &Psk, - priority: isize, - ) -> Result<(), Error> { + pub async fn add_network(&mut self, db: PatchDb, ssid: &Ssid, psk: &Psk) -> Result<(), Error> { self.add_network_low(ssid, psk).await?; self.save_config(db).await?; Ok(()) diff --git a/backend/src/notifications.rs b/backend/src/notifications.rs index 962927e90..afe92c571 100644 --- a/backend/src/notifications.rs +++ b/backend/src/notifications.rs @@ -4,7 +4,6 @@ use std::str::FromStr; use chrono::{DateTime, Utc}; use color_eyre::eyre::eyre; -use patch_db::{DbHandle, LockType}; use rpc_toolkit::command; use sqlx::PgPool; use tokio::sync::Mutex; @@ -12,6 +11,7 @@ use tracing::instrument; use crate::backup::BackupReport; use crate::context::RpcContext; +use crate::prelude::*; use crate::s9pk::manifest::PackageId; use crate::util::display_none; use crate::util::serde::display_serializable; @@ -30,13 +30,8 @@ pub async fn list( #[arg] limit: Option, ) -> Result, Error> { let limit = limit.unwrap_or(40); - let mut handle = ctx.db.handle(); match before { None => { - let model = crate::db::DatabaseModel::new() - .server_info() - .unread_notification_count(); - model.lock(&mut handle, LockType::Write).await?; let records = sqlx::query!( "SELECT id, package_id, created_at, code, level, title, message, data FROM notifications ORDER BY id DESC LIMIT $1", limit as i64 @@ -70,8 +65,14 @@ pub async fn list( }) }) .collect::, Error>>()?; - // set notification count to zero - model.put(&mut handle, &0).await?; + + ctx.db + .mutate(|d| { + d.as_server_info_mut() + .as_unread_notification_count_mut() + .ser(&0) + }) + .await?; Ok(notifs) } Some(before) => { @@ -139,15 +140,7 @@ pub async fn create( #[arg] message: String, ) -> Result<(), Error> { ctx.notification_manager - .notify( - &mut ctx.db.handle(), - package, - level, - title, - message, - (), - None, - ) + .notify(ctx.db.clone(), package, level, title, message, (), None) .await } @@ -232,10 +225,10 @@ impl NotificationManager { cache: Mutex::new(HashMap::new()), } } - #[instrument(skip_all)] - pub async fn notify( + #[instrument(skip(db, subtype, self))] + pub async fn notify( &self, - db: &mut Db, + db: PatchDb, package_id: Option, level: NotificationLevel, title: String, @@ -243,17 +236,14 @@ impl NotificationManager { subtype: T, debounce_interval: Option, ) -> Result<(), Error> { + let peek = db.peek().await?; if !self .should_notify(&package_id, &level, &title, debounce_interval) .await { return Ok(()); } - let mut count = crate::db::DatabaseModel::new() - .server_info() - .unread_notification_count() - .get_mut(db) - .await?; + let mut count = peek.as_server_info().as_unread_notification_count().de()?; let sql_package_id = package_id.as_ref().map(|p| &**p); let sql_code = T::CODE; let sql_level = format!("{}", level); @@ -268,9 +258,13 @@ impl NotificationManager { message, sql_data ).execute(&self.sqlite).await?; - *count += 1; - count.save(db).await?; - Ok(()) + count += 1; + db.mutate(|db| { + db.as_server_info_mut() + .as_unread_notification_count_mut() + .ser(&count) + }) + .await } async fn should_notify( &self, diff --git a/backend/src/os_install/mod.rs b/backend/src/os_install/mod.rs index 19f320f06..9e21e9f23 100644 --- a/backend/src/os_install/mod.rs +++ b/backend/src/os_install/mod.rs @@ -272,7 +272,7 @@ pub async fn execute( .invoke(crate::ErrorKind::OpenSsh) .await?; - let dev = MountGuard::mount( + let embassy_fs = MountGuard::mount( &Bind::new(rootfs.as_ref()), current.join("media/embassy/embassyfs"), MountType::ReadOnly, @@ -315,19 +315,18 @@ pub async fn execute( .arg("update-grub2") .invoke(crate::ErrorKind::Grub) .await?; - dev.unmount(false).await?; if let Some(efivarfs) = efivarfs { efivarfs.unmount(false).await?; } sys.unmount(false).await?; proc.unmount(false).await?; + embassy_fs.unmount(false).await?; if let Some(efi) = efi { efi.unmount(false).await?; } boot.unmount(false).await?; rootfs.unmount().await?; - Ok(()) } diff --git a/backend/src/prelude.rs b/backend/src/prelude.rs new file mode 100644 index 000000000..ab5de1d38 --- /dev/null +++ b/backend/src/prelude.rs @@ -0,0 +1,6 @@ +pub use color_eyre::eyre::eyre; +pub use models::OptionExt; + +pub use crate::db::prelude::*; +pub use crate::ensure_code; +pub use crate::error::{Error, ErrorCollection, ErrorKind, ResultExt}; diff --git a/backend/src/procedure/docker.rs b/backend/src/procedure/docker.rs index 8a43eea19..79f62039d 100644 --- a/backend/src/procedure/docker.rs +++ b/backend/src/procedure/docker.rs @@ -12,7 +12,7 @@ use color_eyre::Report; use futures::future::{BoxFuture, Either as EitherFuture}; use futures::{FutureExt, TryStreamExt}; use helpers::{NonDetachingJoinHandle, UnixRpcClient}; -use models::{Id, ImageId}; +use models::{Id, ImageId, SYSTEM_PACKAGE_ID}; use nix::sys::signal; use nix::unistd::Pid; use serde::de::DeserializeOwned; @@ -24,7 +24,8 @@ use tracing::instrument; use super::ProcedureName; use crate::context::RpcContext; -use crate::s9pk::manifest::{PackageId, SYSTEM_PACKAGE_ID}; +use crate::prelude::*; +use crate::s9pk::manifest::PackageId; use crate::util::docker::{remove_container, CONTAINER_TOOL}; use crate::util::serde::{Duration as SerdeDuration, IoFormat}; use crate::util::Version; @@ -44,8 +45,9 @@ lazy_static::lazy_static! { }; } -#[derive(Clone, Debug, Deserialize, Serialize, patch_db::HasModel)] +#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct DockerContainers { pub main: DockerContainer, // #[serde(default)] @@ -57,6 +59,7 @@ pub struct DockerContainers { /// part of this struct by choice. Used for the times that we are creating our own entry points #[derive(Clone, Debug, Deserialize, Serialize, patch_db::HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct DockerContainer { pub image: ImageId, #[serde(default)] @@ -228,7 +231,7 @@ impl DockerProcedure { timeout: Option, ) -> Result, Error> { let name = name.docker_name(); - let name: Option<&str> = name.as_ref().map(|x| &**x); + let name: Option<&str> = name.as_deref(); let mut cmd = tokio::process::Command::new(CONTAINER_TOOL); let container_name = Self::container_name(pkg_id, name); cmd.arg("run") @@ -383,14 +386,12 @@ impl DockerProcedure { &self, _ctx: &RpcContext, pkg_id: &PackageId, - pkg_version: &Version, - name: ProcedureName, - volumes: &Volumes, + _pkg_version: &Version, + _name: ProcedureName, + _volumes: &Volumes, input: Option, timeout: Option, ) -> Result, Error> { - let name = name.docker_name(); - let name: Option<&str> = name.as_deref(); let mut cmd = tokio::process::Command::new(CONTAINER_TOOL); cmd.arg("exec"); diff --git a/backend/src/procedure/mod.rs b/backend/src/procedure/mod.rs index e75445fec..4cc259303 100644 --- a/backend/src/procedure/mod.rs +++ b/backend/src/procedure/mod.rs @@ -10,6 +10,7 @@ use tracing::instrument; use self::docker::DockerProcedure; use crate::context::RpcContext; +use crate::prelude::*; use crate::s9pk::manifest::PackageId; use crate::util::Version; use crate::volume::Volumes; @@ -25,6 +26,7 @@ pub use models::ProcedureName; #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] #[serde(tag = "type")] +#[model = "Model"] pub enum PackageProcedure { Docker(DockerProcedure), diff --git a/backend/src/properties.rs b/backend/src/properties.rs index 22e57aa2d..da90a7370 100644 --- a/backend/src/properties.rs +++ b/backend/src/properties.rs @@ -5,8 +5,9 @@ use serde_json::Value; use tracing::instrument; use crate::context::RpcContext; +use crate::prelude::*; use crate::procedure::ProcedureName; -use crate::s9pk::manifest::{Manifest, PackageId}; +use crate::s9pk::manifest::PackageId; use crate::{Error, ErrorKind}; pub fn display_properties(response: Value, _: &ArgMatches) { @@ -20,17 +21,15 @@ pub async fn properties(#[context] ctx: RpcContext, #[arg] id: PackageId) -> Res #[instrument(skip_all)] pub async fn fetch_properties(ctx: RpcContext, id: PackageId) -> Result { - let mut db = ctx.db.handle(); + let peek = ctx.db.peek().await?; - let manifest: Manifest = crate::db::DatabaseModel::new() - .package_data() - .idx_model(&id) - .and_then(|p| p.installed()) - .map(|m| m.manifest()) - .get(&mut db) - .await? - .to_owned() - .ok_or_else(|| Error::new(eyre!("{} is not installed", id), ErrorKind::NotFound))?; + let manifest = peek + .as_package_data() + .as_idx(&id) + .ok_or_else(|| Error::new(eyre!("{} is not installed", id), ErrorKind::NotFound))? + .expect_as_installed()? + .as_manifest() + .de()?; if let Some(props) = manifest.properties { props .execute::<(), Value>( diff --git a/backend/src/s9pk/manifest.rs b/backend/src/s9pk/manifest.rs index 52b499375..9e8e6f050 100644 --- a/backend/src/s9pk/manifest.rs +++ b/backend/src/s9pk/manifest.rs @@ -2,8 +2,7 @@ use std::collections::BTreeMap; use std::path::{Path, PathBuf}; use color_eyre::eyre::eyre; -pub use models::{PackageId, SYSTEM_PACKAGE_ID}; -use patch_db::HasModel; +pub use models::PackageId; use serde::{Deserialize, Serialize}; use url::Url; @@ -14,6 +13,7 @@ use crate::config::action::ConfigActions; use crate::dependencies::Dependencies; use crate::migration::Migrations; use crate::net::interface::Interfaces; +use crate::prelude::*; use crate::procedure::docker::DockerContainers; use crate::procedure::PackageProcedure; use crate::status::health_check::HealthChecks; @@ -29,6 +29,7 @@ fn current_version() -> Version { #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct Manifest { #[serde(default = "current_version")] pub eos_version: Version, @@ -36,7 +37,6 @@ pub struct Manifest { #[serde(default)] pub git_hash: Option, pub title: String, - #[model] pub version: Version, pub description: Description, #[serde(default)] @@ -52,31 +52,23 @@ pub struct Manifest { pub donation_url: Option, #[serde(default)] pub alerts: Alerts, - #[model] pub main: PackageProcedure, pub health_checks: HealthChecks, - #[model] pub config: Option, - #[model] pub properties: Option, - #[model] pub volumes: Volumes, // #[serde(default)] pub interfaces: Interfaces, // #[serde(default)] - #[model] pub backup: BackupActions, #[serde(default)] - #[model] pub migrations: Migrations, #[serde(default)] pub actions: Actions, // #[serde(default)] // pub permissions: Permissions, #[serde(default)] - #[model] pub dependencies: Dependencies, - #[model] pub containers: Option, #[serde(default)] diff --git a/backend/src/s9pk/mod.rs b/backend/src/s9pk/mod.rs index a5fff7e11..e1bf4caba 100644 --- a/backend/src/s9pk/mod.rs +++ b/backend/src/s9pk/mod.rs @@ -28,7 +28,7 @@ pub mod header; pub mod manifest; pub mod reader; -pub const SIG_CONTEXT: &'static [u8] = b"s9pk"; +pub const SIG_CONTEXT: &[u8] = b"s9pk"; #[command(cli_only, display(display_none))] #[instrument(skip_all)] diff --git a/backend/src/setup.rs b/backend/src/setup.rs index a404d9f1d..e789aba26 100644 --- a/backend/src/setup.rs +++ b/backend/src/setup.rs @@ -5,7 +5,6 @@ use std::time::Duration; use color_eyre::eyre::eyre; use josekit::jwk::Jwk; use openssl::x509::X509; -use patch_db::DbHandle; use rpc_toolkit::command; use rpc_toolkit::yajrc::RpcError; use serde::{Deserialize, Serialize}; @@ -32,6 +31,7 @@ use crate::disk::REPAIR_DISK_PATH; use crate::hostname::Hostname; use crate::init::{init, InitResult}; use crate::middleware::encrypt::EncryptedWire; +use crate::prelude::*; use crate::util::io::{dir_copy, dir_size, Counter}; use crate::{Error, ErrorKind, ResultExt}; @@ -57,23 +57,21 @@ async fn setup_init( let InitResult { secret_store, db } = init(&RpcContextConfig::load(ctx.config_path.clone()).await?).await?; let mut secrets_handle = secret_store.acquire().await?; - let mut db_handle = db.handle(); let mut secrets_tx = secrets_handle.begin().await?; - let mut db_tx = db_handle.begin().await?; let mut account = AccountInfo::load(&mut secrets_tx).await?; if let Some(password) = password { account.set_password(&password)?; account.save(&mut secrets_tx).await?; - crate::db::DatabaseModel::new() - .server_info() - .password_hash() - .put(&mut db_tx, &account.password) - .await?; + db.mutate(|m| { + m.as_server_info_mut() + .as_password_hash_mut() + .ser(&account.password) + }) + .await?; } - db_tx.commit().await?; secrets_tx.commit().await?; Ok(( @@ -265,39 +263,47 @@ pub async fn execute( complete: false, })); drop(status); - tokio::task::spawn(async move { - match execute_inner( - ctx.clone(), - embassy_logicalname, - embassy_password, - recovery_source, - recovery_password, - ) - .await - { - Ok((guid, hostname, tor_addr, root_ca)) => { - tracing::info!("Setup Complete!"); - *ctx.setup_result.write().await = Some(( - guid, - SetupResult { - tor_address: format!("https://{}", tor_addr), - lan_address: hostname.lan_address(), - root_ca: String::from_utf8( - root_ca.to_pem().expect("failed to serialize root ca"), - ) - .expect("invalid pem string"), - }, - )); - *ctx.setup_status.write().await = Some(Ok(SetupStatus { - bytes_transferred: 0, - total_bytes: None, - complete: true, - })); - } - Err(e) => { - tracing::error!("Error Setting Up Server: {}", e); - tracing::debug!("{:?}", e); - *ctx.setup_status.write().await = Some(Err(e.into())); + tokio::task::spawn({ + async move { + let ctx = ctx.clone(); + let recovery_source = recovery_source; + + let embassy_password = embassy_password; + let recovery_source = recovery_source; + let recovery_password = recovery_password; + match execute_inner( + ctx.clone(), + embassy_logicalname, + embassy_password, + recovery_source, + recovery_password, + ) + .await + { + Ok((guid, hostname, tor_addr, root_ca)) => { + tracing::info!("Setup Complete!"); + *ctx.setup_result.write().await = Some(( + guid, + SetupResult { + tor_address: format!("https://{}", tor_addr), + lan_address: hostname.lan_address(), + root_ca: String::from_utf8( + root_ca.to_pem().expect("failed to serialize root ca"), + ) + .expect("invalid pem string"), + }, + )); + *ctx.setup_status.write().await = Some(Ok(SetupStatus { + bytes_transferred: 0, + total_bytes: None, + complete: true, + })); + } + Err(e) => { + tracing::error!("Error Setting Up Server: {}", e); + tracing::debug!("{:?}", e); + *ctx.setup_status.write().await = Some(Err(e.into())); + } } } }); @@ -396,7 +402,7 @@ async fn recover( ) -> Result<(Arc, Hostname, OnionAddressV3, X509), Error> { let recovery_source = TmpMountGuard::mount(&recovery_source, ReadWrite).await?; recover_full_embassy( - ctx.clone(), + ctx, guid.clone(), embassy_password, recovery_source, diff --git a/backend/src/sound.rs b/backend/src/sound.rs index ca010c7c3..8dc78357c 100644 --- a/backend/src/sound.rs +++ b/backend/src/sound.rs @@ -15,7 +15,7 @@ lazy_static::lazy_static! { static ref C_0: f64 = *A_4 / SEMITONE_K.powf(9f64) / 2f64.powf(4f64); } -pub const SOUND_LOCK_FILE: &'static str = "/etc/embassy/sound.lock"; +pub const SOUND_LOCK_FILE: &str = "/etc/embassy/sound.lock"; struct SoundInterface { guard: Option, diff --git a/backend/src/status/health_check.rs b/backend/src/status/health_check.rs index 64155b0ce..1b3e8f6b5 100644 --- a/backend/src/status/health_check.rs +++ b/backend/src/status/health_check.rs @@ -103,7 +103,7 @@ impl HealthCheck { } } -#[derive(Clone, Debug, Deserialize, Serialize)] +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] #[serde(rename_all = "kebab-case")] #[serde(tag = "result")] pub enum HealthCheckResult { diff --git a/backend/src/status/mod.rs b/backend/src/status/mod.rs index eba367580..f6290be12 100644 --- a/backend/src/status/mod.rs +++ b/backend/src/status/mod.rs @@ -1,25 +1,36 @@ use std::collections::BTreeMap; use chrono::{DateTime, Utc}; -use patch_db::{HasModel, Model}; +use models::PackageId; use serde::{Deserialize, Serialize}; use self::health_check::HealthCheckId; -use crate::dependencies::DependencyErrors; +use crate::prelude::*; use crate::status::health_check::HealthCheckResult; pub mod health_check; #[derive(Clone, Debug, Deserialize, Serialize, HasModel)] #[serde(rename_all = "kebab-case")] +#[model = "Model"] pub struct Status { pub configured: bool, - #[model] pub main: MainStatus, - #[model] - pub dependency_errors: DependencyErrors, + #[serde(default)] + pub dependency_errors: BTreeMap<(), ()>, // TODO: remove + #[serde(default)] + pub dependency_config_errors: DependencyConfigErrors, } -#[derive(Debug, Clone, Deserialize, Serialize, HasModel)] +#[derive(Clone, Debug, Deserialize, Serialize, HasModel, Default)] +#[serde(rename_all = "kebab-case")] +#[model = "Model"] +pub struct DependencyConfigErrors(pub BTreeMap); +impl Map for DependencyConfigErrors { + type Key = PackageId; + type Value = String; +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)] #[serde(tag = "status")] #[serde(rename_all = "kebab-case")] pub enum MainStatus { @@ -83,8 +94,3 @@ impl MainStatus { MainStatus::BackingUp { started, health } } } -impl MainStatusModel { - pub fn started(self) -> Model>> { - self.0.child("started") - } -} diff --git a/backend/src/system.rs b/backend/src/system.rs index 9e8e0e049..6f05b6b73 100644 --- a/backend/src/system.rs +++ b/backend/src/system.rs @@ -17,6 +17,7 @@ use crate::logs::{ cli_logs_generic_follow, cli_logs_generic_nofollow, fetch_logs, follow_logs, LogFollowResponse, LogResponse, LogSource, }; +use crate::prelude::*; use crate::shutdown::Shutdown; use crate::util::serde::{display_serializable, IoFormat}; use crate::util::{display_none, Invoke}; @@ -59,16 +60,12 @@ pub async fn enable_zram() -> Result<(), Error> { #[command(display(display_none))] pub async fn zram(#[context] ctx: RpcContext, #[arg] enable: bool) -> Result<(), Error> { - let mut db = ctx.db.handle(); - let mut zram = crate::db::DatabaseModel::new() - .server_info() - .zram() - .get_mut(&mut db) - .await?; - if enable == *zram { + let db = ctx.db.peek().await?; + + let zram = db.as_server_info().as_zram().de()?; + if enable == zram { return Ok(()); } - *zram = enable; if enable { enable_zram().await?; } else { @@ -80,7 +77,12 @@ pub async fn zram(#[context] ctx: RpcContext, #[arg] enable: bool) -> Result<(), .await .with_kind(ErrorKind::Zram)?; } - zram.save(&mut db).await?; + ctx.db + .mutate(|v| { + v.as_server_info_mut().as_zram_mut().ser(&enable)?; + Ok(()) + }) + .await?; Ok(()) } diff --git a/backend/src/update/mod.rs b/backend/src/update/mod.rs index 3322c403e..92c73f01f 100644 --- a/backend/src/update/mod.rs +++ b/backend/src/update/mod.rs @@ -1,13 +1,11 @@ use std::path::PathBuf; use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::Arc; use clap::ArgMatches; use color_eyre::eyre::{eyre, Result}; use emver::Version; use helpers::{Rsync, RsyncOptions}; use lazy_static::lazy_static; -use patch_db::{DbHandle, LockType, Revision}; use reqwest::Url; use rpc_toolkit::command; use tokio::process::Command; @@ -21,6 +19,7 @@ use crate::disk::mount::filesystem::ReadWrite; use crate::disk::mount::guard::MountGuard; use crate::marketplace::with_query_params; use crate::notifications::NotificationLevel; +use crate::prelude::*; use crate::sound::{ CIRCLE_OF_5THS_SHORT, UPDATE_FAILED_1, UPDATE_FAILED_2, UPDATE_FAILED_3, UPDATE_FAILED_4, }; @@ -76,15 +75,12 @@ fn display_update_result(status: UpdateResult, _: &ArgMatches) { } #[instrument(skip_all)] -async fn maybe_do_update( - ctx: RpcContext, - marketplace_url: Url, -) -> Result>, Error> { - let mut db = ctx.db.handle(); +async fn maybe_do_update(ctx: RpcContext, marketplace_url: Url) -> Result, Error> { + let peeked = ctx.db.peek().await?; let latest_version: Version = ctx .client .get(with_query_params( - &ctx, + ctx.clone(), format!("{}/eos/v0/latest", marketplace_url,).parse()?, )) .send() @@ -94,31 +90,8 @@ async fn maybe_do_update( .await .with_kind(ErrorKind::Network)? .version; - crate::db::DatabaseModel::new() - .server_info() - .lock(&mut db, LockType::Write) - .await?; - let current_version = crate::db::DatabaseModel::new() - .server_info() - .version() - .get_mut(&mut db) - .await?; - if &latest_version < ¤t_version { - return Ok(None); - } - let mut tx = db.begin().await?; - let mut status = crate::db::DatabaseModel::new() - .server_info() - .status_info() - .get_mut(&mut tx) - .await?; - if status.update_progress.is_some() { - return Err(Error::new( - eyre!("Server is already updating!"), - crate::ErrorKind::InvalidRequest, - )); - } - if status.updated { + let current_version = peeked.as_server_info().as_version().de()?; + if latest_version < *current_version { return Ok(None); } @@ -126,38 +99,59 @@ async fn maybe_do_update( base: marketplace_url, version: latest_version, }; + let status = ctx + .db + .mutate(|db| { + let mut status = peeked.as_server_info().as_status_info().de()?; + if status.update_progress.is_some() { + return Err(Error::new( + eyre!("Server is already updating!"), + crate::ErrorKind::InvalidRequest, + )); + } - status.update_progress = Some(UpdateProgress { - size: None, - downloaded: 0, - }); - status.save(&mut tx).await?; - let rev = tx.commit().await?; + status.update_progress = Some(UpdateProgress { + size: None, + downloaded: 0, + }); + db.as_server_info_mut().as_status_info_mut().ser(&status)?; + Ok(status) + }) + .await?; + + if status.updated { + return Ok(None); + } tokio::spawn(async move { let res = do_update(ctx.clone(), eos_url).await; - let mut db = ctx.db.handle(); - let mut status = crate::db::DatabaseModel::new() - .server_info() - .status_info() - .get_mut(&mut db) - .await - .expect("could not access status"); - status.update_progress = None; + ctx.db + .mutate(|db| { + db.as_server_info_mut() + .as_status_info_mut() + .as_update_progress_mut() + .ser(&None) + }) + .await?; match res { Ok(()) => { - status.updated = true; - status.save(&mut db).await.expect("could not save status"); + ctx.db + .mutate(|db| { + db.as_server_info_mut() + .as_status_info_mut() + .as_updated_mut() + .ser(&true) + }) + .await?; CIRCLE_OF_5THS_SHORT .play() .await .expect("could not play sound"); } Err(e) => { - status.save(&mut db).await.expect("could not save status"); ctx.notification_manager .notify( - &mut db, + ctx.db.clone(), None, NotificationLevel::Error, "embassyOS Update Failed".to_owned(), @@ -186,8 +180,9 @@ async fn maybe_do_update( .expect("could not play song: update failed 4"); } } + Ok::<(), Error>(()) }); - Ok(rev) + Ok(Some(())) } #[instrument(skip_all)] @@ -199,17 +194,16 @@ async fn do_update(ctx: RpcContext, eos_url: EosUrl) -> Result<(), Error> { ) .await?; while let Some(progress) = rsync.progress.next().await { - crate::db::DatabaseModel::new() - .server_info() - .status_info() - .update_progress() - .put( - &mut ctx.db.handle(), - &UpdateProgress { - size: Some(100), - downloaded: (100.0 * progress) as u64, - }, - ) + ctx.db + .mutate(|db| { + db.as_server_info_mut() + .as_status_info_mut() + .as_update_progress_mut() + .ser(&Some(UpdateProgress { + size: Some(100), + downloaded: (100.0 * progress) as u64, + })) + }) .await?; } rsync.wait().await?; diff --git a/backend/src/util/config.rs b/backend/src/util/config.rs index ddc6f87c8..f719f563f 100644 --- a/backend/src/util/config.rs +++ b/backend/src/util/config.rs @@ -1,11 +1,12 @@ use std::fs::File; use std::path::{Path, PathBuf}; +use patch_db::Value; use serde::Deserialize; -use serde_json::Value; +use crate::prelude::*; use crate::util::serde::IoFormat; -use crate::{Config, Error, ResultExt}; +use crate::{Config, Error}; pub const DEVICE_CONFIG_PATH: &str = "/media/embassy/config/config.yaml"; pub const CONFIG_PATH: &str = "/etc/embassy/config.yaml"; @@ -37,7 +38,7 @@ pub fn load_config_from_paths<'a, T: for<'de> Deserialize<'de>>( config = merge_configs(config, new); } } - serde_json::from_value(Value::Object(config)).with_kind(crate::ErrorKind::Deserialization) + from_value(Value::Object(config)) } pub fn merge_configs(mut first: Config, second: Config) -> Config { diff --git a/backend/src/util/http_reader.rs b/backend/src/util/http_reader.rs index a32dd113d..87e8c114e 100644 --- a/backend/src/util/http_reader.rs +++ b/backend/src/util/http_reader.rs @@ -376,5 +376,5 @@ async fn s9pk_test() { .unwrap(); let manifest = s9pk.manifest().await.unwrap(); - assert_eq!(&**manifest.id, "ghost"); + assert_eq!(&manifest.id.to_string(), "ghost"); } diff --git a/backend/src/util/mod.rs b/backend/src/util/mod.rs index a9daf76cc..90b6ddcdf 100644 --- a/backend/src/util/mod.rs +++ b/backend/src/util/mod.rs @@ -31,7 +31,7 @@ pub mod logger; pub mod lshw; pub mod serde; -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, ::serde::Deserialize, ::serde::Serialize)] pub enum Never {} impl Never {} impl Never { @@ -182,7 +182,7 @@ impl Container { std::mem::replace(&mut *self.0.write().await, Some(value)) } pub async fn take(&self) -> Option { - std::mem::replace(&mut *self.0.write().await, None) + self.0.write().await.take() } pub async fn is_empty(&self) -> bool { self.0.read().await.is_none() @@ -219,7 +219,7 @@ impl tokio::io::AsyncWrite for HashWriter Poll> { let this = self.project(); - let written = tokio::io::AsyncWrite::poll_write(this.writer, cx, &buf); + let written = tokio::io::AsyncWrite::poll_write(this.writer, cx, buf); match written { // only update the hasher once Poll::Ready(res) => { diff --git a/backend/src/version/mod.rs b/backend/src/version/mod.rs index 797d8fb8d..e145e324a 100644 --- a/backend/src/version/mod.rs +++ b/backend/src/version/mod.rs @@ -2,23 +2,12 @@ use std::cmp::Ordering; use async_trait::async_trait; use color_eyre::eyre::eyre; -use patch_db::DbHandle; use rpc_toolkit::command; use sqlx::PgPool; -use crate::init::InitReceipts; +use crate::prelude::*; use crate::Error; -mod v0_3_0; -mod v0_3_0_1; -mod v0_3_0_2; -mod v0_3_0_3; -mod v0_3_1; -mod v0_3_1_1; -mod v0_3_1_2; -mod v0_3_2; -mod v0_3_2_1; -mod v0_3_3; mod v0_3_4; mod v0_3_4_1; mod v0_3_4_2; @@ -30,16 +19,6 @@ pub type Current = v0_3_4_4::Version; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] #[serde(untagged)] enum Version { - V0_3_0(Wrapper), - V0_3_0_1(Wrapper), - V0_3_0_2(Wrapper), - V0_3_0_3(Wrapper), - V0_3_1(Wrapper), - V0_3_1_1(Wrapper), - V0_3_1_2(Wrapper), - V0_3_2(Wrapper), - V0_3_2_1(Wrapper), - V0_3_3(Wrapper), V0_3_4(Wrapper), V0_3_4_1(Wrapper), V0_3_4_2(Wrapper), @@ -60,16 +39,6 @@ impl Version { #[cfg(test)] fn as_sem_ver(&self) -> emver::Version { match self { - Version::V0_3_0(Wrapper(x)) => x.semver(), - Version::V0_3_0_1(Wrapper(x)) => x.semver(), - Version::V0_3_0_2(Wrapper(x)) => x.semver(), - Version::V0_3_0_3(Wrapper(x)) => x.semver(), - Version::V0_3_1(Wrapper(x)) => x.semver(), - Version::V0_3_1_1(Wrapper(x)) => x.semver(), - Version::V0_3_1_2(Wrapper(x)) => x.semver(), - Version::V0_3_2(Wrapper(x)) => x.semver(), - Version::V0_3_2_1(Wrapper(x)) => x.semver(), - Version::V0_3_3(Wrapper(x)) => x.semver(), Version::V0_3_4(Wrapper(x)) => x.semver(), Version::V0_3_4_1(Wrapper(x)) => x.semver(), Version::V0_3_4_2(Wrapper(x)) => x.semver(), @@ -89,55 +58,43 @@ where fn new() -> Self; fn semver(&self) -> emver::Version; fn compat(&self) -> &'static emver::VersionRange; - async fn up(&self, db: &mut Db, secrets: &PgPool) -> Result<(), Error>; - async fn down(&self, db: &mut Db, secrets: &PgPool) -> Result<(), Error>; - async fn commit( - &self, - db: &mut Db, - receipts: &InitReceipts, - ) -> Result<(), Error> { - receipts - .version_range - .set(db, self.compat().clone()) - .await?; - receipts - .server_version - .set(db, self.semver().into()) - .await?; - + async fn up(&self, db: PatchDb, secrets: &PgPool) -> Result<(), Error>; + async fn down(&self, db: PatchDb, secrets: &PgPool) -> Result<(), Error>; + async fn commit(&self, db: PatchDb) -> Result<(), Error> { + let semver = self.semver().into(); + let compat = self.compat().clone(); + db.mutate(|d| { + d.as_server_info_mut().as_version_mut().ser(&semver)?; + d.as_server_info_mut() + .as_eos_version_compat_mut() + .ser(&compat)?; + Ok(()) + }) + .await?; Ok(()) } - async fn migrate_to( + async fn migrate_to( &self, version: &V, - db: &mut Db, + db: PatchDb, secrets: &PgPool, - receipts: &InitReceipts, ) -> Result<(), Error> { match self.semver().cmp(&version.semver()) { - Ordering::Greater => { - self.rollback_to_unchecked(version, db, secrets, receipts) - .await - } - Ordering::Less => { - version - .migrate_from_unchecked(self, db, secrets, receipts) - .await - } + Ordering::Greater => self.rollback_to_unchecked(version, db, secrets).await, + Ordering::Less => version.migrate_from_unchecked(self, db, secrets).await, Ordering::Equal => Ok(()), } } - async fn migrate_from_unchecked( + async fn migrate_from_unchecked( &self, version: &V, - db: &mut Db, + db: PatchDb, secrets: &PgPool, - receipts: &InitReceipts, ) -> Result<(), Error> { let previous = Self::Previous::new(); if version.semver() < previous.semver() { previous - .migrate_from_unchecked(version, db, secrets, receipts) + .migrate_from_unchecked(version, db.clone(), secrets) .await?; } else if version.semver() > previous.semver() { return Err(Error::new( @@ -149,25 +106,22 @@ where )); } tracing::info!("{} -> {}", previous.semver(), self.semver(),); - self.up(db, secrets).await?; - self.commit(db, receipts).await?; + self.up(db.clone(), secrets).await?; + self.commit(db).await?; Ok(()) } - async fn rollback_to_unchecked( + async fn rollback_to_unchecked( &self, version: &V, - db: &mut Db, + db: PatchDb, secrets: &PgPool, - receipts: &InitReceipts, ) -> Result<(), Error> { let previous = Self::Previous::new(); tracing::info!("{} -> {}", self.semver(), previous.semver(),); - self.down(db, secrets).await?; - previous.commit(db, receipts).await?; + self.down(db.clone(), secrets).await?; + previous.commit(db.clone()).await?; if version.semver() < previous.semver() { - previous - .rollback_to_unchecked(version, db, secrets, receipts) - .await?; + previous.rollback_to_unchecked(version, db, secrets).await?; } else if version.semver() > previous.semver() { return Err(Error::new( eyre!( @@ -205,73 +159,15 @@ where } } -pub async fn init( - db: &mut Db, - secrets: &PgPool, - receipts: &crate::init::InitReceipts, -) -> Result<(), Error> { - let version = Version::from_util_version(receipts.server_version.get(db).await?); +pub async fn init(db: &PatchDb, secrets: &PgPool) -> Result<(), Error> { + let version = Version::from_util_version(db.peek().await?.as_server_info().as_version().de()?); + match version { - Version::V0_3_0(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_0_1(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_0_2(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_0_3(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_1(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_1_1(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_1_2(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_2(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_2_1(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_3(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_4(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_4_1(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_4_2(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_4_3(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } - Version::V0_3_4_4(v) => { - v.0.migrate_to(&Current::new(), db, secrets, receipts) - .await? - } + Version::V0_3_4(v) => v.0.migrate_to(&Current::new(), db.clone(), secrets).await?, + Version::V0_3_4_1(v) => v.0.migrate_to(&Current::new(), db.clone(), secrets).await?, + Version::V0_3_4_2(v) => v.0.migrate_to(&Current::new(), db.clone(), secrets).await?, + Version::V0_3_4_3(v) => v.0.migrate_to(&Current::new(), db.clone(), secrets).await?, + Version::V0_3_4_4(v) => v.0.migrate_to(&Current::new(), db.clone(), secrets).await?, Version::Other(_) => { return Err(Error::new( eyre!("Cannot downgrade"), @@ -304,16 +200,6 @@ mod tests { fn versions() -> impl Strategy { prop_oneof![ - Just(Version::V0_3_0(Wrapper(v0_3_0::Version::new()))), - Just(Version::V0_3_0_1(Wrapper(v0_3_0_1::Version::new()))), - Just(Version::V0_3_0_2(Wrapper(v0_3_0_2::Version::new()))), - Just(Version::V0_3_0_3(Wrapper(v0_3_0_3::Version::new()))), - Just(Version::V0_3_1(Wrapper(v0_3_1::Version::new()))), - Just(Version::V0_3_1_1(Wrapper(v0_3_1_1::Version::new()))), - Just(Version::V0_3_1_2(Wrapper(v0_3_1_2::Version::new()))), - Just(Version::V0_3_2(Wrapper(v0_3_2::Version::new()))), - Just(Version::V0_3_2_1(Wrapper(v0_3_2_1::Version::new()))), - Just(Version::V0_3_3(Wrapper(v0_3_3::Version::new()))), Just(Version::V0_3_4(Wrapper(v0_3_4::Version::new()))), Just(Version::V0_3_4_1(Wrapper(v0_3_4_1::Version::new()))), Just(Version::V0_3_4_2(Wrapper(v0_3_4_2::Version::new()))), diff --git a/backend/src/version/v0_3_0.rs b/backend/src/version/v0_3_0.rs deleted file mode 100644 index ccaf59fdd..000000000 --- a/backend/src/version/v0_3_0.rs +++ /dev/null @@ -1,37 +0,0 @@ -use emver::VersionRange; -use lazy_static::lazy_static; - -use super::*; - -const V0_3_0: emver::Version = emver::Version::new(0, 3, 0, 0); -lazy_static! { - pub static ref V0_3_0_COMPAT: VersionRange = VersionRange::Conj( - Box::new(VersionRange::Anchor( - emver::GTE, - emver::Version::new(0, 3, 0, 0), - )), - Box::new(VersionRange::Anchor(emver::LTE, Current::new().semver())), - ); -} - -#[derive(Debug, Clone)] -pub struct Version; -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_0::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_0 - } - fn compat(&self) -> &'static VersionRange { - &*V0_3_0_COMPAT - } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } -} diff --git a/backend/src/version/v0_3_0_1.rs b/backend/src/version/v0_3_0_1.rs deleted file mode 100644 index e42593e6b..000000000 --- a/backend/src/version/v0_3_0_1.rs +++ /dev/null @@ -1,27 +0,0 @@ -use emver::VersionRange; - -use super::*; - -const V0_3_0_1: emver::Version = emver::Version::new(0, 3, 0, 1); - -#[derive(Debug, Clone)] -pub struct Version; -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_0::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_0_1 - } - fn compat(&self) -> &'static VersionRange { - &*v0_3_0::V0_3_0_COMPAT - } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } -} diff --git a/backend/src/version/v0_3_0_2.rs b/backend/src/version/v0_3_0_2.rs deleted file mode 100644 index 0b56a9e66..000000000 --- a/backend/src/version/v0_3_0_2.rs +++ /dev/null @@ -1,27 +0,0 @@ -use emver::VersionRange; - -use super::*; - -const V0_3_0_2: emver::Version = emver::Version::new(0, 3, 0, 2); - -#[derive(Debug, Clone)] -pub struct Version; -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_0_1::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_0_2 - } - fn compat(&self) -> &'static VersionRange { - &*v0_3_0::V0_3_0_COMPAT - } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } -} diff --git a/backend/src/version/v0_3_0_3.rs b/backend/src/version/v0_3_0_3.rs deleted file mode 100644 index 041f0bf13..000000000 --- a/backend/src/version/v0_3_0_3.rs +++ /dev/null @@ -1,27 +0,0 @@ -use emver::VersionRange; - -use super::*; - -const V0_3_0_3: emver::Version = emver::Version::new(0, 3, 0, 3); - -#[derive(Clone, Debug)] -pub struct Version; -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_0_2::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_0_3 - } - fn compat(&self) -> &'static VersionRange { - &*v0_3_0::V0_3_0_COMPAT - } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } -} diff --git a/backend/src/version/v0_3_1.rs b/backend/src/version/v0_3_1.rs deleted file mode 100644 index dcb738dda..000000000 --- a/backend/src/version/v0_3_1.rs +++ /dev/null @@ -1,28 +0,0 @@ -use emver::VersionRange; - -use super::v0_3_0::V0_3_0_COMPAT; -use super::*; - -const V0_3_1: emver::Version = emver::Version::new(0, 3, 1, 0); - -#[derive(Clone, Debug)] -pub struct Version; -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_0_3::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_1 - } - fn compat(&self) -> &'static VersionRange { - &*V0_3_0_COMPAT - } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } -} diff --git a/backend/src/version/v0_3_1_1.rs b/backend/src/version/v0_3_1_1.rs deleted file mode 100644 index f7b70e4de..000000000 --- a/backend/src/version/v0_3_1_1.rs +++ /dev/null @@ -1,28 +0,0 @@ -use emver::VersionRange; - -use super::v0_3_0::V0_3_0_COMPAT; -use super::*; - -const V0_3_1_1: emver::Version = emver::Version::new(0, 3, 1, 1); - -#[derive(Clone, Debug)] -pub struct Version; -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_1::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_1_1 - } - fn compat(&self) -> &'static VersionRange { - &*V0_3_0_COMPAT - } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } -} diff --git a/backend/src/version/v0_3_1_2.rs b/backend/src/version/v0_3_1_2.rs deleted file mode 100644 index 310b7ee87..000000000 --- a/backend/src/version/v0_3_1_2.rs +++ /dev/null @@ -1,28 +0,0 @@ -use emver::VersionRange; - -use super::v0_3_0::V0_3_0_COMPAT; -use super::*; - -const V0_3_1_2: emver::Version = emver::Version::new(0, 3, 1, 2); - -#[derive(Clone, Debug)] -pub struct Version; -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_1_1::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_1_2 - } - fn compat(&self) -> &'static VersionRange { - &*V0_3_0_COMPAT - } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } -} diff --git a/backend/src/version/v0_3_2.rs b/backend/src/version/v0_3_2.rs deleted file mode 100644 index c252d1518..000000000 --- a/backend/src/version/v0_3_2.rs +++ /dev/null @@ -1,156 +0,0 @@ -use emver::VersionRange; - -use super::v0_3_0::V0_3_0_COMPAT; -use super::*; - -const V0_3_2: emver::Version = emver::Version::new(0, 3, 2, 0); - -lazy_static::lazy_static! { - static ref DEFAULT_UI: serde_json::Value =serde_json::json!({ - "name": null, - "auto-check-updates": true, - "pkg-order": [], - "ack-welcome": "0.3.2", - "marketplace": { - "selected-id": null, - "known-hosts": {} - }, - "dev": {}, - "gaming": { - "snake": { - "high-score": 0 - } - }, - "ack-instructions": {} - }); - -} - -#[derive(Clone, Debug)] -pub struct Version; -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_1_2::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_2 - } - fn compat(&self) -> &'static VersionRange { - &*V0_3_0_COMPAT - } - async fn up(&self, db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - let hostname = legacy::hostname::get_hostname(db).await?; - crate::db::DatabaseModel::new() - .server_info() - .hostname() - .put(db, &Some(hostname.0)) - .await?; - crate::db::DatabaseModel::new() - .server_info() - .id() - .put(db, &legacy::hostname::generate_id()) - .await?; - - legacy::hostname::sync_hostname(db).await?; - Ok(()) - } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } -} - -mod legacy { - pub mod hostname { - use patch_db::DbHandle; - use rand::{thread_rng, Rng}; - use tokio::process::Command; - use tracing::instrument; - - use crate::util::Invoke; - use crate::{Error, ErrorKind}; - #[derive(Clone, serde::Deserialize, serde::Serialize, Debug)] - pub struct Hostname(pub String); - - lazy_static::lazy_static! { - static ref ADJECTIVES: Vec = include_str!("../assets/adjectives.txt").lines().map(|x| x.to_string()).collect(); - static ref NOUNS: Vec = include_str!("../assets/nouns.txt").lines().map(|x| x.to_string()).collect(); - } - impl AsRef for Hostname { - fn as_ref(&self) -> &str { - &self.0 - } - } - - pub fn generate_hostname() -> Hostname { - let mut rng = thread_rng(); - let adjective = &ADJECTIVES[rng.gen_range(0..ADJECTIVES.len())]; - let noun = &NOUNS[rng.gen_range(0..NOUNS.len())]; - Hostname(format!("embassy-{adjective}-{noun}")) - } - - pub fn generate_id() -> String { - let id = uuid::Uuid::new_v4(); - id.to_string() - } - - #[instrument(skip_all)] - pub async fn get_current_hostname() -> Result { - let out = Command::new("hostname") - .invoke(ErrorKind::ParseSysInfo) - .await?; - let out_string = String::from_utf8(out)?; - Ok(Hostname(out_string.trim().to_owned())) - } - - #[instrument(skip_all)] - pub async fn set_hostname(hostname: &Hostname) -> Result<(), Error> { - let hostname: &String = &hostname.0; - let _out = Command::new("hostnamectl") - .arg("set-hostname") - .arg(hostname) - .invoke(ErrorKind::ParseSysInfo) - .await?; - Ok(()) - } - - #[instrument(skip_all)] - pub async fn get_id(handle: &mut Db) -> Result { - let id = crate::db::DatabaseModel::new() - .server_info() - .id() - .get(handle) - .await?; - Ok(id.to_string()) - } - - pub async fn get_hostname(handle: &mut Db) -> Result { - if let Ok(hostname) = crate::db::DatabaseModel::new() - .server_info() - .hostname() - .get(handle) - .await - { - if let Some(hostname) = hostname.to_owned() { - return Ok(Hostname(hostname)); - } - } - let id = get_id(handle).await?; - if id.len() != 8 { - return Ok(generate_hostname()); - } - return Ok(Hostname(format!("embassy-{}", id))); - } - #[instrument(skip_all)] - pub async fn sync_hostname(handle: &mut Db) -> Result<(), Error> { - set_hostname(&get_hostname(handle).await?).await?; - Command::new("systemctl") - .arg("restart") - .arg("avahi-daemon") - .invoke(crate::ErrorKind::Network) - .await?; - Ok(()) - } - } -} diff --git a/backend/src/version/v0_3_2_1.rs b/backend/src/version/v0_3_2_1.rs deleted file mode 100644 index 62f36f623..000000000 --- a/backend/src/version/v0_3_2_1.rs +++ /dev/null @@ -1,26 +0,0 @@ -use super::v0_3_0::V0_3_0_COMPAT; -use super::*; - -const V0_3_2_1: emver::Version = emver::Version::new(0, 3, 2, 1); - -#[derive(Clone, Debug)] -pub struct Version; -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_2::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_2_1 - } - fn compat(&self) -> &'static emver::VersionRange { - &*V0_3_0_COMPAT - } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - Ok(()) - } -} diff --git a/backend/src/version/v0_3_3.rs b/backend/src/version/v0_3_3.rs deleted file mode 100644 index b168aaa56..000000000 --- a/backend/src/version/v0_3_3.rs +++ /dev/null @@ -1,156 +0,0 @@ -use async_trait::async_trait; -use emver::VersionRange; -use regex::Regex; -use serde_json::{json, Value}; - -use super::v0_3_0::V0_3_0_COMPAT; -use super::*; -use crate::DEFAULT_MARKETPLACE; - -const V0_3_3: emver::Version = emver::Version::new(0, 3, 3, 0); - -#[derive(Clone, Debug)] -pub struct Version; - -#[async_trait] -impl VersionT for Version { - type Previous = v0_3_2_1::Version; - fn new() -> Self { - Version - } - fn semver(&self) -> emver::Version { - V0_3_3 - } - fn compat(&self) -> &'static VersionRange { - &*V0_3_0_COMPAT - } - async fn up(&self, db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - let mut ui = crate::db::DatabaseModel::new().ui().get_mut(db).await?; - - if let Some(Value::String(selected_url)) = - ui["marketplace"] - .get("selected-id") - .and_then(|selected_id| { - if let Value::String(selected_id) = selected_id { - return Some(ui["marketplace"]["known-hosts"].get(&selected_id)?); - } - None - }) - { - ui["marketplace"]["selected-url"] = json!(selected_url); - } - if let Value::Object(ref mut obj) = *ui { - obj.remove("pkg-order"); - obj.remove("auto-check-updates"); - } - let known_hosts = ui["marketplace"]["known-hosts"].take(); - ui["marketplace"]["known-hosts"] = json!({}); - if let Value::Object(known_hosts) = known_hosts { - for (_id, value) in known_hosts { - if let Value::String(url) = &value["url"] { - ui["marketplace"]["known-hosts"][ensure_trailing_slashes(url)] = json!({}); - } - } - } - - ui["marketplace"]["known-hosts"]["https://registry.start9.com/"] = json!({}); - - if let Some(Value::Object(ref mut obj)) = ui.get_mut("marketplace") { - obj.remove("selected-id"); - } - if ui["marketplace"]["selected-url"].is_null() { - ui["marketplace"]["selected-url"] = json!(MarketPlaceUrls::Default.url()); - } - ui.save(db).await?; - - Ok(()) - } - async fn down(&self, db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - let mut ui = crate::db::DatabaseModel::new().ui().get_mut(db).await?; - let selected_url = ui["marketplace"]["selected-url"] - .as_str() - .map(|x| x.to_owned()); - let known_hosts = ui["marketplace"]["known-hosts"].take(); - ui["marketplace"]["known-hosts"] = json!({}); - if let Value::Object(known_hosts) = known_hosts { - for (url, obj) in known_hosts { - if let Value::String(name) = &obj["name"] { - let id = uuid::Uuid::new_v4().to_string(); - if Some(name) == selected_url.as_ref() { - ui["marketplace"]["selected-id"] = Value::String(id.clone()); - } - ui["marketplace"]["known-hosts"][id.as_str()] = json!({ - "name": name, - "url": url - }); - } - } - } - ui["auto-check-updates"] = Value::Bool(true); - ui["pkg-order"] = json!(crate::db::DatabaseModel::new() - .package_data() - .keys(db) - .await? - .iter() - .map(|x| x.to_string()) - .collect::>()); - if let Some(Value::Object(ref mut obj)) = ui.get_mut("marketplace") { - obj.remove("selected-url"); - } - ui.save(db).await?; - Ok(()) - } -} - -fn ensure_trailing_slashes(url: &str) -> String { - lazy_static::lazy_static! { - static ref REG: Regex = Regex::new(r".*/$").unwrap(); - } - if REG.is_match(url) { - return url.to_string(); - } - format!("{url}/") -} - -#[test] -fn test_ensure_trailing_slashed() { - assert_eq!( - &ensure_trailing_slashes("http://start9.com"), - "http://start9.com/" - ); - assert_eq!( - &ensure_trailing_slashes("http://start9.com/"), - "http://start9.com/" - ); - assert_eq!( - &ensure_trailing_slashes("http://start9.com/a"), - "http://start9.com/a/" - ); -} - -#[derive(Debug, Clone, Copy)] -pub enum MarketPlaceUrls { - Default, -} - -impl MarketPlaceUrls { - pub fn url(&self) -> String { - let url_string = match self { - MarketPlaceUrls::Default => DEFAULT_MARKETPLACE, - }; - format!("{url_string}/") - } -} - -#[test] -fn test_that_ui_includes_url() { - let ui: Value = - serde_json::from_str(include_str!("../../../frontend/patchdb-ui-seed.json")).unwrap(); - for market_place in [MarketPlaceUrls::Default] { - let url = market_place.url(); - assert!( - !ui["marketplace"]["known-hosts"][&url].is_null(), - "Should have a market place for {url}" - ); - } -} diff --git a/backend/src/version/v0_3_4.rs b/backend/src/version/v0_3_4.rs index dee3222e9..e33dcb931 100644 --- a/backend/src/version/v0_3_4.rs +++ b/backend/src/version/v0_3_4.rs @@ -2,16 +2,26 @@ use async_trait::async_trait; use emver::VersionRange; use itertools::Itertools; use openssl::hash::MessageDigest; -use serde_json::{json, Value}; +use serde_json::json; use ssh_key::public::Ed25519PublicKey; -use super::v0_3_0::V0_3_0_COMPAT; use super::*; use crate::account::AccountInfo; -use crate::hostname::{generate_hostname, sync_hostname, Hostname}; +use crate::hostname::{sync_hostname, Hostname}; +use crate::prelude::*; const V0_3_4: emver::Version = emver::Version::new(0, 3, 4, 0); +lazy_static::lazy_static! { + pub static ref V0_3_0_COMPAT: VersionRange = VersionRange::Conj( + Box::new(VersionRange::Anchor( + emver::GTE, + emver::Version::new(0, 3, 0, 0), + )), + Box::new(VersionRange::Anchor(emver::LTE, Current::new().semver())), + ); +} + const COMMUNITY_URL: &str = "https://community-registry.start9.com/"; const MAIN_REGISTRY: &str = "https://registry.start9.com/"; const COMMUNITY_SERVICES: &[&str] = &[ @@ -32,7 +42,7 @@ pub struct Version; #[async_trait] impl VersionT for Version { - type Previous = v0_3_3::Version; + type Previous = Self; fn new() -> Self { Version } @@ -42,105 +52,84 @@ impl VersionT for Version { fn compat(&self) -> &'static VersionRange { &*V0_3_0_COMPAT } - async fn up(&self, db: &mut Db, secrets: &PgPool) -> Result<(), Error> { + async fn up(&self, db: PatchDb, secrets: &PgPool) -> Result<(), Error> { let mut account = AccountInfo::load(secrets).await?; - crate::db::DatabaseModel::new() - .server_info() - .pubkey() - .put( - db, - &ssh_key::PublicKey::from(Ed25519PublicKey::from(&account.key.ssh_key())) - .to_openssh()?, - ) + let account = db + .mutate(|d| { + d.as_server_info_mut().as_pubkey_mut().ser( + &ssh_key::PublicKey::from(Ed25519PublicKey::from(&account.key.ssh_key())) + .to_openssh()?, + )?; + d.as_server_info_mut().as_ca_fingerprint_mut().ser( + &account + .root_ca_cert + .digest(MessageDigest::sha256()) + .unwrap() + .iter() + .map(|x| format!("{x:X}")) + .join(":"), + )?; + let server_info = d.as_server_info(); + account.hostname = server_info.as_hostname().de().map(Hostname)?; + account.server_id = server_info.as_id().de()?; + + Ok(account) + }) .await?; - crate::db::DatabaseModel::new() - .server_info() - .ca_fingerprint() - .put( - db, - &account - .root_ca_cert - .digest(MessageDigest::sha256()) - .unwrap() - .iter() - .map(|x| format!("{x:X}")) - .join(":"), - ) - .await?; - let server_info = crate::db::DatabaseModel::new() - .server_info() - .get(db) - .await? - .into_owned(); - account.hostname = server_info - .hostname - .map(Hostname) - .unwrap_or_else(generate_hostname); - account.server_id = server_info.id; account.save(secrets).await?; sync_hostname(&account.hostname).await?; let parsed_url = Some(COMMUNITY_URL.parse().unwrap()); - let mut ui = crate::db::DatabaseModel::new().ui().get_mut(db).await?; - ui["marketplace"]["known-hosts"][COMMUNITY_URL] = json!({}); - ui["marketplace"]["known-hosts"][MAIN_REGISTRY] = json!({}); - for package_id in crate::db::DatabaseModel::new() - .package_data() - .keys(db) - .await? - { - if !COMMUNITY_SERVICES.contains(&&*package_id.to_string()) { - continue; + db.mutate(|d| { + let mut ui = d.as_ui().de()?; + use imbl_value::json; + ui["marketplace"]["known-hosts"][COMMUNITY_URL] = json!({}); + ui["marketplace"]["known-hosts"][MAIN_REGISTRY] = json!({}); + for package_id in d.as_package_data().keys()? { + if !COMMUNITY_SERVICES.contains(&&*package_id.to_string()) { + continue; + } + d.as_package_data_mut() + .as_idx_mut(&package_id) + .or_not_found(&package_id)? + .as_installed_mut() + .or_not_found(&package_id)? + .as_marketplace_url_mut() + .ser(&parsed_url)?; } - crate::db::DatabaseModel::new() - .package_data() - .idx_model(&package_id) - .expect(db) - .await? - .installed() - .expect(db) - .await? - .marketplace_url() - .put(db, &parsed_url) - .await?; - } - ui["theme"] = json!("Dark".to_string()); - ui["widgets"] = json!([]); - ui.save(db).await?; - Ok(()) + ui["theme"] = json!("Dark".to_string()); + ui["widgets"] = json!([]); + + d.as_ui_mut().ser(&ui) + }) + .await } - async fn down(&self, db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - let mut ui = crate::db::DatabaseModel::new().ui().get_mut(db).await?; - let parsed_url = Some(MAIN_REGISTRY.parse().unwrap()); - for package_id in crate::db::DatabaseModel::new() - .package_data() - .keys(db) - .await? - { - if !COMMUNITY_SERVICES.contains(&&*package_id.to_string()) { - continue; + async fn down(&self, db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { + db.mutate(|d| { + let mut ui = d.as_ui().de()?; + let parsed_url = Some(MAIN_REGISTRY.parse().unwrap()); + for package_id in d.as_package_data().keys()? { + if !COMMUNITY_SERVICES.contains(&&*package_id.to_string()) { + continue; + } + d.as_package_data_mut() + .as_idx_mut(&package_id) + .or_not_found(&package_id)? + .as_installed_mut() + .or_not_found(&package_id)? + .as_marketplace_url_mut() + .ser(&parsed_url)?; } - crate::db::DatabaseModel::new() - .package_data() - .idx_model(&package_id) - .expect(db) - .await? - .installed() - .expect(db) - .await? - .marketplace_url() - .put(db, &parsed_url) - .await?; - } - if let Value::Object(ref mut obj) = *ui { - obj.remove("theme"); - obj.remove("widgets"); - } + if let imbl_value::Value::Object(ref mut obj) = ui { + obj.remove("theme"); + obj.remove("widgets"); + } - ui["marketplace"]["known-hosts"][COMMUNITY_URL].take(); - ui["marketplace"]["known-hosts"][MAIN_REGISTRY].take(); - ui.save(db).await?; - Ok(()) + ui["marketplace"]["known-hosts"][COMMUNITY_URL].take(); + ui["marketplace"]["known-hosts"][MAIN_REGISTRY].take(); + d.as_ui_mut().ser(&ui) + }) + .await } } diff --git a/backend/src/version/v0_3_4_1.rs b/backend/src/version/v0_3_4_1.rs index 732cf18d9..915a47235 100644 --- a/backend/src/version/v0_3_4_1.rs +++ b/backend/src/version/v0_3_4_1.rs @@ -1,8 +1,9 @@ use async_trait::async_trait; use emver::VersionRange; -use super::v0_3_0::V0_3_0_COMPAT; +use super::v0_3_4::V0_3_0_COMPAT; use super::*; +use crate::prelude::*; const V0_3_4_1: emver::Version = emver::Version::new(0, 3, 4, 1); @@ -21,10 +22,10 @@ impl VersionT for Version { fn compat(&self) -> &'static VersionRange { &*V0_3_0_COMPAT } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { + async fn up(&self, _db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { Ok(()) } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { + async fn down(&self, _db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { Ok(()) } } diff --git a/backend/src/version/v0_3_4_2.rs b/backend/src/version/v0_3_4_2.rs index 1fa4f7939..5931b2879 100644 --- a/backend/src/version/v0_3_4_2.rs +++ b/backend/src/version/v0_3_4_2.rs @@ -1,8 +1,9 @@ use async_trait::async_trait; use emver::VersionRange; -use super::v0_3_0::V0_3_0_COMPAT; +use super::v0_3_4::V0_3_0_COMPAT; use super::*; +use crate::prelude::*; const V0_3_4_2: emver::Version = emver::Version::new(0, 3, 4, 2); @@ -21,10 +22,10 @@ impl VersionT for Version { fn compat(&self) -> &'static VersionRange { &*V0_3_0_COMPAT } - async fn up(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { + async fn up(&self, _db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { Ok(()) } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { + async fn down(&self, _db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { Ok(()) } } diff --git a/backend/src/version/v0_3_4_3.rs b/backend/src/version/v0_3_4_3.rs index 814ca3cc1..d3199e913 100644 --- a/backend/src/version/v0_3_4_3.rs +++ b/backend/src/version/v0_3_4_3.rs @@ -1,8 +1,9 @@ use async_trait::async_trait; use emver::VersionRange; -use super::v0_3_0::V0_3_0_COMPAT; +use super::v0_3_4::V0_3_0_COMPAT; use super::*; +use crate::prelude::*; const V0_3_4_3: emver::Version = emver::Version::new(0, 3, 4, 3); @@ -19,18 +20,12 @@ impl VersionT for Version { V0_3_4_3 } fn compat(&self) -> &'static VersionRange { - &*V0_3_0_COMPAT + &V0_3_0_COMPAT } - async fn up(&self, db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - crate::db::DatabaseModel::new() - .server_info() - .get_mut(db) - .await? - .save(db) - .await?; + async fn up(&self, _db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { Ok(()) } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { + async fn down(&self, _db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { Ok(()) } } diff --git a/backend/src/version/v0_3_4_4.rs b/backend/src/version/v0_3_4_4.rs index 1876ff700..b6345ca4c 100644 --- a/backend/src/version/v0_3_4_4.rs +++ b/backend/src/version/v0_3_4_4.rs @@ -1,9 +1,11 @@ use async_trait::async_trait; use emver::VersionRange; use models::ResultExt; +use sqlx::PgPool; -use super::v0_3_0::V0_3_0_COMPAT; -use super::*; +use super::v0_3_4::V0_3_0_COMPAT; +use super::{v0_3_4_3, VersionT}; +use crate::prelude::*; const V0_3_4_4: emver::Version = emver::Version::new(0, 3, 4, 4); @@ -20,22 +22,22 @@ impl VersionT for Version { V0_3_4_4 } fn compat(&self) -> &'static VersionRange { - &*V0_3_0_COMPAT + &V0_3_0_COMPAT } - async fn up(&self, db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { - let mut tor_addr = crate::db::DatabaseModel::new() - .server_info() - .tor_address() - .get_mut(db) - .await?; - tor_addr - .set_scheme("https") - .map_err(|_| eyre!("unable to update url scheme to https")) - .with_kind(crate::ErrorKind::ParseUrl)?; - tor_addr.save(db).await?; + async fn up(&self, db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { + db.mutate(|v| { + let tor_address_lens = v.as_server_info_mut().as_tor_address_mut(); + let mut tor_addr = tor_address_lens.de()?; + tor_addr + .set_scheme("https") + .map_err(|_| eyre!("unable to update url scheme to https")) + .with_kind(crate::ErrorKind::ParseUrl)?; + tor_address_lens.ser(&tor_addr) + }) + .await?; Ok(()) } - async fn down(&self, _db: &mut Db, _secrets: &PgPool) -> Result<(), Error> { + async fn down(&self, _db: PatchDb, _secrets: &PgPool) -> Result<(), Error> { Ok(()) } } diff --git a/backend/src/volume.rs b/backend/src/volume.rs index 594217980..875e82096 100644 --- a/backend/src/volume.rs +++ b/backend/src/volume.rs @@ -4,13 +4,13 @@ use std::path::{Path, PathBuf}; pub use helpers::script_dir; pub use models::VolumeId; -use patch_db::{HasModel, Map, MapModel}; use serde::{Deserialize, Serialize}; use tracing::instrument; use crate::context::RpcContext; use crate::net::interface::{InterfaceId, Interfaces}; use crate::net::PACKAGE_CERT_PATH; +use crate::prelude::*; use crate::s9pk::manifest::PackageId; use crate::util::Version; use crate::{Error, ResultExt}; @@ -82,13 +82,6 @@ impl DerefMut for Volumes { impl Map for Volumes { type Key = VolumeId; type Value = Volume; - fn get(&self, key: &Self::Key) -> Option<&Self::Value> { - self.0.get(key) - } -} -pub type VolumesModel = MapModel; -impl HasModel for Volumes { - type Model = MapModel; } pub fn data_dir>(datadir: P, pkg_id: &PackageId, volume_id: &VolumeId) -> PathBuf { @@ -117,7 +110,7 @@ pub fn cert_dir(pkg_id: &PackageId, interface_id: &InterfaceId) -> PathBuf { Path::new(PACKAGE_CERT_PATH).join(pkg_id).join(interface_id) } -#[derive(Clone, Debug, Deserialize, Serialize, HasModel)] +#[derive(Clone, Debug, Deserialize, Serialize)] #[serde(tag = "type")] #[serde(rename_all = "kebab-case")] pub enum Volume { diff --git a/build/lib/scripts/chroot-and-upgrade b/build/lib/scripts/chroot-and-upgrade index f155176a8..355e8be1c 100755 --- a/build/lib/scripts/chroot-and-upgrade +++ b/build/lib/scripts/chroot-and-upgrade @@ -20,7 +20,13 @@ mount --bind /sys /media/embassy/next/sys mount --bind /proc /media/embassy/next/proc mount --bind /boot /media/embassy/next/boot -chroot /media/embassy/next $@ +if [ -z "$*" ]; then + chroot /media/embassy/next + CHROOT_RES=$? +else + chroot /media/embassy/next "$SHELL" -c "$*" + CHROOT_RES=$? +fi umount /media/embassy/next/run umount /media/embassy/next/dev @@ -28,10 +34,12 @@ umount /media/embassy/next/sys umount /media/embassy/next/proc umount /media/embassy/next/boot -echo 'Upgrading...' +if [ "$CHROOT_RES" -eq 0 ]; then + echo 'Upgrading...' -touch /media/embassy/config/upgrade + touch /media/embassy/config/upgrade -sync + sync -reboot + reboot +fi \ No newline at end of file diff --git a/compress-uis.sh b/compress-uis.sh index d6713d7b9..1a7ea9124 100755 --- a/compress-uis.sh +++ b/compress-uis.sh @@ -4,19 +4,21 @@ set -e rm -rf frontend/dist/static -find frontend/dist/raw -type f -not -name '*.gz' -and -not -name '*.br' | xargs -n 1 -P 0 gzip -kf -find frontend/dist/raw -type f -not -name '*.gz' -and -not -name '*.br' | xargs -n 1 -P 0 brotli -kf +if ! [[ "$ENVIRONMENT" =~ (^|-)dev($|-) ]]; then + find frontend/dist/raw -type f -not -name '*.gz' -and -not -name '*.br' | xargs -n 1 -P 0 gzip -kf + find frontend/dist/raw -type f -not -name '*.gz' -and -not -name '*.br' | xargs -n 1 -P 0 brotli -kf -for file in $(find frontend/dist/raw -type f -not -name '*.gz' -and -not -name '*.br'); do - raw_size=$(du $file | awk '{print $1 * 512}') - gz_size=$(du $file.gz | awk '{print $1 * 512}') - br_size=$(du $file.br | awk '{print $1 * 512}') - if [ $((gz_size * 100 / raw_size)) -gt 70 ]; then - rm $file.gz - fi - if [ $((br_size * 100 / raw_size)) -gt 70 ]; then - rm $file.br - fi -done + for file in $(find frontend/dist/raw -type f -not -name '*.gz' -and -not -name '*.br'); do + raw_size=$(du $file | awk '{print $1 * 512}') + gz_size=$(du $file.gz | awk '{print $1 * 512}') + br_size=$(du $file.br | awk '{print $1 * 512}') + if [ $((gz_size * 100 / raw_size)) -gt 70 ]; then + rm $file.gz + fi + if [ $((br_size * 100 / raw_size)) -gt 70 ]; then + rm $file.br + fi + done +fi cp -r frontend/dist/raw frontend/dist/static \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 76f6b820e..e093338f3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,7 +1,7 @@ { "name": "startos-ui", "version": "0.3.4.4", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -48,7 +48,7 @@ "node-jose": "^2.2.0", "patch-db-client": "file: ../../../patch-db/client", "pbkdf2": "^3.1.2", - "rxjs": "^7.5.6", + "rxjs": "^7.8.1", "swiper": "^8.2.4", "ts-matches": "^5.2.1", "tslib": "^2.3.0", @@ -78,7 +78,7 @@ "raw-loader": "^4.0.2", "ts-node": "^10.7.0", "tslint": "^6.1.3", - "typescript": "^4.6.3", + "typescript": "4.8.4", "webpack-bundle-analyzer": "^4.8.0" } }, @@ -91,30 +91,1893 @@ "uuid": "8.3.2" }, "devDependencies": { - "@types/node": "16.4.13", + "@types/node": "18.15.0", "@types/uuid": "8.3.1", "husky": "^4.3.8", - "lint-staged": "^12.3.7", - "prettier": "^2.6.1", - "ts-node": "10.2.0", + "lint-staged": "^13.2.0", + "prettier": "^2.8.4", + "ts-node": "^10.9.0", "tslint": "6.1.3", - "typescript": "4.3.5" + "typescript": "4.8.4" }, "peerDependencies": { "rxjs": ">=7.0.0" } }, + "../patch-db/client/node_modules/@babel/code-frame": { + "version": "7.21.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../patch-db/client/node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "../patch-db/client/node_modules/@babel/highlight": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "../patch-db/client/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "../patch-db/client/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "../patch-db/client/node_modules/@tsconfig/node10": { + "version": "1.0.9", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@tsconfig/node12": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@tsconfig/node14": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@tsconfig/node16": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@types/node": { + "version": "18.15.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@types/parse-json": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/@types/uuid": { + "version": "8.3.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/acorn": { + "version": "8.8.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../patch-db/client/node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../patch-db/client/node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../patch-db/client/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../patch-db/client/node_modules/arg": { + "version": "4.1.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "../patch-db/client/node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../patch-db/client/node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/builtin-modules": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../patch-db/client/node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../patch-db/client/node_modules/ci-info": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/cli-truncate": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "../patch-db/client/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/commander": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "../patch-db/client/node_modules/compare-versions": { + "version": "3.6.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/cosmiconfig": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "../patch-db/client/node_modules/create-require": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "../patch-db/client/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "../patch-db/client/node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "../patch-db/client/node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "../patch-db/client/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "../patch-db/client/node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/execa": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "../patch-db/client/node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/find-versions": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-regex": "^3.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "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" + } + }, + "../patch-db/client/node_modules/has": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "../patch-db/client/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/human-signals": { + "version": "4.3.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "../patch-db/client/node_modules/husky": { + "version": "4.3.8", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^4.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "husky-run": "bin/run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/husky" + } + }, + "../patch-db/client/node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "../patch-db/client/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/is-core-module": { + "version": "2.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "../patch-db/client/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../patch-db/client/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/lilconfig": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../patch-db/client/node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/lint-staged": { + "version": "13.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "../patch-db/client/node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../patch-db/client/node_modules/lint-staged/node_modules/yaml": { + "version": "2.3.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "../patch-db/client/node_modules/listr2": { + "version": "5.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "../patch-db/client/node_modules/listr2/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/listr2/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/log-update": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "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" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "../patch-db/client/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../patch-db/client/node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "../patch-db/client/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../patch-db/client/node_modules/npm-run-path": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/object-inspect": { + "version": "1.12.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "../patch-db/client/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/opencollective-postinstall": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "../patch-db/client/node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "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" + } + }, + "../patch-db/client/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../patch-db/client/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "../patch-db/client/node_modules/pidtree": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "../patch-db/client/node_modules/pkg-dir": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../patch-db/client/node_modules/please-upgrade-node": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "../patch-db/client/node_modules/prettier": { + "version": "2.8.8", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "../patch-db/client/node_modules/resolve": { + "version": "1.22.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/rfdc": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/rxjs": { + "version": "7.8.1", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "../patch-db/client/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "../patch-db/client/node_modules/semver-compare": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/semver-regex": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/slice-ansi": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "../patch-db/client/node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../patch-db/client/node_modules/sorted-btree": { + "version": "1.5.0", + "license": "MIT" + }, + "../patch-db/client/node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "../patch-db/client/node_modules/string-argv": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "../patch-db/client/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../patch-db/client/node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../patch-db/client/node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "../patch-db/client/node_modules/ts-node": { + "version": "10.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "../patch-db/client/node_modules/tslib": { + "version": "2.5.3", + "license": "0BSD" + }, + "../patch-db/client/node_modules/tslint": { + "version": "6.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/tslint/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/tslint/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "../patch-db/client/node_modules/tsutils": { + "version": "2.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "../patch-db/client/node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "../patch-db/client/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../patch-db/client/node_modules/typescript": { + "version": "4.9.5", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "../patch-db/client/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "../patch-db/client/node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "../patch-db/client/node_modules/which-pm-runs": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../patch-db/client/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "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" + } + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../patch-db/client/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "../patch-db/client/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "../patch-db/client/node_modules/yn": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../patch-db/client/node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@adobe/css-tools": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", - "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -125,9 +1988,8 @@ }, "node_modules/@angular-devkit/architect": { "version": "0.1402.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.3.tgz", - "integrity": "sha512-vU5j0WhSYxux5RzhuZ3VY3B4XbRJuEtVqSoW5j9ew3Oc78tkR6RNXgT97PPr0GfRA1fOEhVoReR7NbsKU3uIkQ==", "devOptional": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "14.2.3", "rxjs": "6.6.7" @@ -140,9 +2002,8 @@ }, "node_modules/@angular-devkit/architect/node_modules/rxjs": { "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -152,15 +2013,13 @@ }, "node_modules/@angular-devkit/architect/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "devOptional": true + "devOptional": true, + "license": "0BSD" }, "node_modules/@angular-devkit/build-angular": { "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.3.tgz", - "integrity": "sha512-Gun2WBM9oXqgOmpwan0OC5OEW2RY6Sd6nrOGzdC5HkvvwxLBV5uycrpYVJiQSPLuQjDLp9S2QTjA2yLtVABYCA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "2.2.0", "@angular-devkit/architect": "0.1402.3", @@ -264,11 +2123,25 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@ngtools/webpack": { + "version": "14.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^14.0.0", + "typescript": ">=4.6.2 <4.9", + "webpack": "^5.54.0" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -278,15 +2151,13 @@ }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@angular-devkit/build-webpack": { "version": "0.1402.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.3.tgz", - "integrity": "sha512-d7ZG7dZElJgtPbp2x2dzMv6usqqzz9CH+RtaGueuivIa/Cd061c3D0pi3XuUBvfaS0qENrlnysYhLkuTnUQGcQ==", "dev": true, + "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.1402.3", "rxjs": "6.6.7" @@ -303,9 +2174,8 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -315,15 +2185,13 @@ }, "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@angular-devkit/core": { "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.3.tgz", - "integrity": "sha512-E8bnC6F0xNni4IIKAnIDBDkbi6cOePm4Q/Y9IrTk3wquGTfsiMlQpdnRA0nr+FTN/LT3N08O5dEw2Gd4ff4tGA==", "devOptional": true, + "license": "MIT", "dependencies": { "ajv": "8.11.0", "ajv-formats": "2.1.1", @@ -347,9 +2215,8 @@ }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -359,15 +2226,13 @@ }, "node_modules/@angular-devkit/core/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "devOptional": true + "devOptional": true, + "license": "0BSD" }, "node_modules/@angular-devkit/schematics": { "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.3.tgz", - "integrity": "sha512-98ldx+To7xW1BH/DqIToQwHVscPZhXnZP01SeoiUnFlJE5FnXx8Lv7qHAQtE96M+cfE5NR1NKBgfCH3S3rnmFA==", "devOptional": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "14.2.3", "jsonc-parser": "3.1.0", @@ -383,9 +2248,8 @@ }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -395,14 +2259,12 @@ }, "node_modules/@angular-devkit/schematics/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "devOptional": true + "devOptional": true, + "license": "0BSD" }, "node_modules/@angular/animations": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.2.tgz", - "integrity": "sha512-YPtwjfjGCtRlGIYyFK8JPq6kfR8Gz93kmkIF+fnUes42M5DAQvCccVRxi1OXU6dDLsFY9w7DvTl+HR/VocaFsg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -415,9 +2277,8 @@ }, "node_modules/@angular/cli": { "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.3.tgz", - "integrity": "sha512-pFo/h3ImjebjKzdw6yWcaERSIzWsSu4eqH9qQ/dWD1ChkSph+krBw3+5Q+Kda5l3dLgl7mQXX6mC5u8IHTdvDg==", "devOptional": true, + "license": "MIT", "dependencies": { "@angular-devkit/architect": "0.1402.3", "@angular-devkit/core": "14.2.3", @@ -451,8 +2312,7 @@ }, "node_modules/@angular/common": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.2.tgz", - "integrity": "sha512-9h8MwFLvIJ5kB5L03cd3Cyl4ySKVzL/E/YYugfLvcAzYZ8Rief63gJnkcKNjoS1A5DTxHhOBQL7pLZpj+YxDOw==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -466,8 +2326,7 @@ }, "node_modules/@angular/compiler": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.2.tgz", - "integrity": "sha512-r6673fINahrESOk1lJgXFDO3cH3gTDJJrj1++yYfrgRSqGMzASECy3XTevCjIvw9SycIkU/P+NiE/W/WAlP5vg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -485,9 +2344,8 @@ }, "node_modules/@angular/compiler-cli": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.2.tgz", - "integrity": "sha512-r3vOBUqInHwahloz4mmSrXk22q/4WGNoRR0hxR71tUhLiowYkAaWe72TdPYrDt0SYgZcffAomK7iQHrpJiwLuQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.17.2", "chokidar": "^3.0.0", @@ -515,8 +2373,7 @@ }, "node_modules/@angular/core": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.2.tgz", - "integrity": "sha512-kG30b4RqjgWvaH9y4g95JRCzoROV+9/xgFH4hSRejFa/IcapMfvCmONJtJzwTjdsEUQAbiFohF/z9bx3QA/Yvw==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -530,8 +2387,7 @@ }, "node_modules/@angular/forms": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.2.tgz", - "integrity": "sha512-lq6PpLMNfs0KcIhkQrUVfKuP4hZSeUQyKOErvoLrPhDiakvOWYoQZKh6XHsbQRcuhWKHy6IITldz6sg8pWVrTw==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -547,17 +2403,15 @@ }, "node_modules/@angular/language-service": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.2.tgz", - "integrity": "sha512-dLPClkbqYUORy2RmbqqkKYAE6D629wkk9bUJcgIQSKeRP+tQKDAlfUHn931T4WHunJlIdLLKx2McQaVmTrhnRw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || >=16.10.0" } }, "node_modules/@angular/platform-browser": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.2.tgz", - "integrity": "sha512-1NrtOIvevoDDT6DU+Fsm5TsNN/XJhIV/UhfInmU/rz97RERl8etcOQRsxWnjGwZjk9rjt+0lBbW5oVDFKOJa+w==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -577,8 +2431,7 @@ }, "node_modules/@angular/platform-browser-dynamic": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.2.tgz", - "integrity": "sha512-fehhiOwC4mn4sprjSiuGc0uITToiiKJJdtUNDsJyOJinKuy3GBwHpGckiEx4E85Z/PkPCMb8lYRJb/IciUV9+A==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -594,8 +2447,7 @@ }, "node_modules/@angular/pwa": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-14.1.0.tgz", - "integrity": "sha512-T+uON9aWEeKoIZmk3ZyTK7TWWj9sKC1qNh+xg8LCEvPOpMNE6VTi2eipMjST6uQhrDazYSXBMO9o9iiVzBkYaw==", + "license": "MIT", "dependencies": { "@angular-devkit/schematics": "14.1.0", "@schematics/angular": "14.1.0", @@ -617,8 +2469,7 @@ }, "node_modules/@angular/pwa/node_modules/@angular-devkit/core": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.1.0.tgz", - "integrity": "sha512-Y2d/+nFmjjY4eatc3cwdDDAnpnhG3KTX2OVW7dXSUxW3eY5e3vdMlVUbFiKwvwAshlrJy85Y6RMvZSBN4VrpnA==", + "license": "MIT", "dependencies": { "ajv": "8.11.0", "ajv-formats": "2.1.1", @@ -642,8 +2493,7 @@ }, "node_modules/@angular/pwa/node_modules/@angular-devkit/schematics": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.1.0.tgz", - "integrity": "sha512-5QC01k9eznuQSiqxijKhVkAEmA8sioYuLhBzyffaPszSySH8kPMNxhAc8zJhBTNLumbS6iDaGkSqTQl5Kv9fOw==", + "license": "MIT", "dependencies": { "@angular-devkit/core": "14.1.0", "jsonc-parser": "3.1.0", @@ -659,8 +2509,7 @@ }, "node_modules/@angular/pwa/node_modules/@schematics/angular": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.1.0.tgz", - "integrity": "sha512-lhqNZzA+iT3XwlwRU757mhYmd5WE9XB2OKFhosvvszou2zuNUJMDPR9P01ZVNCOa2fScOeCMg2q3ZDgGTBl96Q==", + "license": "MIT", "dependencies": { "@angular-devkit/core": "14.1.0", "@angular-devkit/schematics": "14.1.0", @@ -674,8 +2523,7 @@ }, "node_modules/@angular/pwa/node_modules/rxjs": { "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -685,13 +2533,11 @@ }, "node_modules/@angular/pwa/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "license": "0BSD" }, "node_modules/@angular/router": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.2.tgz", - "integrity": "sha512-BRkXdAVK0rE/x6im91a/fdIcWhPILO6ZmwCVTEdvsRyI9arQSlXAnupPUeumdbSc6mG/FCXPcyJq/dU0Jl70Og==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -707,8 +2553,7 @@ }, "node_modules/@angular/service-worker": { "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-14.2.2.tgz", - "integrity": "sha512-SOhpEAXAZWcQbI7UzVAmOhwFgLgEt9cpiYo3u7nF/7ZXgB9nphalYePRK4HWt3DKK+oTNuE9rUMRcvOhBOxsKg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -725,15 +2570,13 @@ }, "node_modules/@assemblyscript/loader": { "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@babel/code-frame": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -743,18 +2586,16 @@ }, "node_modules/@babel/compat-data": { "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", - "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", @@ -782,18 +2623,16 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.10", "@jridgewell/gen-mapping": "^0.3.2", @@ -805,9 +2644,8 @@ }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -819,9 +2657,8 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -831,9 +2668,8 @@ }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.9" @@ -844,9 +2680,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", - "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.19.1", "@babel/helper-validator-option": "^7.18.6", @@ -862,18 +2697,16 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", @@ -892,9 +2725,8 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.1.0" @@ -908,9 +2740,8 @@ }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -925,27 +2756,24 @@ }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -955,9 +2783,8 @@ }, "node_modules/@babel/helper-function-name": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.18.10", "@babel/types": "^7.19.0" @@ -968,9 +2795,8 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -980,9 +2806,8 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.9" }, @@ -992,9 +2817,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -1004,9 +2828,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", @@ -1023,9 +2846,8 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -1035,18 +2857,16 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", @@ -1062,9 +2882,8 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.18.9", @@ -1078,9 +2897,8 @@ }, "node_modules/@babel/helper-simple-access": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -1090,9 +2908,8 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.9" }, @@ -1102,9 +2919,8 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -1114,36 +2930,32 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", @@ -1156,9 +2968,8 @@ }, "node_modules/@babel/helpers": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.18.10", "@babel/traverse": "^7.19.0", @@ -1170,9 +2981,8 @@ }, "node_modules/@babel/highlight": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -1184,9 +2994,8 @@ }, "node_modules/@babel/parser": { "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", - "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", "dev": true, + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -1196,9 +3005,8 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", - "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.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1211,9 +3019,8 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", @@ -1228,9 +3035,8 @@ }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9", @@ -1246,9 +3052,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1262,9 +3067,8 @@ }, "node_modules/@babel/plugin-proposal-class-static-block": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1279,9 +3083,8 @@ }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1295,9 +3098,8 @@ }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -1311,9 +3113,8 @@ }, "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1327,9 +3128,8 @@ }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1343,9 +3143,8 @@ }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -1359,9 +3158,8 @@ }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1375,9 +3173,8 @@ }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.18.8", "@babel/helper-compilation-targets": "^7.18.9", @@ -1394,9 +3191,8 @@ }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1410,9 +3206,8 @@ }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", @@ -1427,9 +3222,8 @@ }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1443,9 +3237,8 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -1461,9 +3254,8 @@ }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1477,9 +3269,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1489,9 +3280,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1501,9 +3291,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1516,9 +3305,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1528,9 +3316,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -1540,9 +3327,8 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1555,9 +3341,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1567,9 +3352,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1579,9 +3363,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1591,9 +3374,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1603,9 +3385,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1615,9 +3396,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1627,9 +3407,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1639,9 +3418,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1654,9 +3432,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1669,9 +3446,8 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1684,9 +3460,8 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1701,9 +3476,8 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1716,9 +3490,8 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1731,9 +3504,8 @@ }, "node_modules/@babel/plugin-transform-classes": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", - "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-compilation-targets": "^7.19.0", @@ -1754,9 +3526,8 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1769,9 +3540,8 @@ }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", - "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1784,9 +3554,8 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1800,9 +3569,8 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1815,9 +3583,8 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1831,9 +3598,8 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1846,9 +3612,8 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", @@ -1863,9 +3628,8 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1878,9 +3642,8 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1893,9 +3656,8 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1910,9 +3672,8 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1928,9 +3689,8 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", - "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.19.0", @@ -1947,9 +3707,8 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1963,9 +3722,8 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.19.0", "@babel/helper-plugin-utils": "^7.19.0" @@ -1979,9 +3737,8 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1994,9 +3751,8 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" @@ -2010,9 +3766,8 @@ }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -2025,9 +3780,8 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -2040,9 +3794,8 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" @@ -2056,9 +3809,8 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -2071,9 +3823,8 @@ }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.9", @@ -2091,18 +3842,16 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -2115,9 +3864,8 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.19.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" @@ -2131,9 +3879,8 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -2146,9 +3893,8 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -2161,9 +3907,8 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -2176,9 +3921,8 @@ }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -2191,9 +3935,8 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -2207,9 +3950,8 @@ }, "node_modules/@babel/preset-env": { "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.18.8", "@babel/helper-compilation-targets": "^7.18.9", @@ -2296,18 +4038,16 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -2321,9 +4061,8 @@ }, "node_modules/@babel/runtime": { "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", "dev": true, + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -2333,9 +4072,8 @@ }, "node_modules/@babel/template": { "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.18.10", @@ -2347,9 +4085,8 @@ }, "node_modules/@babel/traverse": { "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", - "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.19.0", @@ -2368,9 +4105,8 @@ }, "node_modules/@babel/traverse/node_modules/@babel/generator": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.19.0", "@jridgewell/gen-mapping": "^0.3.2", @@ -2382,9 +4118,8 @@ }, "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2396,9 +4131,8 @@ }, "node_modules/@babel/types": { "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", @@ -2410,9 +4144,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2422,9 +4155,8 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2432,9 +4164,8 @@ }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.2", "postcss-selector-parser": "^6.0.10" @@ -2452,9 +4183,8 @@ }, "node_modules/@csstools/postcss-color-function": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2472,9 +4202,8 @@ }, "node_modules/@csstools/postcss-font-format-keywords": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2491,9 +4220,8 @@ }, "node_modules/@csstools/postcss-hwb-function": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2510,9 +4238,8 @@ }, "node_modules/@csstools/postcss-ic-unit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2530,9 +4257,8 @@ }, "node_modules/@csstools/postcss-is-pseudo-class": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -2550,9 +4276,8 @@ }, "node_modules/@csstools/postcss-nested-calc": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2569,9 +4294,8 @@ }, "node_modules/@csstools/postcss-normalize-display-values": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2588,9 +4312,8 @@ }, "node_modules/@csstools/postcss-oklab-function": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -2608,9 +4331,8 @@ }, "node_modules/@csstools/postcss-progressive-custom-properties": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2623,9 +4345,8 @@ }, "node_modules/@csstools/postcss-stepped-value-functions": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2642,9 +4363,8 @@ }, "node_modules/@csstools/postcss-text-decoration-shorthand": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2661,9 +4381,8 @@ }, "node_modules/@csstools/postcss-trigonometric-functions": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -2680,9 +4399,8 @@ }, "node_modules/@csstools/postcss-unset-value": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -2696,9 +4414,8 @@ }, "node_modules/@csstools/selector-specificity": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -2713,39 +4430,20 @@ }, "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, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@gar/promisify": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@ionic/angular": { "version": "6.2.7", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.7.tgz", - "integrity": "sha512-BJWn3RaVfvnNJ1hNVhJ1flEaIcAzH8v5Wl9Pv02wMFV5o8T+lmJF3mXjUIZKL5FVg+PgQeg9ktAjLc8zSZgiXA==", + "license": "MIT", "dependencies": { "@ionic/core": "^6.2.7", "jsonc-parser": "^3.0.0", @@ -2761,9 +4459,8 @@ }, "node_modules/@ionic/cli": { "version": "6.20.1", - "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.20.1.tgz", - "integrity": "sha512-DjMfpjZkOsxlXR9IZ0Q3/cKJKArVQ61EZCOMb2ue/onk6kZNZFvro7o02Wm6K6d57v5zIL3/vfMMDqOLUYUsFQ==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/cli-framework": "5.1.3", "@ionic/cli-framework-output": "2.2.5", @@ -2801,9 +4498,8 @@ }, "node_modules/@ionic/cli-framework": { "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-5.1.3.tgz", - "integrity": "sha512-T2KN/TurzNoAcc3iDt1KHU6GeEa7x9kXngMnu5xs+DzJv5HhBKjVOoo74b8rgVxdPx+dLOV8aLrorlyvsHR/tQ==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/cli-framework-output": "2.2.5", "@ionic/utils-array": "2.1.5", @@ -2827,9 +4523,8 @@ }, "node_modules/@ionic/cli-framework-output": { "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.5.tgz", - "integrity": "sha512-YeDLTnTaE6V4IDUxT8GDIep0GuRIFaR7YZDLANMuuWJZDmnTku6DP+MmQoltBeLmVvz1BAAZgk41xzxdq6H2FQ==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/utils-terminal": "2.3.3", "debug": "^4.0.0", @@ -2841,9 +4536,8 @@ }, "node_modules/@ionic/cli-framework-prompts": { "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.10.tgz", - "integrity": "sha512-h8HbA0teR0vWtGKB3ahzRbDq4yYaxfukgbOqhu9CAEJHosoFlBmDB8PbPnGFYxUg2J1MuCqeiN2ftJQYV/BO1w==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/utils-terminal": "2.3.3", "debug": "^4.0.0", @@ -2856,9 +4550,8 @@ }, "node_modules/@ionic/cli-framework-prompts/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, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2871,9 +4564,8 @@ }, "node_modules/@ionic/cli-framework-prompts/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, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2887,9 +4579,8 @@ }, "node_modules/@ionic/cli-framework-prompts/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2899,24 +4590,21 @@ }, "node_modules/@ionic/cli-framework-prompts/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 + "dev": true, + "license": "MIT" }, "node_modules/@ionic/cli-framework-prompts/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, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@ionic/cli-framework-prompts/node_modules/inquirer": { "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", @@ -2938,9 +4626,8 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs": { "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -2950,15 +4637,13 @@ }, "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@ionic/cli-framework-prompts/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, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2968,9 +4653,8 @@ }, "node_modules/@ionic/cli-framework/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, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2983,9 +4667,8 @@ }, "node_modules/@ionic/cli-framework/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, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2999,9 +4682,8 @@ }, "node_modules/@ionic/cli-framework/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -3011,24 +4693,21 @@ }, "node_modules/@ionic/cli-framework/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 + "dev": true, + "license": "MIT" }, "node_modules/@ionic/cli-framework/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, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@ionic/cli-framework/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, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3038,9 +4717,8 @@ }, "node_modules/@ionic/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==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3053,9 +4731,8 @@ }, "node_modules/@ionic/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==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3069,9 +4746,8 @@ }, "node_modules/@ionic/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==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -3081,24 +4757,21 @@ }, "node_modules/@ionic/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ionic/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@ionic/cli/node_modules/open": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -3112,9 +4785,8 @@ }, "node_modules/@ionic/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==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3124,8 +4796,7 @@ }, "node_modules/@ionic/core": { "version": "6.2.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.7.tgz", - "integrity": "sha512-pQWcIqr5zfCX5De/MQ9kFs+nhaPCr8HIh5QjmydxvmlLv6WU4vlny/Mg0y1+JwLE0qxPD0T9sMykawWH9e3y5Q==", + "license": "MIT", "dependencies": { "@stencil/core": "^2.17.4", "ionicons": "^6.0.3", @@ -3134,9 +4805,8 @@ }, "node_modules/@ionic/utils-array": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", - "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3147,9 +4817,8 @@ }, "node_modules/@ionic/utils-fs": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", - "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", "dev": true, + "license": "MIT", "dependencies": { "@types/fs-extra": "^8.0.0", "debug": "^4.0.0", @@ -3162,9 +4831,8 @@ }, "node_modules/@ionic/utils-network": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-network/-/utils-network-2.1.5.tgz", - "integrity": "sha512-HUQ1Ec4Mh2MXzzKdbbbDS6xYKwpFJ2XRY7SYXbaZT8+jiNahfHbsOfe62/p8bk41Yil7E9EagzGC2JvIFJh01w==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3175,9 +4843,8 @@ }, "node_modules/@ionic/utils-object": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", - "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3188,9 +4855,8 @@ }, "node_modules/@ionic/utils-process": { "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", - "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/utils-object": "2.1.5", "@ionic/utils-terminal": "2.3.3", @@ -3205,9 +4871,8 @@ }, "node_modules/@ionic/utils-stream": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", - "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.0.0", "tslib": "^2.0.1" @@ -3218,9 +4883,8 @@ }, "node_modules/@ionic/utils-subprocess": { "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", - "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", "dev": true, + "license": "MIT", "dependencies": { "@ionic/utils-array": "2.1.5", "@ionic/utils-fs": "3.1.6", @@ -3237,9 +4901,8 @@ }, "node_modules/@ionic/utils-terminal": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", - "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/slice-ansi": "^4.0.0", "debug": "^4.0.0", @@ -3257,9 +4920,8 @@ }, "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==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -3273,18 +4935,16 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -3295,18 +4955,16 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -3317,27 +4975,24 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, + "license": "MIT", "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -3345,9 +5000,8 @@ }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3359,15 +5013,13 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -3375,14 +5027,12 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/@materia-ui/ngx-monaco-editor": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@materia-ui/ngx-monaco-editor/-/ngx-monaco-editor-6.0.0.tgz", - "integrity": "sha512-gTqNQjOGznZxOC0NlmKdKSGCJuTts8YmK4dsTQAGc5IgIV7cZdQWiW6AL742h0ruED6q0cAunEYjXT6jzHBoIQ==", + "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -3393,8 +5043,7 @@ }, "node_modules/@ng-web-apis/common": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-2.1.0.tgz", - "integrity": "sha512-6DLtrsk59z9YwfR8Pm1DiExXpxvMk/RVry/mfsAKkyRmgCGICgDdyQ+eWMVhrOIyUAtt9V+DRvHUeC6iYaHKNQ==", + "license": "MIT", "dependencies": { "tslib": "^2.2.0" }, @@ -3406,8 +5055,7 @@ }, "node_modules/@ng-web-apis/intersection-observer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.0.0.tgz", - "integrity": "sha512-Y3ts9WgXG/A6atyMlFOoP8ZNczUNxUGHSV4ii4xCepwcKW2gN/kkimsP4oPtb7UsTWzN1tF1n0bgD2civraZiA==", + "license": "MIT", "dependencies": { "tslib": "^2.2.0" }, @@ -3418,8 +5066,7 @@ }, "node_modules/@ng-web-apis/mutation-observer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-2.0.0.tgz", - "integrity": "sha512-f51Cu2DloNze1HaTWdUbtYFnt9VXhzpEnHDd9KFdiKOUNfEDx7wrSXIEQqv810hrq7F2jcIAERCdiqV6ItH7Pg==", + "license": "MIT", "dependencies": { "tslib": "^2.2.0" }, @@ -3430,8 +5077,7 @@ }, "node_modules/@ng-web-apis/resize-observer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-2.0.0.tgz", - "integrity": "sha512-umuXJepTYBCI3ZcW9873fozO0qt1PeHLBNM+wXA+7Wphy35+RQcPNmkwfgkKqWceIjlYAvyuPTNWa5TM1OEeqg==", + "license": "MIT", "dependencies": { "tslib": "^2.2.0" }, @@ -3440,27 +5086,10 @@ "@ng-web-apis/common": ">=2.0.0" } }, - "node_modules/@ngtools/webpack": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.3.tgz", - "integrity": "sha512-/9bOlmpx7a5P8QhjmggxEJ6LX5qvfkBZhxM8Orjr6ZjJcmAfm+3wiUDzU3EM+5M0YV3y3+dvQpn6Jrwy9y4rfQ==", - "dev": true, - "engines": { - "node": "^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "typescript": ">=4.6.2 <4.9", - "webpack": "^5.54.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "devOptional": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3471,18 +5100,16 @@ }, "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==", "devOptional": true, + "license": "MIT", "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==", "devOptional": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3493,9 +5120,8 @@ }, "node_modules/@npmcli/fs": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "devOptional": true, + "license": "ISC", "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" @@ -3506,9 +5132,8 @@ }, "node_modules/@npmcli/git": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^3.0.0", "lru-cache": "^7.4.4", @@ -3526,9 +5151,8 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", "devOptional": true, + "license": "ISC", "dependencies": { "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" @@ -3542,9 +5166,8 @@ }, "node_modules/@npmcli/move-file": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "devOptional": true, + "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -3555,18 +5178,16 @@ }, "node_modules/@npmcli/node-gyp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", "devOptional": true, + "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/promise-spawn": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "devOptional": true, + "license": "ISC", "dependencies": { "infer-owner": "^1.0.4" }, @@ -3576,9 +5197,8 @@ }, "node_modules/@npmcli/run-script": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^2.0.0", "@npmcli/promise-spawn": "^3.0.0", @@ -3592,15 +5212,13 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rollup/plugin-json": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", - "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.0.8" }, @@ -3610,9 +5228,8 @@ }, "node_modules/@rollup/plugin-node-resolve": { "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", @@ -3630,9 +5247,8 @@ }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -3647,15 +5263,13 @@ }, "node_modules/@rollup/pluginutils/node_modules/@types/estree": { "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@schematics/angular": { "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.3.tgz", - "integrity": "sha512-lHWeeWrhpyMwJRTK4RpFVptWZo5kTdI+bOOd+lZBTjOAs+PM8r9VXHzB6qhE6P2e3HsceXM59PonvekTUdOJtQ==", "devOptional": true, + "license": "MIT", "dependencies": { "@angular-devkit/core": "14.2.3", "@angular-devkit/schematics": "14.2.3", @@ -3668,19 +5282,15 @@ } }, "node_modules/@start9labs/argon2": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@start9labs/argon2/-/argon2-0.1.0.tgz", - "integrity": "sha512-Ng9Ibuj0p2drQRW013AkUz6TqWysXw/9OyoEoXQZL7kfac0LrxWIDj+xvg+orqQMxcvClWgzeQY/c+IgJtcevA==" + "version": "0.1.0" }, "node_modules/@start9labs/emver": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@start9labs/emver/-/emver-0.1.5.tgz", - "integrity": "sha512-1dhiG03VkfEwSLx/JPKVms6srAbYFQgwfSGhwpUKMDliMXuAHGVaueStmqzVxn3JpH/HEVz0QW8w/PXHqjdiIg==" + "license": "MIT" }, "node_modules/@stencil/core": { "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.18.0.tgz", - "integrity": "sha512-NLEY8Jq59smyiivBAxHKipsp9YkkW/K/Vm90zAyXQqukb12i2SFucWHJ1Ik7ropVlhmMVvigyxXgRfQ9quIqtg==", + "license": "MIT", "bin": { "stencil": "bin/stencil" }, @@ -3691,8 +5301,7 @@ }, "node_modules/@taiga-ui/addon-charts": { "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.20.0.tgz", - "integrity": "sha512-EH/mhwCv7Dq/JaEmGgJnDFr2ZYCzlTJWMS9BHwEZXaLqKVQWiSeXOhB/5sGhuAXiitZb2XvSumlVslAECpe/Kg==", + "license": "Apache-2.0", "dependencies": { "tslib": ">=2.0.0" }, @@ -3707,8 +5316,7 @@ }, "node_modules/@taiga-ui/cdk": { "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.20.0.tgz", - "integrity": "sha512-fXX8pV/MELxfoEjStcTe0Eh+1f3vp/jXrHU5JR7p1yA3KtYw+a8WBPLa2+BNAYYSxhpfLsplCb4K2XcVEdUiew==", + "license": "Apache-2.0", "dependencies": { "@ng-web-apis/common": "2.1.0", "@ng-web-apis/mutation-observer": "2.0.0", @@ -3731,13 +5339,11 @@ }, "node_modules/@taiga-ui/cdk/node_modules/tslib": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "license": "0BSD" }, "node_modules/@taiga-ui/core": { "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.20.0.tgz", - "integrity": "sha512-TzhU2Nos80tpvcM9DiQ4xcO/RvDjUwOvbQyeu5RTk7mPLsEVoRHaFagO4KXOFhr7D5BFMQimqQaQLFI3Y5c8Xw==", + "license": "Apache-2.0", "dependencies": { "@taiga-ui/i18n": "^3.20.0", "tslib": ">=2.0.0" @@ -3760,8 +5366,7 @@ }, "node_modules/@taiga-ui/i18n": { "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.20.0.tgz", - "integrity": "sha512-R0cKNSnvcAXZgfF4j7MPqkja1pQD87XudXG5T3o9qore0ysKCqEW/8A036hBXjLzkHUaMbOutIjy26RZLcoDbQ==", + "license": "Apache-2.0", "dependencies": { "tslib": ">=2.0.0" }, @@ -3772,16 +5377,14 @@ }, "node_modules/@taiga-ui/icons": { "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.20.0.tgz", - "integrity": "sha512-N4lwb/XLUogHY7goTNwdfz03gsYczjP7Qnq+IbuqI1iwuH+e3rUWuOCZBjFZ5m1aAB3d/xnKos8bBf84wixJWQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.2.0" } }, "node_modules/@taiga-ui/kit": { "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.20.0.tgz", - "integrity": "sha512-fo2FDlTWaynaU9fbyLX4uQdKVsFmIRB+K4zHBwnyzrr2JgNqPQfRUXPZNyGA0cOf+r5Sz7Hs5K5i8TGhGKoFZQ==", + "license": "Apache-2.0", "dependencies": { "@ng-web-apis/intersection-observer": "3.0.0", "text-mask-core": "5.1.2", @@ -3803,8 +5406,7 @@ }, "node_modules/@tinkoff/ng-event-plugins": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@tinkoff/ng-event-plugins/-/ng-event-plugins-3.1.0.tgz", - "integrity": "sha512-HqLBes/3MV469L1S08uBqmPUIwihx43py+8Lee1Me9jMFM1ZMuAC3NcS/njUFI1OzXU2kIPyUDEw2jmVbg8mWQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.2.0" }, @@ -3816,8 +5418,7 @@ }, "node_modules/@tinkoff/ng-polymorpheus": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@tinkoff/ng-polymorpheus/-/ng-polymorpheus-4.0.10.tgz", - "integrity": "sha512-BxHSwj9CertJ3qiamZ52NTpsKn81EZHjDwiph8mXiEeKXpuPaDn6e5wmTWdW8mYexLPtBsxmCRvZ9vapw4F1kA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.0.0" }, @@ -3827,17 +5428,15 @@ }, "node_modules/@tootallnate/once": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@ts-morph/common": { "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.9.2.tgz", - "integrity": "sha512-IPyg+c3Am0EBoa63W0f/AKeLrJhvzMzQ4BIvD1baxLopmiHOj1HFTXYxC6e8iTZ+UYtN+/WFM9UyGRnoA20b8g==", + "license": "MIT", "optional": true, "dependencies": { "fast-glob": "^3.2.5", @@ -3848,8 +5447,7 @@ }, "node_modules/@ts-morph/common/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==", + "license": "MIT", "optional": true, "dependencies": { "balanced-match": "^1.0.0", @@ -3858,8 +5456,7 @@ }, "node_modules/@ts-morph/common/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "optional": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -3870,33 +5467,28 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/body-parser": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -3904,27 +5496,24 @@ }, "node_modules/@types/bonjour": { "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", "dev": true, + "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -3932,18 +5521,16 @@ }, "node_modules/@types/dompurify": { "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.3.4.tgz", - "integrity": "sha512-EXzDatIb5EspL2eb/xPGmaC8pePcTHrkDCONjeisusLFrVfl38Pjea/R0YJGu3k9ZQadSvMqW0WXPI2hEo2Ajg==", "dev": true, + "license": "MIT", "dependencies": { "@types/trusted-types": "*" } }, "node_modules/@types/eslint": { "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3951,9 +5538,8 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -3961,15 +5547,13 @@ }, "node_modules/@types/estree": { "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -3979,9 +5563,8 @@ }, "node_modules/@types/express-serve-static-core": { "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3990,129 +5573,111 @@ }, "node_modules/@types/fs-extra": { "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-proxy": { "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/js-yaml": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/marked": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", - "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "license": "MIT", "optional": true }, "node_modules/@types/mustache": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.1.tgz", - "integrity": "sha512-gFAlWL9Ik21nJioqjlGCnNYbf9zHi0sVbaZ/1hQEBcCEuxfLJDvz4bVJSV6v6CUaoLOz0XEIoP7mSrhJ6o237w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "16.11.59", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.59.tgz", - "integrity": "sha512-6u+36Dj3aDzhfBVUf/mfmc92OEdzQ2kx2jcXGdigfl70E/neV21ZHE6UCz4MDzTRcVqGAM27fk+DLXvyDsn3Jw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node-jose": { "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.10.tgz", - "integrity": "sha512-7L0ucJTugW4x/sYpQ+c5IudAwr0pFuxDVnZLpHKWpff7p1lVa3wTuNvnrzFBNeLojE+UY0cVCwNGXLxXsMIrzw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/pbkdf2": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/qs": { "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/resolve": { "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/serve-index": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", "dev": true, + "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "*", "@types/node": "*" @@ -4120,45 +5685,39 @@ }, "node_modules/@types/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/sockjs": { "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/trusted-types": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/uuid": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" @@ -4166,27 +5725,23 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -4195,15 +5750,13 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -4213,33 +5766,29 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -4253,9 +5802,8 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -4266,9 +5814,8 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -4278,9 +5825,8 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -4292,9 +5838,8 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" @@ -4302,39 +5847,33 @@ }, "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==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "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==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "devOptional": true + "devOptional": true, + "license": "BSD-2-Clause" }, "node_modules/abab": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "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, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -4345,9 +5884,8 @@ }, "node_modules/acorn": { "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4357,27 +5895,24 @@ }, "node_modules/acorn-import-assertions": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-walk": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -4388,9 +5923,8 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -4402,9 +5936,8 @@ }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "devOptional": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -4414,9 +5947,8 @@ }, "node_modules/agentkeepalive": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "devOptional": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "depd": "^1.1.2", @@ -4428,9 +5960,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "devOptional": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -4441,8 +5972,7 @@ }, "node_modules/ajv": { "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -4456,8 +5986,7 @@ }, "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==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -4472,9 +6001,8 @@ }, "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, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -4484,8 +6012,7 @@ }, "node_modules/angular-svg-round-progressbar": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/angular-svg-round-progressbar/-/angular-svg-round-progressbar-9.0.0.tgz", - "integrity": "sha512-q8d2AEG9u+GMAMrZY40NgejN5fHwR4iK+rRxtJ7NnMEvvuAMqt9UEtKe0SqVQHvZYE6W16L5J9yaO+TEtfRjpw==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, @@ -4496,18 +6023,16 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "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==", "devOptional": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -4520,29 +6045,26 @@ }, "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" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -4552,8 +6074,7 @@ }, "node_modules/ansi-to-html": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", - "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", + "license": "MIT", "dependencies": { "entities": "^2.2.0" }, @@ -4566,9 +6087,8 @@ }, "node_modules/anymatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "devOptional": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4579,15 +6099,13 @@ }, "node_modules/aproba": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/are-we-there-yet": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "devOptional": true, + "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -4598,19 +6116,16 @@ }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "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==" + "license": "Python-2.0" }, "node_modules/array-differ": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -4618,14 +6133,12 @@ }, "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 + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -4633,8 +6146,7 @@ }, "node_modules/arrify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -4642,9 +6154,8 @@ }, "node_modules/ast-types": { "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -4654,33 +6165,29 @@ }, "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, + "license": "MIT", "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/atob": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true, + "license": "(MIT OR Apache-2.0)", "bin": { "atob": "bin/atob.js" }, @@ -4690,8 +6197,6 @@ }, "node_modules/autoprefixer": { "version": "10.4.11", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.11.tgz", - "integrity": "sha512-5lHp6DgRodxlBLSkzHOTcufWFflH1ewfy2hvFQyjrblBFlP/0Yh4O/Wrg4ow8WRlN3AAUFFLAQwX8hTptzqVHg==", "dev": true, "funding": [ { @@ -4703,6 +6208,7 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } ], + "license": "MIT", "dependencies": { "browserslist": "^4.21.3", "caniuse-lite": "^1.0.30001399", @@ -4723,9 +6229,8 @@ }, "node_modules/babel-loader": { "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, + "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -4742,9 +6247,8 @@ }, "node_modules/babel-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -4756,18 +6260,16 @@ }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, + "license": "MIT", "dependencies": { "object.assign": "^4.1.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==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -4781,9 +6283,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", @@ -4795,18 +6296,16 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.2", "core-js-compat": "^3.21.0" @@ -4817,9 +6316,8 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3" }, @@ -4829,75 +6327,11 @@ }, "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==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "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" - } - ] - }, - "node_modules/base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", - "engines": { - "node": ">=6.0.0" - } - }, - "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 - }, - "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, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -4912,6 +6346,62 @@ "url": "https://feross.org/support" } ], + "license": "MIT" + }, + "node_modules/base64url": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -4919,9 +6409,8 @@ }, "node_modules/body-parser": { "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -4943,33 +6432,29 @@ }, "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, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/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, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "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 + "dev": true, + "license": "MIT" }, "node_modules/body-parser/node_modules/qs": { "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -4982,9 +6467,8 @@ }, "node_modules/bonjour-service": { "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dev": true, + "license": "MIT", "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -4994,24 +6478,21 @@ }, "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 + "dev": true, + "license": "ISC" }, "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==", "devOptional": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "devOptional": true, + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -5021,8 +6502,6 @@ }, "node_modules/browserslist": { "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "funding": [ { @@ -5034,6 +6513,7 @@ "url": "https://tidelift.com/funding/github/npm/browserslist" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001400", "electron-to-chromium": "^1.4.251", @@ -5049,8 +6529,6 @@ }, "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", @@ -5065,6 +6543,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -5072,15 +6551,13 @@ }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "engines": { "node": ">=6" }, @@ -5090,27 +6567,24 @@ }, "node_modules/builtins": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "devOptional": true, + "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacache": { "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", @@ -5137,9 +6611,8 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -5150,25 +6623,21 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "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==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { "version": "1.0.30001407", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001407.tgz", - "integrity": "sha512-4ydV+t4P7X3zH83fQWNDX/mQEzYomossfpViCOx9zHBSMV+rIe3LFqglHHtVyvNl1FhTNxPxs3jei82iqOW04w==", "dev": true, "funding": [ { @@ -5179,27 +6648,25 @@ "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/cbor": { "name": "@jprochazk/cbor", "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@jprochazk/cbor/-/cbor-0.4.9.tgz", - "integrity": "sha512-FWNnkOtWrFOLXKG2nzOHR/EnCCGZZPvatAvWXDmkTDxgjj9JHDK3DkMUHcFCY3a9weylMCSO/nLOUM170NAO0Q==" + "license": "MIT" }, "node_modules/cbor-web": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor-web/-/cbor-web-8.1.0.tgz", - "integrity": "sha512-2hWHHMVrfffgoEmsAUh8vCxHoLa1vgodtC73+C5cSarkJlwTapnqAzcHINlP6Ej0DXuP4OmmJ9LF+JaNM5Lj/g==", + "license": "MIT", "engines": { "node": ">=12.19" } }, "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==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -5211,14 +6678,11 @@ }, "node_modules/chardet": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/chokidar": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "devOptional": true, "funding": [ { @@ -5226,6 +6690,7 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5244,32 +6709,28 @@ }, "node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=10" } }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -5277,17 +6738,15 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -5297,8 +6756,7 @@ }, "node_modules/cli-spinners": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -5308,9 +6766,8 @@ }, "node_modules/cli-truncate": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" @@ -5324,9 +6781,8 @@ }, "node_modules/cli-truncate/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==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5336,9 +6792,8 @@ }, "node_modules/cli-truncate/node_modules/ansi-styles": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5348,15 +6803,13 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5366,9 +6819,8 @@ }, "node_modules/cli-truncate/node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -5382,9 +6834,8 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -5399,9 +6850,8 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5414,18 +6864,16 @@ }, "node_modules/cli-width": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "devOptional": true, + "license": "ISC", "engines": { "node": ">= 10" } }, "node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "devOptional": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -5434,17 +6882,15 @@ }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", "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, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -5456,45 +6902,39 @@ }, "node_modules/code-block-writer": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", - "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "license": "MIT", "optional": 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==", "dev": true, + "license": "MIT", "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "devOptional": true, + "license": "ISC", "bin": { "color-support": "bin.js" } }, "node_modules/colorette": { "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5504,36 +6944,31 @@ }, "node_modules/commander": { "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || >=14" } }, "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compare-versions": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/component-emitter": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -5543,9 +6978,8 @@ }, "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, + "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -5561,54 +6995,47 @@ }, "node_modules/compression/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, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "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, + "license": "MIT", "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 + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "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, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "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, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -5618,8 +7045,6 @@ }, "node_modules/content-disposition/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==", "dev": true, "funding": [ { @@ -5634,52 +7059,47 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/content-type": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.1" } }, "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, + "license": "MIT", "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 + "dev": true, + "license": "MIT" }, "node_modules/cookiejar": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/copy-anything": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, + "license": "MIT", "dependencies": { "is-what": "^3.14.1" }, @@ -5689,9 +7109,8 @@ }, "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, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", @@ -5713,9 +7132,8 @@ }, "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, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -5725,9 +7143,8 @@ }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -5744,9 +7161,8 @@ }, "node_modules/core-js": { "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.2.tgz", - "integrity": "sha512-YB4IAT1bjEfxTJ1XYy11hJAKskO+qmhuDBM8/guIfMz4JvdsAQAqvyb97zXX7JgSrfPLG5mRGFWJwJD39ruq2A==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -5754,9 +7170,8 @@ }, "node_modules/core-js-compat": { "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.2.tgz", - "integrity": "sha512-TxfyECD4smdn3/CjWxczVtJqVLEEC2up7/82t7vC0AzNogr+4nQ8vyF7abxAuTXWvjTClSbvGhU0RgqA4ToQaQ==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.21.4" }, @@ -5767,15 +7182,13 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -5789,8 +7202,7 @@ }, "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==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -5801,8 +7213,7 @@ }, "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==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -5814,15 +7225,13 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/critters": { "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "chalk": "^4.1.0", "css-select": "^4.2.0", @@ -5834,9 +7243,8 @@ }, "node_modules/critters/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, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5849,9 +7257,8 @@ }, "node_modules/critters/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, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5865,9 +7272,8 @@ }, "node_modules/critters/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5877,24 +7283,21 @@ }, "node_modules/critters/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 + "dev": true, + "license": "MIT" }, "node_modules/critters/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, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/critters/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, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5904,9 +7307,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==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5918,9 +7320,8 @@ }, "node_modules/css-blank-pseudo": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -5936,9 +7337,8 @@ }, "node_modules/css-has-pseudo": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -5954,9 +7354,8 @@ }, "node_modules/css-loader": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.7", @@ -5980,9 +7379,8 @@ }, "node_modules/css-prefers-color-scheme": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", "dev": true, + "license": "CC0-1.0", "bin": { "css-prefers-color-scheme": "dist/cli.cjs" }, @@ -5995,9 +7393,8 @@ }, "node_modules/css-select": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -6011,9 +7408,8 @@ }, "node_modules/css-what": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -6023,9 +7419,8 @@ }, "node_modules/cssdb": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.0.1.tgz", - "integrity": "sha512-pT3nzyGM78poCKLAEy2zWIVX2hikq6dIrjuZzLV98MumBg+xMTNYfHx7paUlfiRTgg91O/vR889CIf+qiv79Rw==", "dev": true, + "license": "CC0-1.0", "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" @@ -6033,9 +7428,8 @@ }, "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, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -6045,24 +7439,21 @@ }, "node_modules/cuint": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/data-uri-to-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "devOptional": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -6077,41 +7468,36 @@ }, "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==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decode-uri-component": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "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 + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true, + "license": "MIT", "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, + "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, @@ -6121,26 +7507,23 @@ }, "node_modules/defaults": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "license": "MIT", "dependencies": { "clone": "^1.0.2" } }, "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==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/define-properties": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, + "license": "MIT", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -6154,9 +7537,8 @@ }, "node_modules/degenerator": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", - "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", "dev": true, + "license": "MIT", "dependencies": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", @@ -6169,42 +7551,37 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/dependency-graph": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.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, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -6212,29 +7589,25 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/dijkstrajs": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", - "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -6244,15 +7617,13 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/dns-packet": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "dev": true, + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -6262,9 +7633,8 @@ }, "node_modules/dom-serializer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -6276,29 +7646,26 @@ }, "node_modules/dom7": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.4.tgz", - "integrity": "sha512-DSSgBzQ4rJWQp1u6o+3FVwMNnT5bzQbMb+o31TjYYeRi05uAcpF8koxdfzeoe5ElzPmua7W7N28YJhF7iEKqIw==", + "license": "MIT", "dependencies": { "ssr-window": "^4.0.0" } }, "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" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -6311,14 +7678,12 @@ }, "node_modules/dompurify": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.0.tgz", - "integrity": "sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==" + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -6330,24 +7695,21 @@ }, "node_modules/duplexer": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/duplexer2": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" } }, "node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6360,36 +7722,31 @@ }, "node_modules/duplexer2/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, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.4.255", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.255.tgz", - "integrity": "sha512-H+mFNKow6gi2P5Gi2d1Fvd3TUEJlB9CF7zYaIV9T83BE3wP1xZ0mRPbNTm0KUjyd1QiVy7iKXuIcjlDtBQMiAQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/elementtree": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", - "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "sax": "1.1.4" }, @@ -6399,37 +7756,32 @@ }, "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==" + "license": "MIT" }, "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, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/encode-utf8": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + "license": "MIT" }, "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, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/encoding": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -6437,9 +7789,8 @@ }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -6450,18 +7801,16 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6472,32 +7821,28 @@ }, "node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/errno": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "prr": "~1.0.1" @@ -6508,30 +7853,26 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-module-lexer": { "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es6-promise": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "license": "MIT" }, "node_modules/esbuild": { "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "bin": { "esbuild": "bin/esbuild" @@ -6563,62 +7904,13 @@ "esbuild-windows-arm64": "0.15.5" } }, - "node_modules/esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild-darwin-arm64": { "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -6627,219 +7919,10 @@ "node": ">=12" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild-wasm": { "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", "dev": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -6847,83 +7930,31 @@ "node": ">=12" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "devOptional": true, + "license": "MIT", "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==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -6943,9 +7974,8 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -6953,9 +7983,8 @@ }, "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==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -6966,9 +7995,8 @@ }, "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==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6979,9 +8007,8 @@ }, "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==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -6991,72 +8018,63 @@ }, "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==", "dev": true, + "license": "BSD-2-Clause", "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==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "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, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/eventemitter-asyncresource": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -7077,9 +8095,8 @@ }, "node_modules/express": { "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -7119,39 +8136,34 @@ }, "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 + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/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, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "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 + "dev": true, + "license": "MIT" }, "node_modules/express/node_modules/qs": { "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -7164,8 +8176,6 @@ }, "node_modules/express/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==", "dev": true, "funding": [ { @@ -7180,13 +8190,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "devOptional": true, + "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -7198,14 +8208,12 @@ }, "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==" + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "devOptional": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7219,41 +8227,35 @@ }, "node_modules/fast-json-patch": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + "license": "MIT" }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "devOptional": true, + "license": "ISC", "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, + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -7263,9 +8265,8 @@ }, "node_modules/figures": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "devOptional": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -7278,18 +8279,16 @@ }, "node_modules/file-uri-to-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "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==", "devOptional": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7299,9 +8298,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, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -7317,24 +8315,21 @@ }, "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, + "license": "MIT", "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 + "dev": true, + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -7349,8 +8344,7 @@ }, "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==", + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -7361,9 +8355,8 @@ }, "node_modules/find-versions": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", "dev": true, + "license": "MIT", "dependencies": { "semver-regex": "^3.1.2" }, @@ -7376,8 +8369,6 @@ }, "node_modules/follow-redirects": { "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, "funding": [ { @@ -7385,6 +8376,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -7396,9 +8388,8 @@ }, "node_modules/form-data": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7410,28 +8401,24 @@ }, "node_modules/formidable": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", "dev": true, + "license": "MIT", "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, @@ -7442,18 +8429,16 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -7466,9 +8451,8 @@ }, "node_modules/fs-minipass": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "devOptional": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -7478,22 +8462,18 @@ }, "node_modules/fs-monkey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true + "dev": true, + "license": "Unlicense" }, "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==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -7504,8 +8484,6 @@ }, "node_modules/ftp": { "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dev": true, "dependencies": { "readable-stream": "1.1.x", @@ -7517,15 +8495,13 @@ }, "node_modules/ftp/node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ftp/node_modules/readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -7535,29 +8511,25 @@ }, "node_modules/ftp/node_modules/string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/fuse.js": { "version": "6.6.2", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", + "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/gauge": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "devOptional": true, + "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -7574,26 +8546,23 @@ }, "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==", "dev": true, + "license": "MIT", "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==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -7605,18 +8574,16 @@ }, "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==", "dev": true, + "license": "MIT", "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -7626,9 +8593,8 @@ }, "node_modules/get-uri": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "1", "data-uri-to-buffer": "3", @@ -7643,18 +8609,16 @@ }, "node_modules/get-uri/node_modules/@tootallnate/once": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/get-uri/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -7666,27 +8630,24 @@ }, "node_modules/get-uri/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/get-uri/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/glob": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "devOptional": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7703,9 +8664,8 @@ }, "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, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -7715,24 +8675,21 @@ }, "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==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globby": { "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -7749,15 +8706,13 @@ }, "node_modules/graceful-fs": { "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/gzip-size": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, + "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, @@ -7770,15 +8725,13 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "devOptional": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1" }, @@ -7788,18 +8741,16 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -7809,9 +8760,8 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7821,14 +8771,12 @@ }, "node_modules/has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "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==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -7840,8 +8788,6 @@ }, "node_modules/hash-base/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", @@ -7855,13 +8801,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/hdr-histogram-js": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "dev": true, + "license": "BSD", "dependencies": { "@assemblyscript/loader": "^0.10.1", "base64-js": "^1.2.0", @@ -7870,30 +8816,26 @@ }, "node_modules/hdr-histogram-js/node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "dev": true, + "license": "(MIT AND Zlib)" }, "node_modules/hdr-histogram-percentiles-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/hosted-git-info": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.1.0.tgz", - "integrity": "sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q==", "devOptional": true, + "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -7903,9 +8845,8 @@ }, "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, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -7915,9 +8856,8 @@ }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7930,36 +8870,31 @@ }, "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, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/html-entities": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "devOptional": true + "devOptional": true, + "license": "BSD-2-Clause" }, "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 + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -7973,24 +8908,21 @@ }, "node_modules/http-errors/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, + "license": "MIT", "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 + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -8002,9 +8934,8 @@ }, "node_modules/http-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "devOptional": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -8016,9 +8947,8 @@ }, "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, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -8040,9 +8970,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "devOptional": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -8053,28 +8982,25 @@ }, "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==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/humanize-ms": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "devOptional": true, + "license": "MIT", "dependencies": { "ms": "^2.0.0" } }, "node_modules/husky": { "version": "4.3.8", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", - "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "ci-info": "^2.0.0", @@ -8101,9 +9027,8 @@ }, "node_modules/husky/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, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8116,9 +9041,8 @@ }, "node_modules/husky/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, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8132,9 +9056,8 @@ }, "node_modules/husky/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8144,15 +9067,13 @@ }, "node_modules/husky/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 + "dev": true, + "license": "MIT" }, "node_modules/husky/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, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8166,18 +9087,16 @@ }, "node_modules/husky/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, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/husky/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, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -8190,9 +9109,8 @@ }, "node_modules/husky/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==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -8205,9 +9123,8 @@ }, "node_modules/husky/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, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -8220,9 +9137,8 @@ }, "node_modules/husky/node_modules/pkg-dir": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^5.0.0" }, @@ -8232,18 +9148,16 @@ }, "node_modules/husky/node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/husky/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, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8253,9 +9167,8 @@ }, "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==", "devOptional": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -8265,9 +9178,8 @@ }, "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, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -8277,8 +9189,6 @@ }, "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", @@ -8292,22 +9202,21 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "devOptional": true, + "license": "ISC", "dependencies": { "minimatch": "^5.0.1" }, @@ -8317,9 +9226,8 @@ }, "node_modules/image-size": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, + "license": "MIT", "optional": true, "bin": { "image-size": "bin/image-size.js" @@ -8330,15 +9238,13 @@ }, "node_modules/immutable": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8352,42 +9258,37 @@ }, "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, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/infer-owner": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "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==", "devOptional": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8395,32 +9296,28 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/ini": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", "devOptional": true, + "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/injection-js": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", - "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.0" } }, "node_modules/inquirer": { "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -8444,9 +9341,8 @@ }, "node_modules/inquirer/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==", "devOptional": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8459,9 +9355,8 @@ }, "node_modules/inquirer/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8475,9 +9370,8 @@ }, "node_modules/inquirer/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==", "devOptional": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8487,24 +9381,21 @@ }, "node_modules/inquirer/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==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/inquirer/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==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inquirer/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==", "devOptional": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8514,16 +9405,14 @@ }, "node_modules/ionicons": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.3.tgz", - "integrity": "sha512-kVOWER991EMqLiVShrCSWKMHkgHZP7XfVdyN6YPMuoO33W7pc5CPNVNfR8OMe/I8rYEbaunyBs6dXNYpR6gGZw==", + "license": "MIT", "dependencies": { "@stencil/core": "~2.16.0" } }, "node_modules/ionicons/node_modules/@stencil/core": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.16.1.tgz", - "integrity": "sha512-s/UJp9qxExL3DyQPT70kiuWeb3AdjbUZM+5lEIXn30I2DLcLYPOPXfsoWJODieQywq+3vPiLZeIdkoqjf6jcSw==", + "license": "MIT", "bin": { "stencil": "bin/stencil" }, @@ -8534,30 +9423,26 @@ }, "node_modules/ip": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/ipaddr.js": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -8567,9 +9452,8 @@ }, "node_modules/is-builtin-module": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", "dev": true, + "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" }, @@ -8582,9 +9466,8 @@ }, "node_modules/is-core-module": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "devOptional": true, + "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -8594,9 +9477,8 @@ }, "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==", "devOptional": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -8609,26 +9491,23 @@ }, "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, + "license": "MIT", "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==", + "license": "MIT", "engines": { "node": ">=8" } }, "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, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -8638,38 +9517,33 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-lambda": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/is-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "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, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8679,9 +9553,8 @@ }, "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, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -8691,9 +9564,8 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -8703,14 +9575,12 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -8720,15 +9590,13 @@ }, "node_modules/is-what": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "devOptional": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -8738,39 +9606,34 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "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, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -8784,18 +9647,16 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8807,18 +9668,16 @@ }, "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==", "dev": true, + "license": "MIT", "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==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8831,22 +9690,19 @@ }, "node_modules/jose": { "version": "4.9.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.9.3.tgz", - "integrity": "sha512-f8E/z+T3Q0kA9txzH2DKvH/ds2uggcw0m3vVPSB9HrSkrQ7mojjifvS7aR8cw+lQl2Fcmx9npwaHpM/M3GD8UQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -8856,9 +9712,8 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -8868,20 +9723,17 @@ }, "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==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "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==" + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -8891,14 +9743,12 @@ }, "node_modules/jsonc-parser": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" + "license": "MIT" }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -8908,45 +9758,40 @@ }, "node_modules/jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "devOptional": true, "engines": [ "node >= 0.2.0" - ] + ], + "license": "MIT" }, "node_modules/karma-source-map-support": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, + "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } }, "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, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/klona": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/leek": { "version": "0.0.24", - "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", - "integrity": "sha512-6PVFIYXxlYF0o6hrAsHtGpTmi06otkwNrMcmQ0K96SeSRHPREPa9J3nJZ1frliVH7XT0XFswoJFQoXsDukzGNQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^2.1.0", "lodash.assign": "^3.2.0", @@ -8955,24 +9800,21 @@ }, "node_modules/leek/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, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/leek/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/less": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -8996,9 +9838,8 @@ }, "node_modules/less-loader": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", "dev": true, + "license": "MIT", "dependencies": { "klona": "^2.0.4" }, @@ -9016,9 +9857,8 @@ }, "node_modules/less/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==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "pify": "^4.0.1", @@ -9030,9 +9870,8 @@ }, "node_modules/less/node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -9040,9 +9879,8 @@ }, "node_modules/less/node_modules/semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, + "license": "ISC", "optional": true, "bin": { "semver": "bin/semver" @@ -9050,9 +9888,8 @@ }, "node_modules/less/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==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -9060,9 +9897,8 @@ }, "node_modules/levn": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -9073,9 +9909,8 @@ }, "node_modules/license-webpack-plugin": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, + "license": "ISC", "dependencies": { "webpack-sources": "^3.0.0" }, @@ -9090,24 +9925,21 @@ }, "node_modules/lilconfig": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lint-staged": { "version": "12.5.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.5.0.tgz", - "integrity": "sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g==", "dev": true, + "license": "MIT", "dependencies": { "cli-truncate": "^3.1.0", "colorette": "^2.0.16", @@ -9136,9 +9968,8 @@ }, "node_modules/lint-staged/node_modules/supports-color": { "version": "9.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.3.tgz", - "integrity": "sha512-aszYUX/DVK/ed5rFLb/dDinVJrQjG/vmU433wtqVSD800rYsJNWxh2R3USV90aLSU+UsyQkbNeffVLzc6B6foA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -9148,9 +9979,8 @@ }, "node_modules/listr2": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", "dev": true, + "license": "MIT", "dependencies": { "cli-truncate": "^2.1.0", "colorette": "^2.0.16", @@ -9175,9 +10005,8 @@ }, "node_modules/listr2/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, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9190,9 +10019,8 @@ }, "node_modules/listr2/node_modules/cli-truncate": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" @@ -9206,9 +10034,8 @@ }, "node_modules/listr2/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9218,15 +10045,13 @@ }, "node_modules/listr2/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 + "dev": true, + "license": "MIT" }, "node_modules/listr2/node_modules/slice-ansi": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -9238,26 +10063,23 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "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==", + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -9267,14 +10089,12 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash._baseassign": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", "dev": true, + "license": "MIT", "dependencies": { "lodash._basecopy": "^3.0.0", "lodash.keys": "^3.0.0" @@ -9282,21 +10102,18 @@ }, "node_modules/lodash._basecopy": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash._bindcallback": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash._createassigner": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", "dev": true, + "license": "MIT", "dependencies": { "lodash._bindcallback": "^3.0.0", "lodash._isiterateecall": "^3.0.0", @@ -9305,21 +10122,18 @@ }, "node_modules/lodash._getnative": { "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash._isiterateecall": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.assign": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", "dev": true, + "license": "MIT", "dependencies": { "lodash._baseassign": "^3.0.0", "lodash._createassigner": "^3.0.0", @@ -9328,27 +10142,23 @@ }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isarguments": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isarray": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.keys": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", "dev": true, + "license": "MIT", "dependencies": { "lodash._getnative": "^3.0.0", "lodash.isarguments": "^3.0.0", @@ -9357,14 +10167,12 @@ }, "node_modules/lodash.restparam": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -9378,8 +10186,7 @@ }, "node_modules/log-symbols/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==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9392,8 +10199,7 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9407,8 +10213,7 @@ }, "node_modules/log-symbols/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==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9418,21 +10223,18 @@ }, "node_modules/log-symbols/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==" + "license": "MIT" }, "node_modules/log-symbols/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==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/log-symbols/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==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9442,9 +10244,8 @@ }, "node_modules/log-update": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", @@ -9460,9 +10261,8 @@ }, "node_modules/log-update/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, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9475,9 +10275,8 @@ }, "node_modules/log-update/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9487,15 +10286,13 @@ }, "node_modules/log-update/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 + "dev": true, + "license": "MIT" }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9506,24 +10303,21 @@ } }, "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "version": "5.2.0", + "license": "Apache-2.0" }, "node_modules/lru-cache": { "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/macos-release": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -9533,8 +10327,7 @@ }, "node_modules/magic-string": { "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" }, @@ -9544,9 +10337,8 @@ }, "node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -9559,24 +10351,21 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "devOptional": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", @@ -9601,8 +10390,7 @@ }, "node_modules/marked": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz", - "integrity": "sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA==", + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -9612,8 +10400,7 @@ }, "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==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -9622,18 +10409,16 @@ }, "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, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dev": true, + "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.3" }, @@ -9643,39 +10428,34 @@ }, "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 + "dev": true, + "license": "MIT" }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "devOptional": true, + "license": "MIT", "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, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "devOptional": true, + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -9686,9 +10466,8 @@ }, "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, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -9698,18 +10477,16 @@ }, "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==", "dev": true, + "license": "MIT", "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==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -9719,17 +10496,15 @@ }, "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==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mini-css-extract-plugin": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dev": true, + "license": "MIT", "dependencies": { "schema-utils": "^4.0.0" }, @@ -9746,9 +10521,8 @@ }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -9765,15 +10539,13 @@ }, "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==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minimatch": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "devOptional": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9783,15 +10555,13 @@ }, "node_modules/minimist": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/minipass": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", "devOptional": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9801,9 +10571,8 @@ }, "node_modules/minipass-collect": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "devOptional": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9813,9 +10582,8 @@ }, "node_modules/minipass-fetch": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "devOptional": true, + "license": "MIT", "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", @@ -9830,9 +10598,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "devOptional": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9842,9 +10609,8 @@ }, "node_modules/minipass-json-stream": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "devOptional": true, + "license": "MIT", "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" @@ -9852,9 +10618,8 @@ }, "node_modules/minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "devOptional": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9864,9 +10629,8 @@ }, "node_modules/minipass-sized": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "devOptional": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9876,9 +10640,8 @@ }, "node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "devOptional": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -9889,9 +10652,8 @@ }, "node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "devOptional": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -9901,29 +10663,25 @@ }, "node_modules/monaco-editor": { "version": "0.33.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", - "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" + "license": "MIT" }, "node_modules/mrmime": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "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==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -9934,8 +10692,7 @@ }, "node_modules/multimatch": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "license": "MIT", "optional": true, "dependencies": { "@types/minimatch": "^3.0.3", @@ -9953,8 +10710,7 @@ }, "node_modules/multimatch/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==", + "license": "MIT", "optional": true, "dependencies": { "balanced-match": "^1.0.0", @@ -9963,8 +10719,7 @@ }, "node_modules/multimatch/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "optional": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -9975,23 +10730,20 @@ }, "node_modules/mustache": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", "bin": { "mustache": "bin/mustache" } }, "node_modules/mute-stream": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/nanoid": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true, + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10001,9 +10753,8 @@ }, "node_modules/needle": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz", - "integrity": "sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "debug": "^3.2.6", @@ -10019,9 +10770,8 @@ }, "node_modules/needle/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "ms": "^2.1.1" @@ -10029,9 +10779,8 @@ }, "node_modules/needle/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -10042,39 +10791,34 @@ }, "node_modules/needle/node_modules/sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, + "license": "ISC", "optional": 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==", "devOptional": true, + "license": "MIT", "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/ng-morph": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-2.1.0.tgz", - "integrity": "sha512-jn34Ter6HlY7E3yOoMhfk3cnUwjLlvcGTsAJ7jS0pZ3SAGi3hzqlf3oyUQO6fNfbFnydc33yNqQtUIrbHKCtNA==", + "license": "Apache-2.0", "optional": true, "dependencies": { "jsonc-parser": "3.0.0", @@ -10089,8 +10833,7 @@ }, "node_modules/ng-morph/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==", + "license": "MIT", "optional": true, "dependencies": { "balanced-match": "^1.0.0", @@ -10099,14 +10842,12 @@ }, "node_modules/ng-morph/node_modules/jsonc-parser": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "license": "MIT", "optional": true }, "node_modules/ng-morph/node_modules/minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "license": "ISC", "optional": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -10117,9 +10858,8 @@ }, "node_modules/ng-packagr": { "version": "14.2.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-14.2.1.tgz", - "integrity": "sha512-o2t/a+DdhUEbXXPbR70LZcU4WcSf7wnddCiQcc3k0HrTQjxWspv0qFUdba3+0ft0dVetaywa6lc+98g/SZEKcQ==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^13.1.3", @@ -10163,8 +10903,7 @@ }, "node_modules/ng-qrcode": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-7.0.0.tgz", - "integrity": "sha512-Mx7nf8rtGMVYxGe2qfy8/JNiCnxKD7uFsqpP2Hm5eJSQrOEapQl9FR0yuK0I4MMQorJ7s8mZZDxmszQiH8R2Kg==", + "license": "MIT", "dependencies": { "qrcode": "^1.5.0", "tslib": "^2.4.0" @@ -10176,10 +10915,9 @@ }, "node_modules/nice-napi": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "!win32" @@ -10191,24 +10929,21 @@ }, "node_modules/node-addon-api": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, + "license": "MIT", "optional": true }, "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==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-gyp": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", - "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", "devOptional": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -10230,9 +10965,8 @@ }, "node_modules/node-gyp-build": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", "dev": true, + "license": "MIT", "optional": true, "bin": { "node-gyp-build": "bin.js", @@ -10242,9 +10976,8 @@ }, "node_modules/node-gyp/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==", "devOptional": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10252,9 +10985,8 @@ }, "node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "devOptional": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10272,9 +11004,8 @@ }, "node_modules/node-gyp/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10284,9 +11015,8 @@ }, "node_modules/node-html-parser": { "version": "5.4.2", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", - "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", "dev": true, + "license": "MIT", "dependencies": { "css-select": "^4.2.1", "he": "1.2.0" @@ -10294,8 +11024,7 @@ }, "node_modules/node-jose": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz", - "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==", + "license": "Apache-2.0", "dependencies": { "base64url": "^3.0.1", "buffer": "^6.0.3", @@ -10310,23 +11039,20 @@ }, "node_modules/node-jose/node_modules/uuid": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/node-releases": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nopt": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "devOptional": true, + "license": "ISC", "dependencies": { "abbrev": "1" }, @@ -10339,9 +11065,8 @@ }, "node_modules/normalize-package-data": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "devOptional": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^5.0.0", "is-core-module": "^2.8.1", @@ -10354,36 +11079,32 @@ }, "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==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-bundled": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "devOptional": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "node_modules/npm-install-checks": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", "devOptional": true, + "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -10393,15 +11114,13 @@ }, "node_modules/npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/npm-package-arg": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", "devOptional": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^5.0.0", "proc-log": "^2.0.1", @@ -10414,9 +11133,8 @@ }, "node_modules/npm-packlist": { "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", "devOptional": true, + "license": "ISC", "dependencies": { "glob": "^8.0.1", "ignore-walk": "^5.0.1", @@ -10432,9 +11150,8 @@ }, "node_modules/npm-packlist/node_modules/npm-bundled": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", "devOptional": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^2.0.0" }, @@ -10444,18 +11161,16 @@ }, "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "devOptional": true, + "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm-pick-manifest": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", "devOptional": true, + "license": "ISC", "dependencies": { "npm-install-checks": "^5.0.0", "npm-normalize-package-bin": "^1.0.1", @@ -10468,9 +11183,8 @@ }, "node_modules/npm-registry-fetch": { "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", "devOptional": true, + "license": "ISC", "dependencies": { "make-fetch-happen": "^10.0.6", "minipass": "^3.1.6", @@ -10486,9 +11200,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -10498,9 +11211,8 @@ }, "node_modules/npmlog": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "devOptional": true, + "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -10513,9 +11225,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, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -10525,27 +11236,24 @@ }, "node_modules/object-inspect": { "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true, + "license": "MIT", "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==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -10561,15 +11269,13 @@ }, "node_modules/obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -10579,26 +11285,23 @@ }, "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, + "license": "MIT", "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==", "devOptional": true, + "license": "ISC", "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==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -10611,9 +11314,8 @@ }, "node_modules/open": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "devOptional": true, + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -10628,27 +11330,24 @@ }, "node_modules/opencollective-postinstall": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true, + "license": "MIT", "bin": { "opencollective-postinstall": "index.js" } }, "node_modules/opener": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, + "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -10663,8 +11362,7 @@ }, "node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -10685,8 +11383,7 @@ }, "node_modules/ora/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==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -10699,8 +11396,7 @@ }, "node_modules/ora/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10714,8 +11410,7 @@ }, "node_modules/ora/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==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -10725,21 +11420,18 @@ }, "node_modules/ora/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==" + "license": "MIT" }, "node_modules/ora/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==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ora/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==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10749,9 +11441,8 @@ }, "node_modules/os-name": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", "dev": true, + "license": "MIT", "dependencies": { "macos-release": "^2.5.0", "windows-release": "^4.0.0" @@ -10765,17 +11456,15 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "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==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -10788,8 +11477,7 @@ }, "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==", + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -10799,9 +11487,8 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "devOptional": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -10814,9 +11501,8 @@ }, "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, + "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -10827,26 +11513,23 @@ }, "node_modules/p-retry/node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "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==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pac-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", - "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -10864,18 +11547,16 @@ }, "node_modules/pac-proxy-agent/node_modules/@tootallnate/once": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -10887,9 +11568,8 @@ }, "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "4", @@ -10901,9 +11581,8 @@ }, "node_modules/pac-resolver": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", - "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", "dev": true, + "license": "MIT", "dependencies": { "degenerator": "^3.0.2", "ip": "^1.1.5", @@ -10915,15 +11594,13 @@ }, "node_modules/pac-resolver/node_modules/ip": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pacote": { "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", "devOptional": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^3.0.0", "@npmcli/installed-package-contents": "^1.0.7", @@ -10955,15 +11632,13 @@ } }, "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "version": "2.0.4", + "license": "(MIT AND Zlib)" }, "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, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -10973,9 +11648,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -10991,22 +11665,19 @@ }, "node_modules/parse-node-version": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/parse5": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "license": "MIT" }, "node_modules/parse5-html-rewriting-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "license": "MIT", "dependencies": { "parse5": "^6.0.1", "parse5-sax-parser": "^6.0.1" @@ -11014,26 +11685,23 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, + "license": "MIT", "dependencies": { "parse5": "^6.0.1" } }, "node_modules/parse5-sax-parser": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "license": "MIT", "dependencies": { "parse5": "^6.0.1" } }, "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, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -11044,61 +11712,53 @@ }, "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==", + "license": "MIT", "optional": 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==", + "license": "MIT", "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==", "devOptional": true, + "license": "MIT", "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==", "dev": true, + "license": "MIT", "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==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -11112,15 +11772,13 @@ }, "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -11130,9 +11788,8 @@ }, "node_modules/pidtree": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", - "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", "dev": true, + "license": "MIT", "bin": { "pidtree": "bin/pidtree.js" }, @@ -11142,18 +11799,16 @@ }, "node_modules/pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/piscina": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter-asyncresource": "^1.0.0", "hdr-histogram-js": "^2.0.1", @@ -11165,9 +11820,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -11177,25 +11831,21 @@ }, "node_modules/please-upgrade-node": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, + "license": "MIT", "dependencies": { "semver-compare": "^1.0.0" } }, "node_modules/pngjs": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/postcss": { "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", "dev": true, "funding": [ { @@ -11207,6 +11857,7 @@ "url": "https://tidelift.com/funding/github/npm/postcss" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -11218,9 +11869,8 @@ }, "node_modules/postcss-attribute-case-insensitive": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -11237,9 +11887,8 @@ }, "node_modules/postcss-clamp": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11252,9 +11901,8 @@ }, "node_modules/postcss-color-functional-notation": { "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11271,9 +11919,8 @@ }, "node_modules/postcss-color-hex-alpha": { "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11290,9 +11937,8 @@ }, "node_modules/postcss-color-rebeccapurple": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11309,9 +11955,8 @@ }, "node_modules/postcss-custom-media": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11328,9 +11973,8 @@ }, "node_modules/postcss-custom-properties": { "version": "12.1.9", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.9.tgz", - "integrity": "sha512-/E7PRvK8DAVljBbeWrcEQJPG72jaImxF3vvCNFwv9cC8CzigVoNIpeyfnJzphnN3Fd8/auBf5wvkw6W9MfmTyg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11347,9 +11991,8 @@ }, "node_modules/postcss-custom-selectors": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -11366,9 +12009,8 @@ }, "node_modules/postcss-dir-pseudo-class": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -11385,9 +12027,8 @@ }, "node_modules/postcss-double-position-gradients": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -11405,9 +12046,8 @@ }, "node_modules/postcss-env-function": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11420,9 +12060,8 @@ }, "node_modules/postcss-focus-visible": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -11435,9 +12074,8 @@ }, "node_modules/postcss-focus-within": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -11450,18 +12088,16 @@ }, "node_modules/postcss-font-variant": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-gap-properties": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -11475,9 +12111,8 @@ }, "node_modules/postcss-image-set-function": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11494,9 +12129,8 @@ }, "node_modules/postcss-import": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -11511,18 +12145,16 @@ }, "node_modules/postcss-initial": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.0.0" } }, "node_modules/postcss-lab-function": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -11540,9 +12172,8 @@ }, "node_modules/postcss-loader": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "dev": true, + "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -11562,9 +12193,8 @@ }, "node_modules/postcss-logical": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -11574,9 +12204,8 @@ }, "node_modules/postcss-media-minmax": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -11586,9 +12215,8 @@ }, "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, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -11598,9 +12226,8 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -11615,9 +12242,8 @@ }, "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, + "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -11630,9 +12256,8 @@ }, "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, + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -11645,9 +12270,8 @@ }, "node_modules/postcss-nesting": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -11665,8 +12289,6 @@ }, "node_modules/postcss-opacity-percentage": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", "dev": true, "funding": [ { @@ -11678,15 +12300,15 @@ "url": "https://liberapay.com/mrcgrtz" } ], + "license": "MIT", "engines": { "node": "^12 || ^14 || >=16" } }, "node_modules/postcss-overflow-shorthand": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11703,18 +12325,16 @@ }, "node_modules/postcss-page-break": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8" } }, "node_modules/postcss-place": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11731,9 +12351,8 @@ }, "node_modules/postcss-preset-env": { "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-cascade-layers": "^1.0.5", "@csstools/postcss-color-function": "^1.1.1", @@ -11798,9 +12417,8 @@ }, "node_modules/postcss-pseudo-class-any-link": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -11817,18 +12435,16 @@ }, "node_modules/postcss-replace-overflow-wrap": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" } }, "node_modules/postcss-selector-not": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -11845,9 +12461,8 @@ }, "node_modules/postcss-selector-parser": { "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11858,9 +12473,8 @@ }, "node_modules/postcss-url": { "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "dev": true, + "license": "MIT", "dependencies": { "make-dir": "~3.1.0", "mime": "~2.5.2", @@ -11876,9 +12490,8 @@ }, "node_modules/postcss-url/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11886,9 +12499,8 @@ }, "node_modules/postcss-url/node_modules/mime": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -11898,9 +12510,8 @@ }, "node_modules/postcss-url/node_modules/minimatch": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11910,14 +12521,11 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -11925,9 +12533,8 @@ }, "node_modules/prettier": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -11940,9 +12547,8 @@ }, "node_modules/pretty-bytes": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -11952,38 +12558,33 @@ }, "node_modules/proc-log": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "devOptional": true, + "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "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==", + "license": "MIT", "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 + "dev": true, + "license": "MIT" }, "node_modules/promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "devOptional": true, + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -11994,9 +12595,8 @@ }, "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, + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -12007,18 +12607,16 @@ }, "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, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", - "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.0", "debug": "4", @@ -12035,18 +12633,16 @@ }, "node_modules/proxy-agent/node_modules/@tootallnate/once": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/proxy-agent/node_modules/http-proxy-agent": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -12058,18 +12654,16 @@ }, "node_modules/proxy-agent/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==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/proxy-agent/node_modules/socks-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "4", @@ -12081,28 +12675,24 @@ }, "node_modules/proxy-agent/node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/prr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -12110,16 +12700,14 @@ }, "node_modules/punycode": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qrcode": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", - "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==", + "license": "MIT", "dependencies": { "dijkstrajs": "^1.0.1", "encode-utf8": "^1.0.3", @@ -12135,8 +12723,7 @@ }, "node_modules/qrcode/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==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12149,8 +12736,7 @@ }, "node_modules/qrcode/node_modules/cliui": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -12159,8 +12745,7 @@ }, "node_modules/qrcode/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==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12170,13 +12755,11 @@ }, "node_modules/qrcode/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==" + "license": "MIT" }, "node_modules/qrcode/node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12188,13 +12771,11 @@ }, "node_modules/qrcode/node_modules/y18n": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "license": "ISC" }, "node_modules/qrcode/node_modules/yargs": { "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -12214,8 +12795,7 @@ }, "node_modules/qrcode/node_modules/yargs-parser": { "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -12226,9 +12806,8 @@ }, "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, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -12241,8 +12820,6 @@ }, "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==", "devOptional": true, "funding": [ { @@ -12257,31 +12834,29 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, + "license": "MIT", "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, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -12294,9 +12869,8 @@ }, "node_modules/raw-loader": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -12314,9 +12888,8 @@ }, "node_modules/raw-loader/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12330,24 +12903,21 @@ }, "node_modules/raw-loader/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==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/raw-loader/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/raw-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -12359,9 +12929,8 @@ }, "node_modules/raw-loader/node_modules/schema-utils": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -12377,18 +12946,16 @@ }, "node_modules/read-cache": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^2.3.0" } }, "node_modules/read-package-json": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", "devOptional": true, + "license": "ISC", "dependencies": { "glob": "^8.0.1", "json-parse-even-better-errors": "^2.3.1", @@ -12401,9 +12968,8 @@ }, "node_modules/read-package-json-fast": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", "devOptional": true, + "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^2.3.0", "npm-normalize-package-bin": "^1.0.1" @@ -12414,17 +12980,15 @@ }, "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "devOptional": true, + "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/readable-stream": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12436,9 +13000,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "devOptional": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -12448,21 +13011,18 @@ }, "node_modules/reflect-metadata": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -12472,30 +13032,26 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regex-parser": { "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regexpu-core": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", - "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", @@ -12510,15 +13066,13 @@ }, "node_modules/regjsgen": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regjsparser": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, @@ -12528,8 +13082,6 @@ }, "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==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -12537,36 +13089,31 @@ }, "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==", + "license": "MIT", "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==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "license": "ISC" }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "devOptional": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -12581,18 +13128,16 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-url-loader": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, + "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -12606,9 +13151,8 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -12620,17 +13164,15 @@ }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/restore-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -12641,18 +13183,16 @@ }, "node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "devOptional": true, + "license": "MIT", "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==", "devOptional": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -12660,15 +13200,13 @@ }, "node_modules/rfdc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "devOptional": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -12681,9 +13219,8 @@ }, "node_modules/rimraf/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==", "devOptional": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -12691,9 +13228,8 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "devOptional": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12711,9 +13247,8 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "devOptional": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12723,8 +13258,7 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -12732,9 +13266,8 @@ }, "node_modules/rollup": { "version": "2.79.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.0.tgz", - "integrity": "sha512-x4KsrCgwQ7ZJPcFA/SUu6QVcYlO7uRLfLAy0DSA4NS2eG8japdbpM50ToH7z4iObodRYOJ0soneF0iaQRJ6zhA==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -12747,9 +13280,8 @@ }, "node_modules/rollup-plugin-sourcemaps": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", - "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.0.9", "source-map-resolve": "^0.6.0" @@ -12769,26 +13301,22 @@ }, "node_modules/rsvp": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", "dev": true, + "license": "MIT", "engines": { "node": "0.12.* || 4.* || 6.* || >= 7.*" } }, "node_modules/run-async": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "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==", "devOptional": true, "funding": [ { @@ -12804,34 +13332,32 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dependencies": { "tslib": "^2.1.0" } }, "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==" + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/sass": { "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -12846,9 +13372,8 @@ }, "node_modules/sass-loader": { "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", "dev": true, + "license": "MIT", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -12884,15 +13409,13 @@ }, "node_modules/sax": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/schema-utils": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -12908,9 +13431,8 @@ }, "node_modules/schema-utils/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12924,30 +13446,26 @@ }, "node_modules/schema-utils/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==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/schema-utils/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==", - "dev": true + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/selfsigned": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dev": true, + "license": "MIT", "dependencies": { "node-forge": "^1" }, @@ -12957,9 +13475,8 @@ }, "node_modules/semver": { "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "devOptional": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -12972,15 +13489,13 @@ }, "node_modules/semver-compare": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/semver-regex": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -12990,9 +13505,8 @@ }, "node_modules/semver/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==", "devOptional": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -13002,9 +13516,8 @@ }, "node_modules/send": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -13026,48 +13539,42 @@ }, "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, + "license": "MIT", "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 + "dev": true, + "license": "MIT" }, "node_modules/send/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, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "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 + "dev": true, + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, + "license": "BSD-3-Clause", "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, + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -13083,18 +13590,16 @@ }, "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, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "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, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -13107,36 +13612,31 @@ }, "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 + "dev": true, + "license": "ISC" }, "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 + "dev": true, + "license": "MIT" }, "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 + "dev": true, + "license": "ISC" }, "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, + "license": "MIT", "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, + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -13149,19 +13649,16 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "license": "ISC" }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "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==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -13172,9 +13669,8 @@ }, "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, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -13184,9 +13680,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==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -13196,18 +13691,16 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "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==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -13219,14 +13712,12 @@ }, "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==" + "license": "ISC" }, "node_modules/sirv": { "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", "dev": true, + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", @@ -13238,9 +13729,8 @@ }, "node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -13250,9 +13740,8 @@ }, "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, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -13267,9 +13756,8 @@ }, "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, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13282,9 +13770,8 @@ }, "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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -13294,15 +13781,13 @@ }, "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 + "dev": true, + "license": "MIT" }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -13310,9 +13795,8 @@ }, "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, + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -13321,9 +13805,8 @@ }, "node_modules/socks": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", "devOptional": true, + "license": "MIT", "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -13335,9 +13818,8 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "devOptional": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -13349,26 +13831,23 @@ }, "node_modules/source-map": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-loader": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", "dev": true, + "license": "MIT", "dependencies": { "abab": "^2.0.6", "iconv-lite": "^0.6.3", @@ -13387,9 +13866,8 @@ }, "node_modules/source-map-loader/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -13399,10 +13877,8 @@ }, "node_modules/source-map-resolve": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, + "license": "MIT", "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0" @@ -13410,9 +13886,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -13420,23 +13895,20 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/sourcemap-codec": { "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "license": "MIT" }, "node_modules/spdx-correct": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -13444,15 +13916,13 @@ }, "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==", - "devOptional": true + "devOptional": true, + "license": "CC-BY-3.0" }, "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==", "devOptional": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -13460,15 +13930,13 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "devOptional": true + "devOptional": true, + "license": "CC0-1.0" }, "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, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -13482,9 +13950,8 @@ }, "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, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -13496,35 +13963,30 @@ }, "node_modules/split2": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, + "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/ssh-config": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", - "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ssr-window": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", - "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" + "license": "MIT" }, "node_modules/ssri": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "devOptional": true, + "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -13534,18 +13996,16 @@ }, "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, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/stream-combiner2": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, + "license": "MIT", "dependencies": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" @@ -13553,9 +14013,8 @@ }, "node_modules/stream-combiner2/node_modules/readable-stream": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13568,25 +14027,21 @@ }, "node_modules/stream-combiner2/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, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "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==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string_decoder/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", @@ -13600,21 +14055,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/string-argv": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.19" } }, "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==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -13626,8 +14080,7 @@ }, "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==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13637,18 +14090,16 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/stylus": { "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", "dev": true, + "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.0.1", "debug": "^4.3.2", @@ -13668,9 +14119,8 @@ }, "node_modules/stylus-loader": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", "klona": "^2.0.5", @@ -13690,9 +14140,8 @@ }, "node_modules/stylus/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -13700,9 +14149,8 @@ }, "node_modules/stylus/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13720,9 +14168,8 @@ }, "node_modules/stylus/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -13732,16 +14179,13 @@ }, "node_modules/stylus/node_modules/sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/superagent": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", - "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", "dev": true, + "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", @@ -13761,9 +14205,8 @@ }, "node_modules/superagent-proxy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", - "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.2", "proxy-agent": "^5.0.0" @@ -13777,9 +14220,8 @@ }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -13789,9 +14231,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -13801,9 +14242,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==", "devOptional": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13813,8 +14253,6 @@ }, "node_modules/swiper": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.2.tgz", - "integrity": "sha512-nMD/RHVYxJxrLqjWQX2n0B94ANwpnuUv/3PUDT8Aaf+mSteFvZGFng4ypAYq70zW4svryyV+8TRlbRZ+6cgv9A==", "funding": [ { "type": "patreon", @@ -13826,6 +14264,7 @@ } ], "hasInstallScript": true, + "license": "MIT", "dependencies": { "dom7": "^4.0.4", "ssr-window": "^4.0.2" @@ -13836,27 +14275,24 @@ }, "node_modules/symbol-observable": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "devOptional": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -13871,9 +14307,8 @@ }, "node_modules/terser": { "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -13889,9 +14324,8 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", @@ -13923,9 +14357,8 @@ }, "node_modules/terser-webpack-plugin/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13939,24 +14372,21 @@ }, "node_modules/terser-webpack-plugin/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==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/terser-webpack-plugin/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -13972,15 +14402,13 @@ }, "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==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -13992,9 +14420,8 @@ }, "node_modules/test-exclude/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14002,9 +14429,8 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14022,9 +14448,8 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14034,32 +14459,27 @@ }, "node_modules/text-mask-core": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/text-mask-core/-/text-mask-core-5.1.2.tgz", - "integrity": "sha512-VfkCMdmRRZqXgQZFlDMiavm3hzsMzBM23CxHZsaeAYg66ZhXCNJWrFmnJwNy8KF9f74YvAUAuQenxsMCfuvhUw==" + "license": "Unlicense" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "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 + "dev": true, + "license": "MIT" }, "node_modules/tmp": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "devOptional": true, + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -14069,18 +14489,16 @@ }, "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==", "dev": true, + "license": "MIT", "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==", "devOptional": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -14090,40 +14508,35 @@ }, "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, + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/totalist": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, + "license": "MIT", "bin": { "tree-kill": "cli.js" } }, "node_modules/ts-matches": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.2.1.tgz", - "integrity": "sha512-QSG3V7b3NKIBwBzR8wJcx2VRn0maj5s1Gkj8pdivYtD9us8we7kforlNsREmXobzvPYHE+8poT5gjmDgwQtJ9g==" + "version": "v5.2.1", + "license": "MIT" }, "node_modules/ts-morph": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-10.0.2.tgz", - "integrity": "sha512-TVuIfEqtr9dW25K3Jajqpqx7t/zLRFxKu2rXQZSDjTm4MO4lfmuj1hn8WEryjeDDBFcNOCi+yOmYUYR4HucrAg==", + "license": "MIT", "optional": true, "dependencies": { "@ts-morph/common": "~0.9.0", @@ -14132,9 +14545,8 @@ }, "node_modules/ts-node": { "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -14175,15 +14587,12 @@ }, "node_modules/tslib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "license": "0BSD" }, "node_modules/tslint": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", "dev": true, + "license": "Apache-2.0", "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", @@ -14211,18 +14620,16 @@ }, "node_modules/tslint/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/tslint/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==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14230,24 +14637,21 @@ }, "node_modules/tslint/node_modules/builtin-modules": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/tslint/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tslint/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14265,9 +14669,8 @@ }, "node_modules/tslint/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==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -14278,9 +14681,8 @@ }, "node_modules/tslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14290,9 +14692,8 @@ }, "node_modules/tslint/node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -14302,24 +14703,21 @@ }, "node_modules/tslint/node_modules/semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/tslint/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/tsutils": { "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -14329,15 +14727,13 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/type-check": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -14347,9 +14743,8 @@ }, "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==", "devOptional": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -14359,9 +14754,8 @@ }, "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, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -14372,24 +14766,21 @@ }, "node_modules/typed-assert": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "version": "4.8.4", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14400,18 +14791,16 @@ }, "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==", "dev": true, + "license": "MIT", "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==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -14422,71 +14811,62 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true, + "license": "MIT", "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unique-filename": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "devOptional": true, + "license": "ISC", "dependencies": { "unique-slug": "^2.0.0" } }, "node_modules/unique-slug": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "devOptional": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" } }, "node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/untildify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/update-browserslist-db": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", "dev": true, "funding": [ { @@ -14498,6 +14878,7 @@ "url": "https://tidelift.com/funding/github/npm/browserslist" } ], + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -14511,45 +14892,39 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "license": "MIT" }, "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, + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -14557,9 +14932,8 @@ }, "node_modules/validate-npm-package-name": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "devOptional": true, + "license": "ISC", "dependencies": { "builtins": "^5.0.0" }, @@ -14569,18 +14943,16 @@ }, "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, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vm2": { "version": "3.9.11", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.11.tgz", - "integrity": "sha512-PFG8iJRSjvvBdisowQ7iVF580DXb1uCIiGaXgm7tynMR1uTBlv7UJlB1zdv5KJ+Tmq1f0Upnj3fayoEOPpCBKg==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.7.0", "acorn-walk": "^8.2.0" @@ -14594,9 +14966,8 @@ }, "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==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -14607,26 +14978,23 @@ }, "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, + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/webpack": { "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -14671,9 +15039,8 @@ }, "node_modules/webpack-bundle-analyzer": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", @@ -14695,9 +15062,8 @@ }, "node_modules/webpack-bundle-analyzer/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, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -14710,9 +15076,8 @@ }, "node_modules/webpack-bundle-analyzer/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, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14726,9 +15091,8 @@ }, "node_modules/webpack-bundle-analyzer/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, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -14738,33 +15102,29 @@ }, "node_modules/webpack-bundle-analyzer/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 + "dev": true, + "license": "MIT" }, "node_modules/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/webpack-bundle-analyzer/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, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/webpack-bundle-analyzer/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, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -14774,9 +15134,8 @@ }, "node_modules/webpack-bundle-analyzer/node_modules/ws": { "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -14795,9 +15154,8 @@ }, "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, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -14818,9 +15176,8 @@ }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -14837,9 +15194,8 @@ }, "node_modules/webpack-dev-server": { "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -14892,9 +15248,8 @@ }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -14911,9 +15266,8 @@ }, "node_modules/webpack-merge": { "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" @@ -14924,18 +15278,16 @@ }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, + "license": "MIT", "dependencies": { "typed-assert": "^1.0.8" }, @@ -14954,9 +15306,8 @@ }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14970,24 +15321,21 @@ }, "node_modules/webpack/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==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/webpack/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==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -15003,9 +15351,8 @@ }, "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, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -15017,18 +15364,16 @@ }, "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, + "license": "Apache-2.0", "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==", "devOptional": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -15041,38 +15386,33 @@ }, "node_modules/which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + "license": "ISC" }, "node_modules/which-pm-runs": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/wide-align": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "devOptional": true, + "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wildcard": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/windows-release": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^4.0.2" }, @@ -15085,9 +15425,8 @@ }, "node_modules/windows-release/node_modules/execa": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -15108,9 +15447,8 @@ }, "node_modules/windows-release/node_modules/get-stream": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -15123,27 +15461,24 @@ }, "node_modules/windows-release/node_modules/human-signals": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8.12.0" } }, "node_modules/word-wrap": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "devOptional": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15158,9 +15493,8 @@ }, "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==", "devOptional": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -15173,9 +15507,8 @@ }, "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==", "devOptional": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -15185,21 +15518,18 @@ }, "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==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "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==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -15209,9 +15539,8 @@ }, "node_modules/ws": { "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -15230,51 +15559,42 @@ }, "node_modules/xregexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", "dev": true, - "engines": { - "node": "*" - } + "license": "MIT" }, "node_modules/xxhashjs": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "dev": true, + "license": "MIT", "dependencies": { "cuint": "^0.2.2" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "devOptional": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -15290,27 +15610,24 @@ }, "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==", "devOptional": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -15320,11091 +15637,10 @@ }, "node_modules/zone.js": { "version": "0.11.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", - "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" } } - }, - "dependencies": { - "@adobe/css-tools": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", - "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@angular-devkit/architect": { - "version": "0.1402.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.3.tgz", - "integrity": "sha512-vU5j0WhSYxux5RzhuZ3VY3B4XbRJuEtVqSoW5j9ew3Oc78tkR6RNXgT97PPr0GfRA1fOEhVoReR7NbsKU3uIkQ==", - "devOptional": true, - "requires": { - "@angular-devkit/core": "14.2.3", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "devOptional": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "devOptional": true - } - } - }, - "@angular-devkit/build-angular": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.3.tgz", - "integrity": "sha512-Gun2WBM9oXqgOmpwan0OC5OEW2RY6Sd6nrOGzdC5HkvvwxLBV5uycrpYVJiQSPLuQjDLp9S2QTjA2yLtVABYCA==", - "dev": true, - "requires": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1402.3", - "@angular-devkit/build-webpack": "0.1402.3", - "@angular-devkit/core": "14.2.3", - "@babel/core": "7.18.10", - "@babel/generator": "7.18.12", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/plugin-proposal-async-generator-functions": "7.18.10", - "@babel/plugin-transform-async-to-generator": "7.18.6", - "@babel/plugin-transform-runtime": "7.18.10", - "@babel/preset-env": "7.18.10", - "@babel/runtime": "7.18.9", - "@babel/template": "7.18.10", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "14.2.3", - "ansi-colors": "4.1.3", - "babel-loader": "8.2.5", - "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.9.1", - "cacache": "16.1.2", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.1", - "esbuild": "0.15.5", - "esbuild-wasm": "0.15.5", - "glob": "8.0.3", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "karma-source-map-support": "1.4.0", - "less": "4.1.3", - "less-loader": "11.0.0", - "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.0", - "mini-css-extract-plugin": "2.6.1", - "minimatch": "5.1.0", - "open": "8.4.0", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.2.0", - "postcss": "8.4.16", - "postcss-import": "15.0.0", - "postcss-loader": "7.0.1", - "postcss-preset-env": "7.8.0", - "regenerator-runtime": "0.13.9", - "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.54.4", - "sass-loader": "13.0.2", - "semver": "7.3.7", - "source-map-loader": "4.0.0", - "source-map-support": "0.5.21", - "stylus": "0.59.0", - "stylus-loader": "7.0.0", - "terser": "5.14.2", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "tslib": "2.4.0", - "webpack": "5.74.0", - "webpack-dev-middleware": "5.3.3", - "webpack-dev-server": "4.11.0", - "webpack-merge": "5.8.0", - "webpack-subresource-integrity": "5.1.0" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - } - } - }, - "@angular-devkit/build-webpack": { - "version": "0.1402.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.3.tgz", - "integrity": "sha512-d7ZG7dZElJgtPbp2x2dzMv6usqqzz9CH+RtaGueuivIa/Cd061c3D0pi3XuUBvfaS0qENrlnysYhLkuTnUQGcQ==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1402.3", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@angular-devkit/core": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.3.tgz", - "integrity": "sha512-E8bnC6F0xNni4IIKAnIDBDkbi6cOePm4Q/Y9IrTk3wquGTfsiMlQpdnRA0nr+FTN/LT3N08O5dEw2Gd4ff4tGA==", - "devOptional": true, - "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "devOptional": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "devOptional": true - } - } - }, - "@angular-devkit/schematics": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.3.tgz", - "integrity": "sha512-98ldx+To7xW1BH/DqIToQwHVscPZhXnZP01SeoiUnFlJE5FnXx8Lv7qHAQtE96M+cfE5NR1NKBgfCH3S3rnmFA==", - "devOptional": true, - "requires": { - "@angular-devkit/core": "14.2.3", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "devOptional": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "devOptional": true - } - } - }, - "@angular/animations": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.2.tgz", - "integrity": "sha512-YPtwjfjGCtRlGIYyFK8JPq6kfR8Gz93kmkIF+fnUes42M5DAQvCccVRxi1OXU6dDLsFY9w7DvTl+HR/VocaFsg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/cli": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.3.tgz", - "integrity": "sha512-pFo/h3ImjebjKzdw6yWcaERSIzWsSu4eqH9qQ/dWD1ChkSph+krBw3+5Q+Kda5l3dLgl7mQXX6mC5u8IHTdvDg==", - "devOptional": true, - "requires": { - "@angular-devkit/architect": "0.1402.3", - "@angular-devkit/core": "14.2.3", - "@angular-devkit/schematics": "14.2.3", - "@schematics/angular": "14.2.3", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "debug": "4.3.4", - "ini": "3.0.0", - "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "npm-package-arg": "9.1.0", - "npm-pick-manifest": "7.0.1", - "open": "8.4.0", - "ora": "5.4.1", - "pacote": "13.6.2", - "resolve": "1.22.1", - "semver": "7.3.7", - "symbol-observable": "4.0.0", - "uuid": "8.3.2", - "yargs": "17.5.1" - } - }, - "@angular/common": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.2.tgz", - "integrity": "sha512-9h8MwFLvIJ5kB5L03cd3Cyl4ySKVzL/E/YYugfLvcAzYZ8Rief63gJnkcKNjoS1A5DTxHhOBQL7pLZpj+YxDOw==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/compiler": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.2.tgz", - "integrity": "sha512-r6673fINahrESOk1lJgXFDO3cH3gTDJJrj1++yYfrgRSqGMzASECy3XTevCjIvw9SycIkU/P+NiE/W/WAlP5vg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/compiler-cli": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.2.tgz", - "integrity": "sha512-r3vOBUqInHwahloz4mmSrXk22q/4WGNoRR0hxR71tUhLiowYkAaWe72TdPYrDt0SYgZcffAomK7iQHrpJiwLuQ==", - "dev": true, - "requires": { - "@babel/core": "^7.17.2", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.26.0", - "reflect-metadata": "^0.1.2", - "semver": "^7.0.0", - "sourcemap-codec": "^1.4.8", - "tslib": "^2.3.0", - "yargs": "^17.2.1" - } - }, - "@angular/core": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.2.tgz", - "integrity": "sha512-kG30b4RqjgWvaH9y4g95JRCzoROV+9/xgFH4hSRejFa/IcapMfvCmONJtJzwTjdsEUQAbiFohF/z9bx3QA/Yvw==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/forms": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.2.tgz", - "integrity": "sha512-lq6PpLMNfs0KcIhkQrUVfKuP4hZSeUQyKOErvoLrPhDiakvOWYoQZKh6XHsbQRcuhWKHy6IITldz6sg8pWVrTw==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/language-service": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.2.tgz", - "integrity": "sha512-dLPClkbqYUORy2RmbqqkKYAE6D629wkk9bUJcgIQSKeRP+tQKDAlfUHn931T4WHunJlIdLLKx2McQaVmTrhnRw==", - "dev": true - }, - "@angular/platform-browser": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.2.tgz", - "integrity": "sha512-1NrtOIvevoDDT6DU+Fsm5TsNN/XJhIV/UhfInmU/rz97RERl8etcOQRsxWnjGwZjk9rjt+0lBbW5oVDFKOJa+w==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/platform-browser-dynamic": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.2.tgz", - "integrity": "sha512-fehhiOwC4mn4sprjSiuGc0uITToiiKJJdtUNDsJyOJinKuy3GBwHpGckiEx4E85Z/PkPCMb8lYRJb/IciUV9+A==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/pwa": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@angular/pwa/-/pwa-14.1.0.tgz", - "integrity": "sha512-T+uON9aWEeKoIZmk3ZyTK7TWWj9sKC1qNh+xg8LCEvPOpMNE6VTi2eipMjST6uQhrDazYSXBMO9o9iiVzBkYaw==", - "requires": { - "@angular-devkit/schematics": "14.1.0", - "@schematics/angular": "14.1.0", - "parse5-html-rewriting-stream": "6.0.1" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.1.0.tgz", - "integrity": "sha512-Y2d/+nFmjjY4eatc3cwdDDAnpnhG3KTX2OVW7dXSUxW3eY5e3vdMlVUbFiKwvwAshlrJy85Y6RMvZSBN4VrpnA==", - "requires": { - "ajv": "8.11.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", - "source-map": "0.7.4" - } - }, - "@angular-devkit/schematics": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.1.0.tgz", - "integrity": "sha512-5QC01k9eznuQSiqxijKhVkAEmA8sioYuLhBzyffaPszSySH8kPMNxhAc8zJhBTNLumbS6iDaGkSqTQl5Kv9fOw==", - "requires": { - "@angular-devkit/core": "14.1.0", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", - "ora": "5.4.1", - "rxjs": "6.6.7" - } - }, - "@schematics/angular": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.1.0.tgz", - "integrity": "sha512-lhqNZzA+iT3XwlwRU757mhYmd5WE9XB2OKFhosvvszou2zuNUJMDPR9P01ZVNCOa2fScOeCMg2q3ZDgGTBl96Q==", - "requires": { - "@angular-devkit/core": "14.1.0", - "@angular-devkit/schematics": "14.1.0", - "jsonc-parser": "3.1.0" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@angular/router": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.2.tgz", - "integrity": "sha512-BRkXdAVK0rE/x6im91a/fdIcWhPILO6ZmwCVTEdvsRyI9arQSlXAnupPUeumdbSc6mG/FCXPcyJq/dU0Jl70Og==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/service-worker": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-14.2.2.tgz", - "integrity": "sha512-SOhpEAXAZWcQbI7UzVAmOhwFgLgEt9cpiYo3u7nF/7ZXgB9nphalYePRK4HWt3DKK+oTNuE9rUMRcvOhBOxsKg==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", - "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", - "dev": true - }, - "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", - "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.19.1", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - } - }, - "@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", - "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "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.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", - "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", - "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", - "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@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.18.6", - "@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-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", - "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.1", - "@babel/types": "^7.19.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", - "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", - "dev": true, - "requires": { - "@babel/types": "^7.19.0", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "requires": {} - }, - "@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 - }, - "@esbuild/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", - "dev": true, - "optional": true - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "devOptional": true - }, - "@ionic/angular": { - "version": "6.2.7", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-6.2.7.tgz", - "integrity": "sha512-BJWn3RaVfvnNJ1hNVhJ1flEaIcAzH8v5Wl9Pv02wMFV5o8T+lmJF3mXjUIZKL5FVg+PgQeg9ktAjLc8zSZgiXA==", - "requires": { - "@ionic/core": "^6.2.7", - "jsonc-parser": "^3.0.0", - "tslib": "^2.0.0" - } - }, - "@ionic/cli": { - "version": "6.20.1", - "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.20.1.tgz", - "integrity": "sha512-DjMfpjZkOsxlXR9IZ0Q3/cKJKArVQ61EZCOMb2ue/onk6kZNZFvro7o02Wm6K6d57v5zIL3/vfMMDqOLUYUsFQ==", - "dev": true, - "requires": { - "@ionic/cli-framework": "5.1.3", - "@ionic/cli-framework-output": "2.2.5", - "@ionic/cli-framework-prompts": "2.1.10", - "@ionic/utils-array": "2.1.5", - "@ionic/utils-fs": "3.1.6", - "@ionic/utils-network": "2.1.5", - "@ionic/utils-process": "2.1.10", - "@ionic/utils-stream": "3.1.5", - "@ionic/utils-subprocess": "2.1.11", - "@ionic/utils-terminal": "2.3.3", - "chalk": "^4.0.0", - "debug": "^4.0.0", - "diff": "^4.0.1", - "elementtree": "^0.1.7", - "leek": "0.0.24", - "lodash": "^4.17.5", - "open": "^7.0.4", - "os-name": "^4.0.0", - "semver": "^7.1.1", - "split2": "^3.0.0", - "ssh-config": "^1.1.1", - "stream-combiner2": "^1.1.1", - "superagent": "^5.2.1", - "superagent-proxy": "^3.0.0", - "tar": "^6.0.1", - "tslib": "^2.0.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@ionic/cli-framework": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-5.1.3.tgz", - "integrity": "sha512-T2KN/TurzNoAcc3iDt1KHU6GeEa7x9kXngMnu5xs+DzJv5HhBKjVOoo74b8rgVxdPx+dLOV8aLrorlyvsHR/tQ==", - "dev": true, - "requires": { - "@ionic/cli-framework-output": "2.2.5", - "@ionic/utils-array": "2.1.5", - "@ionic/utils-fs": "3.1.6", - "@ionic/utils-object": "2.1.5", - "@ionic/utils-process": "2.1.10", - "@ionic/utils-stream": "3.1.5", - "@ionic/utils-subprocess": "2.1.11", - "@ionic/utils-terminal": "2.3.3", - "chalk": "^4.0.0", - "debug": "^4.0.0", - "lodash": "^4.17.5", - "minimist": "^1.2.0", - "rimraf": "^3.0.0", - "tslib": "^2.0.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@ionic/cli-framework-output": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.5.tgz", - "integrity": "sha512-YeDLTnTaE6V4IDUxT8GDIep0GuRIFaR7YZDLANMuuWJZDmnTku6DP+MmQoltBeLmVvz1BAAZgk41xzxdq6H2FQ==", - "dev": true, - "requires": { - "@ionic/utils-terminal": "2.3.3", - "debug": "^4.0.0", - "tslib": "^2.0.1" - } - }, - "@ionic/cli-framework-prompts": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.10.tgz", - "integrity": "sha512-h8HbA0teR0vWtGKB3ahzRbDq4yYaxfukgbOqhu9CAEJHosoFlBmDB8PbPnGFYxUg2J1MuCqeiN2ftJQYV/BO1w==", - "dev": true, - "requires": { - "@ionic/utils-terminal": "2.3.3", - "debug": "^4.0.0", - "inquirer": "^7.0.0", - "tslib": "^2.0.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@ionic/core": { - "version": "6.2.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-6.2.7.tgz", - "integrity": "sha512-pQWcIqr5zfCX5De/MQ9kFs+nhaPCr8HIh5QjmydxvmlLv6WU4vlny/Mg0y1+JwLE0qxPD0T9sMykawWH9e3y5Q==", - "requires": { - "@stencil/core": "^2.17.4", - "ionicons": "^6.0.3", - "tslib": "^2.1.0" - } - }, - "@ionic/utils-array": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", - "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", - "dev": true, - "requires": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - } - }, - "@ionic/utils-fs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.6.tgz", - "integrity": "sha512-eikrNkK89CfGPmexjTfSWl4EYqsPSBh0Ka7by4F0PLc1hJZYtJxUZV3X4r5ecA8ikjicUmcbU7zJmAjmqutG/w==", - "dev": true, - "requires": { - "@types/fs-extra": "^8.0.0", - "debug": "^4.0.0", - "fs-extra": "^9.0.0", - "tslib": "^2.0.1" - } - }, - "@ionic/utils-network": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-network/-/utils-network-2.1.5.tgz", - "integrity": "sha512-HUQ1Ec4Mh2MXzzKdbbbDS6xYKwpFJ2XRY7SYXbaZT8+jiNahfHbsOfe62/p8bk41Yil7E9EagzGC2JvIFJh01w==", - "dev": true, - "requires": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - } - }, - "@ionic/utils-object": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", - "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", - "dev": true, - "requires": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - } - }, - "@ionic/utils-process": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.10.tgz", - "integrity": "sha512-mZ7JEowcuGQK+SKsJXi0liYTcXd2bNMR3nE0CyTROpMECUpJeAvvaBaPGZf5ERQUPeWBVuwqAqjUmIdxhz5bxw==", - "dev": true, - "requires": { - "@ionic/utils-object": "2.1.5", - "@ionic/utils-terminal": "2.3.3", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "tslib": "^2.0.1" - } - }, - "@ionic/utils-stream": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", - "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", - "dev": true, - "requires": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - } - }, - "@ionic/utils-subprocess": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.11.tgz", - "integrity": "sha512-6zCDixNmZCbMCy5np8klSxOZF85kuDyzZSTTQKQP90ZtYNCcPYmuFSzaqDwApJT4r5L3MY3JrqK1gLkc6xiUPw==", - "dev": true, - "requires": { - "@ionic/utils-array": "2.1.5", - "@ionic/utils-fs": "3.1.6", - "@ionic/utils-process": "2.1.10", - "@ionic/utils-stream": "3.1.5", - "@ionic/utils-terminal": "2.3.3", - "cross-spawn": "^7.0.3", - "debug": "^4.0.0", - "tslib": "^2.0.1" - } - }, - "@ionic/utils-terminal": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.3.tgz", - "integrity": "sha512-RnuSfNZ5fLEyX3R5mtcMY97cGD1A0NVBbarsSQ6yMMfRJ5YHU7hHVyUfvZeClbqkBC/pAqI/rYJuXKCT9YeMCQ==", - "dev": true, - "requires": { - "@types/slice-ansi": "^4.0.0", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "@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==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "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==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, - "@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==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@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==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@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 - }, - "@materia-ui/ngx-monaco-editor": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@materia-ui/ngx-monaco-editor/-/ngx-monaco-editor-6.0.0.tgz", - "integrity": "sha512-gTqNQjOGznZxOC0NlmKdKSGCJuTts8YmK4dsTQAGc5IgIV7cZdQWiW6AL742h0ruED6q0cAunEYjXT6jzHBoIQ==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@ng-web-apis/common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/common/-/common-2.1.0.tgz", - "integrity": "sha512-6DLtrsk59z9YwfR8Pm1DiExXpxvMk/RVry/mfsAKkyRmgCGICgDdyQ+eWMVhrOIyUAtt9V+DRvHUeC6iYaHKNQ==", - "requires": { - "tslib": "^2.2.0" - } - }, - "@ng-web-apis/intersection-observer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/intersection-observer/-/intersection-observer-3.0.0.tgz", - "integrity": "sha512-Y3ts9WgXG/A6atyMlFOoP8ZNczUNxUGHSV4ii4xCepwcKW2gN/kkimsP4oPtb7UsTWzN1tF1n0bgD2civraZiA==", - "requires": { - "tslib": "^2.2.0" - } - }, - "@ng-web-apis/mutation-observer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/mutation-observer/-/mutation-observer-2.0.0.tgz", - "integrity": "sha512-f51Cu2DloNze1HaTWdUbtYFnt9VXhzpEnHDd9KFdiKOUNfEDx7wrSXIEQqv810hrq7F2jcIAERCdiqV6ItH7Pg==", - "requires": { - "tslib": "^2.2.0" - } - }, - "@ng-web-apis/resize-observer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ng-web-apis/resize-observer/-/resize-observer-2.0.0.tgz", - "integrity": "sha512-umuXJepTYBCI3ZcW9873fozO0qt1PeHLBNM+wXA+7Wphy35+RQcPNmkwfgkKqWceIjlYAvyuPTNWa5TM1OEeqg==", - "requires": { - "tslib": "^2.2.0" - } - }, - "@ngtools/webpack": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.3.tgz", - "integrity": "sha512-/9bOlmpx7a5P8QhjmggxEJ6LX5qvfkBZhxM8Orjr6ZjJcmAfm+3wiUDzU3EM+5M0YV3y3+dvQpn6Jrwy9y4rfQ==", - "dev": true, - "requires": {} - }, - "@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==", - "devOptional": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@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==", - "devOptional": true - }, - "@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==", - "devOptional": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "devOptional": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", - "devOptional": true, - "requires": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "devOptional": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "devOptional": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", - "devOptional": true - }, - "@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", - "devOptional": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", - "devOptional": true, - "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - } - }, - "@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, - "@rollup/plugin-json": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", - "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8" - } - }, - "@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - } - } - }, - "@schematics/angular": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.3.tgz", - "integrity": "sha512-lHWeeWrhpyMwJRTK4RpFVptWZo5kTdI+bOOd+lZBTjOAs+PM8r9VXHzB6qhE6P2e3HsceXM59PonvekTUdOJtQ==", - "devOptional": true, - "requires": { - "@angular-devkit/core": "14.2.3", - "@angular-devkit/schematics": "14.2.3", - "jsonc-parser": "3.1.0" - } - }, - "@start9labs/argon2": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@start9labs/argon2/-/argon2-0.1.0.tgz", - "integrity": "sha512-Ng9Ibuj0p2drQRW013AkUz6TqWysXw/9OyoEoXQZL7kfac0LrxWIDj+xvg+orqQMxcvClWgzeQY/c+IgJtcevA==" - }, - "@start9labs/emver": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@start9labs/emver/-/emver-0.1.5.tgz", - "integrity": "sha512-1dhiG03VkfEwSLx/JPKVms6srAbYFQgwfSGhwpUKMDliMXuAHGVaueStmqzVxn3JpH/HEVz0QW8w/PXHqjdiIg==" - }, - "@stencil/core": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.18.0.tgz", - "integrity": "sha512-NLEY8Jq59smyiivBAxHKipsp9YkkW/K/Vm90zAyXQqukb12i2SFucWHJ1Ik7ropVlhmMVvigyxXgRfQ9quIqtg==" - }, - "@taiga-ui/addon-charts": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/addon-charts/-/addon-charts-3.20.0.tgz", - "integrity": "sha512-EH/mhwCv7Dq/JaEmGgJnDFr2ZYCzlTJWMS9BHwEZXaLqKVQWiSeXOhB/5sGhuAXiitZb2XvSumlVslAECpe/Kg==", - "requires": { - "tslib": ">=2.0.0" - } - }, - "@taiga-ui/cdk": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/cdk/-/cdk-3.20.0.tgz", - "integrity": "sha512-fXX8pV/MELxfoEjStcTe0Eh+1f3vp/jXrHU5JR7p1yA3KtYw+a8WBPLa2+BNAYYSxhpfLsplCb4K2XcVEdUiew==", - "requires": { - "@ng-web-apis/common": "2.1.0", - "@ng-web-apis/mutation-observer": "2.0.0", - "@ng-web-apis/resize-observer": "2.0.0", - "@tinkoff/ng-event-plugins": "3.1.0", - "@tinkoff/ng-polymorpheus": "4.0.10", - "ng-morph": "2.1.0", - "parse5": "6.0.1", - "tslib": "2.5.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - } - } - }, - "@taiga-ui/core": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/core/-/core-3.20.0.tgz", - "integrity": "sha512-TzhU2Nos80tpvcM9DiQ4xcO/RvDjUwOvbQyeu5RTk7mPLsEVoRHaFagO4KXOFhr7D5BFMQimqQaQLFI3Y5c8Xw==", - "requires": { - "@taiga-ui/i18n": "^3.20.0", - "tslib": ">=2.0.0" - } - }, - "@taiga-ui/i18n": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/i18n/-/i18n-3.20.0.tgz", - "integrity": "sha512-R0cKNSnvcAXZgfF4j7MPqkja1pQD87XudXG5T3o9qore0ysKCqEW/8A036hBXjLzkHUaMbOutIjy26RZLcoDbQ==", - "requires": { - "tslib": ">=2.0.0" - } - }, - "@taiga-ui/icons": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/icons/-/icons-3.20.0.tgz", - "integrity": "sha512-N4lwb/XLUogHY7goTNwdfz03gsYczjP7Qnq+IbuqI1iwuH+e3rUWuOCZBjFZ5m1aAB3d/xnKos8bBf84wixJWQ==", - "requires": { - "tslib": "^2.2.0" - } - }, - "@taiga-ui/kit": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@taiga-ui/kit/-/kit-3.20.0.tgz", - "integrity": "sha512-fo2FDlTWaynaU9fbyLX4uQdKVsFmIRB+K4zHBwnyzrr2JgNqPQfRUXPZNyGA0cOf+r5Sz7Hs5K5i8TGhGKoFZQ==", - "requires": { - "@ng-web-apis/intersection-observer": "3.0.0", - "text-mask-core": "5.1.2", - "tslib": ">=2.0.0" - } - }, - "@tinkoff/ng-event-plugins": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@tinkoff/ng-event-plugins/-/ng-event-plugins-3.1.0.tgz", - "integrity": "sha512-HqLBes/3MV469L1S08uBqmPUIwihx43py+8Lee1Me9jMFM1ZMuAC3NcS/njUFI1OzXU2kIPyUDEw2jmVbg8mWQ==", - "requires": { - "tslib": "^2.2.0" - } - }, - "@tinkoff/ng-polymorpheus": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@tinkoff/ng-polymorpheus/-/ng-polymorpheus-4.0.10.tgz", - "integrity": "sha512-BxHSwj9CertJ3qiamZ52NTpsKn81EZHjDwiph8mXiEeKXpuPaDn6e5wmTWdW8mYexLPtBsxmCRvZ9vapw4F1kA==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "devOptional": true - }, - "@ts-morph/common": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.9.2.tgz", - "integrity": "sha512-IPyg+c3Am0EBoa63W0f/AKeLrJhvzMzQ4BIvD1baxLopmiHOj1HFTXYxC6e8iTZ+UYtN+/WFM9UyGRnoA20b8g==", - "optional": true, - "requires": { - "fast-glob": "^3.2.5", - "minimatch": "^3.0.4", - "mkdirp": "^1.0.4", - "path-browserify": "^1.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/dompurify": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.3.4.tgz", - "integrity": "sha512-EXzDatIb5EspL2eb/xPGmaC8pePcTHrkDCONjeisusLFrVfl38Pjea/R0YJGu3k9ZQadSvMqW0WXPI2hEo2Ajg==", - "dev": true, - "requires": { - "@types/trusted-types": "*" - } - }, - "@types/eslint": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/fs-extra": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/marked": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", - "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", - "dev": true - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "optional": true - }, - "@types/mustache": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.2.1.tgz", - "integrity": "sha512-gFAlWL9Ik21nJioqjlGCnNYbf9zHi0sVbaZ/1hQEBcCEuxfLJDvz4bVJSV6v6CUaoLOz0XEIoP7mSrhJ6o237w==", - "dev": true - }, - "@types/node": { - "version": "16.11.59", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.59.tgz", - "integrity": "sha512-6u+36Dj3aDzhfBVUf/mfmc92OEdzQ2kx2jcXGdigfl70E/neV21ZHE6UCz4MDzTRcVqGAM27fk+DLXvyDsn3Jw==", - "dev": true - }, - "@types/node-jose": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.10.tgz", - "integrity": "sha512-7L0ucJTugW4x/sYpQ+c5IudAwr0pFuxDVnZLpHKWpff7p1lVa3wTuNvnrzFBNeLojE+UY0cVCwNGXLxXsMIrzw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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 - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", - "dev": true - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", - "dev": true - }, - "@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@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==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "devOptional": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "devOptional": true - }, - "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, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "devOptional": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "devOptional": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "devOptional": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - } - }, - "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, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "angular-svg-round-progressbar": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/angular-svg-round-progressbar/-/angular-svg-round-progressbar-9.0.0.tgz", - "integrity": "sha512-q8d2AEG9u+GMAMrZY40NgejN5fHwR4iK+rRxtJ7NnMEvvuAMqt9UEtKe0SqVQHvZYE6W16L5J9yaO+TEtfRjpw==", - "requires": { - "tslib": "^2.3.0" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "devOptional": true - }, - "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==", - "devOptional": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "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 - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansi-to-html": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", - "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", - "requires": { - "entities": "^2.2.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "devOptional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "devOptional": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "devOptional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "optional": true - }, - "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 - }, - "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==", - "optional": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true - }, - "ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, - "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 - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.11", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.11.tgz", - "integrity": "sha512-5lHp6DgRodxlBLSkzHOTcufWFflH1ewfy2hvFQyjrblBFlP/0Yh4O/Wrg4ow8WRlN3AAUFFLAQwX8hTptzqVHg==", - "dev": true, - "requires": { - "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001399", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "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==", - "dev": true, - "requires": { - "@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" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" - }, - "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 - }, - "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 - }, - "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 - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, - "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dev": true, - "requires": { - "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.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "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 - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", - "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "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 - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "devOptional": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "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==", - "dev": true - }, - "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 - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "devOptional": true, - "requires": { - "semver": "^7.0.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", - "devOptional": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-lite": { - "version": "1.0.30001407", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001407.tgz", - "integrity": "sha512-4ydV+t4P7X3zH83fQWNDX/mQEzYomossfpViCOx9zHBSMV+rIe3LFqglHHtVyvNl1FhTNxPxs3jei82iqOW04w==", - "dev": true - }, - "cbor": { - "version": "npm:@jprochazk/cbor@0.4.9", - "resolved": "https://registry.npmjs.org/@jprochazk/cbor/-/cbor-0.4.9.tgz", - "integrity": "sha512-FWNnkOtWrFOLXKG2nzOHR/EnCCGZZPvatAvWXDmkTDxgjj9JHDK3DkMUHcFCY3a9weylMCSO/nLOUM170NAO0Q==" - }, - "cbor-web": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor-web/-/cbor-web-8.1.0.tgz", - "integrity": "sha512-2hWHHMVrfffgoEmsAUh8vCxHoLa1vgodtC73+C5cSarkJlwTapnqAzcHINlP6Ej0DXuP4OmmJ9LF+JaNM5Lj/g==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "devOptional": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "devOptional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.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" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "devOptional": true - }, - "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==", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "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==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "devOptional": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==" - }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - } - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "devOptional": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "devOptional": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" - }, - "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, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "code-block-writer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", - "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", - "optional": true - }, - "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==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "devOptional": true - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz", - "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true - }, - "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 - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "devOptional": true - }, - "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, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "requires": { - "is-what": "^3.14.1" - } - }, - "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, - "requires": { - "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" - }, - "dependencies": { - "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, - "requires": { - "is-glob": "^4.0.3" - } - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "core-js": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.2.tgz", - "integrity": "sha512-YB4IAT1bjEfxTJ1XYy11hJAKskO+qmhuDBM8/guIfMz4JvdsAQAqvyb97zXX7JgSrfPLG5mRGFWJwJD39ruq2A==" - }, - "core-js-compat": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.2.tgz", - "integrity": "sha512-TxfyECD4smdn3/CjWxczVtJqVLEEC2up7/82t7vC0AzNogr+4nQ8vyF7abxAuTXWvjTClSbvGhU0RgqA4ToQaQ==", - "dev": true, - "requires": { - "browserslist": "^4.21.4" - } - }, - "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 - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "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==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "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==", - "requires": { - "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" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", - "pretty-bytes": "^5.3.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.7", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" - } - }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "requires": {} - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssdb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.0.1.tgz", - "integrity": "sha512-pT3nzyGM78poCKLAEy2zWIVX2hikq6dIrjuZzLV98MumBg+xMTNYfHx7paUlfiRTgg91O/vR889CIf+qiv79Rw==", - "dev": true - }, - "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 - }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", - "dev": true - }, - "data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "devOptional": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "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 - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "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, - "requires": { - "execa": "^5.0.0" - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", - "requires": { - "clone": "^1.0.2" - } - }, - "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==", - "devOptional": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "degenerator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", - "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", - "dev": true, - "requires": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0", - "vm2": "^3.9.8" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "devOptional": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "devOptional": true - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "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 - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dijkstrajs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", - "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" - }, - "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, - "requires": { - "path-type": "^4.0.0" - } - }, - "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 - }, - "dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "dom7": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.4.tgz", - "integrity": "sha512-DSSgBzQ4rJWQp1u6o+3FVwMNnT5bzQbMb+o31TjYYeRi05uAcpF8koxdfzeoe5ElzPmua7W7N28YJhF7iEKqIw==", - "requires": { - "ssr-window": "^4.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "dompurify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.0.tgz", - "integrity": "sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==" - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - } - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "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 - }, - "electron-to-chromium": { - "version": "1.4.255", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.255.tgz", - "integrity": "sha512-H+mFNKow6gi2P5Gi2d1Fvd3TUEJlB9CF7zYaIV9T83BE3wP1xZ0mRPbNTm0KUjyd1QiVy7iKXuIcjlDtBQMiAQ==", - "dev": true - }, - "elementtree": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", - "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", - "dev": true, - "requires": { - "sax": "1.1.4" - } - }, - "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==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" - }, - "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 - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "devOptional": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "devOptional": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "requires": { - "prr": "~1.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "esbuild": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", - "dev": true, - "optional": true, - "requires": { - "@esbuild/linux-loong64": "0.15.5", - "esbuild-android-64": "0.15.5", - "esbuild-android-arm64": "0.15.5", - "esbuild-darwin-64": "0.15.5", - "esbuild-darwin-arm64": "0.15.5", - "esbuild-freebsd-64": "0.15.5", - "esbuild-freebsd-arm64": "0.15.5", - "esbuild-linux-32": "0.15.5", - "esbuild-linux-64": "0.15.5", - "esbuild-linux-arm": "0.15.5", - "esbuild-linux-arm64": "0.15.5", - "esbuild-linux-mips64le": "0.15.5", - "esbuild-linux-ppc64le": "0.15.5", - "esbuild-linux-riscv64": "0.15.5", - "esbuild-linux-s390x": "0.15.5", - "esbuild-netbsd-64": "0.15.5", - "esbuild-openbsd-64": "0.15.5", - "esbuild-sunos-64": "0.15.5", - "esbuild-windows-32": "0.15.5", - "esbuild-windows-64": "0.15.5", - "esbuild-windows-arm64": "0.15.5" - } - }, - "esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "dev": true, - "optional": true - }, - "esbuild-wasm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", - "dev": true - }, - "esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "devOptional": true - }, - "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==", - "dev": true - }, - "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==", - "devOptional": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "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==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "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" - } - }, - "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "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.10.3", - "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" - }, - "dependencies": { - "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 - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "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 - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "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==", - "dev": true - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "devOptional": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "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==" - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "devOptional": true, - "requires": { - "@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" - } - }, - "fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" - }, - "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==", - "dev": true - }, - "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 - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "devOptional": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "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, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "devOptional": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true - }, - "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==", - "devOptional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", - "dev": true, - "requires": { - "semver-regex": "^3.1.2" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "devOptional": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "devOptional": true - }, - "fuse.js": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==" - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "devOptional": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "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==", - "dev": true - }, - "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==" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "get-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - }, - "dependencies": { - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "devOptional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "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, - "requires": { - "is-glob": "^4.0.1" - } - }, - "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==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "devOptional": true - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "requires": { - "duplexer": "^0.1.2" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "devOptional": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "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==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "devOptional": true - }, - "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==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "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==" - } - } - }, - "hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "requires": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - }, - "dependencies": { - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - } - } - }, - "hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hosted-git-info": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.1.0.tgz", - "integrity": "sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q==", - "devOptional": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "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, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - } - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "devOptional": true - }, - "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 - }, - "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, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "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 - } - } - }, - "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 - }, - "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, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "devOptional": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "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, - "requires": { - "@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" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "devOptional": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "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==", - "dev": true - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "devOptional": true, - "requires": { - "ms": "^2.0.0" - } - }, - "husky": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", - "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^7.0.0", - "find-versions": "^4.0.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^5.0.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "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 - }, - "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, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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, - "requires": { - "p-limit": "^3.0.2" - } - }, - "pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "devOptional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "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, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", - "devOptional": true, - "requires": { - "minimatch": "^5.0.1" - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true - }, - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true - }, - "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, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "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 - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "devOptional": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "devOptional": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "devOptional": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", - "devOptional": true - }, - "injection-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", - "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "devOptional": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "devOptional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "devOptional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true - }, - "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==", - "devOptional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ionicons": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-6.0.3.tgz", - "integrity": "sha512-kVOWER991EMqLiVShrCSWKMHkgHZP7XfVdyN6YPMuoO33W7pc5CPNVNfR8OMe/I8rYEbaunyBs6dXNYpR6gGZw==", - "requires": { - "@stencil/core": "~2.16.0" - }, - "dependencies": { - "@stencil/core": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.16.1.tgz", - "integrity": "sha512-s/UJp9qxExL3DyQPT70kiuWeb3AdjbUZM+5lEIXn30I2DLcLYPOPXfsoWJODieQywq+3vPiLZeIdkoqjf6jcSw==" - } - } - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "devOptional": true - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "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, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "devOptional": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "devOptional": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true - }, - "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==" - }, - "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, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "devOptional": true - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true - }, - "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 - }, - "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, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" - }, - "is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "devOptional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "devOptional": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "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 - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jose": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.9.3.tgz", - "integrity": "sha512-f8E/z+T3Q0kA9txzH2DKvH/ds2uggcw0m3vVPSB9HrSkrQ7mojjifvS7aR8cw+lQl2Fcmx9npwaHpM/M3GD8UQ==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "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==", - "devOptional": true - }, - "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==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "devOptional": true - }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "requires": { - "source-map-support": "^0.5.5" - } - }, - "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 - }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true - }, - "leek": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", - "integrity": "sha512-6PVFIYXxlYF0o6hrAsHtGpTmi06otkwNrMcmQ0K96SeSRHPREPa9J3nJZ1frliVH7XT0XFswoJFQoXsDukzGNQ==", - "dev": true, - "requires": { - "debug": "^2.1.0", - "lodash.assign": "^3.2.0", - "rsvp": "^3.0.21" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", - "dev": true, - "requires": { - "copy-anything": "^2.0.1", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "parse-node-version": "^1.0.1", - "source-map": "~0.6.0", - "tslib": "^2.3.0" - }, - "dependencies": { - "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==", - "dev": true, - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "less-loader": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", - "dev": true, - "requires": { - "klona": "^2.0.4" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "license-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", - "dev": true, - "requires": { - "webpack-sources": "^3.0.0" - } - }, - "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true - }, - "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==", - "dev": true - }, - "lint-staged": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.5.0.tgz", - "integrity": "sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g==", - "dev": true, - "requires": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.16", - "commander": "^9.3.0", - "debug": "^4.3.4", - "execa": "^5.1.1", - "lilconfig": "2.0.5", - "listr2": "^4.0.5", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.2", - "pidtree": "^0.5.0", - "string-argv": "^0.3.1", - "supports-color": "^9.2.2", - "yaml": "^1.10.2" - }, - "dependencies": { - "supports-color": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.3.tgz", - "integrity": "sha512-aszYUX/DVK/ed5rFLb/dDinVJrQjG/vmU433wtqVSD800rYsJNWxh2R3USV90aLSU+UsyQkbNeffVLzc6B6foA==", - "dev": true - } - } - }, - "listr2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", - "dev": true, - "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.5", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } - } - }, - "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==", - "dev": true - }, - "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", - "dev": true - }, - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", - "devOptional": true - }, - "macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", - "dev": true - }, - "magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "devOptional": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "marked": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz", - "integrity": "sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA==" - }, - "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==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "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 - }, - "memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "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 - }, - "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==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "devOptional": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "devOptional": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", - "dev": true, - "requires": { - "schema-utils": "^4.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "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==", - "dev": true - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "devOptional": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "devOptional": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "devOptional": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "devOptional": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "devOptional": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "devOptional": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "devOptional": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "devOptional": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "devOptional": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "devOptional": true - }, - "monaco-editor": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.33.0.tgz", - "integrity": "sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==" - }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "devOptional": true - }, - "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, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", - "optional": true, - "requires": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "devOptional": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "needle": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz", - "integrity": "sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - } - } - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "devOptional": true - }, - "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==", - "dev": true - }, - "netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true - }, - "ng-morph": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ng-morph/-/ng-morph-2.1.0.tgz", - "integrity": "sha512-jn34Ter6HlY7E3yOoMhfk3cnUwjLlvcGTsAJ7jS0pZ3SAGi3hzqlf3oyUQO6fNfbFnydc33yNqQtUIrbHKCtNA==", - "optional": true, - "requires": { - "jsonc-parser": "3.0.0", - "minimatch": "3.0.4", - "multimatch": "5.0.0", - "ts-morph": "10.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "ng-packagr": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-14.2.1.tgz", - "integrity": "sha512-o2t/a+DdhUEbXXPbR70LZcU4WcSf7wnddCiQcc3k0HrTQjxWspv0qFUdba3+0ft0dVetaywa6lc+98g/SZEKcQ==", - "dev": true, - "requires": { - "@rollup/plugin-json": "^4.1.0", - "@rollup/plugin-node-resolve": "^13.1.3", - "ajv": "^8.10.0", - "ansi-colors": "^4.1.1", - "browserslist": "^4.20.0", - "cacache": "^16.0.0", - "chokidar": "^3.5.3", - "commander": "^9.0.0", - "dependency-graph": "^0.11.0", - "esbuild": "^0.15.0", - "esbuild-wasm": "^0.15.0", - "find-cache-dir": "^3.3.2", - "glob": "^8.0.0", - "injection-js": "^2.4.0", - "jsonc-parser": "^3.0.0", - "less": "^4.1.2", - "ora": "^5.1.0", - "postcss": "^8.4.8", - "postcss-preset-env": "^7.4.2", - "postcss-url": "^10.1.3", - "rollup": "^2.70.0", - "rollup-plugin-sourcemaps": "^0.6.3", - "rxjs": "^7.5.5", - "sass": "^1.49.9", - "stylus": "^0.59.0" - } - }, - "ng-qrcode": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ng-qrcode/-/ng-qrcode-7.0.0.tgz", - "integrity": "sha512-Mx7nf8rtGMVYxGe2qfy8/JNiCnxKD7uFsqpP2Hm5eJSQrOEapQl9FR0yuK0I4MMQorJ7s8mZZDxmszQiH8R2Kg==", - "requires": { - "qrcode": "^1.5.0", - "tslib": "^2.4.0" - } - }, - "nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "optional": true, - "requires": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" - }, - "node-gyp": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", - "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", - "devOptional": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, - "optional": true - }, - "node-html-parser": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", - "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", - "dev": true, - "requires": { - "css-select": "^4.2.1", - "he": "1.2.0" - } - }, - "node-jose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-jose/-/node-jose-2.2.0.tgz", - "integrity": "sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==", - "requires": { - "base64url": "^3.0.1", - "buffer": "^6.0.3", - "es6-promise": "^4.2.8", - "lodash": "^4.17.21", - "long": "^5.2.0", - "node-forge": "^1.2.1", - "pako": "^2.0.4", - "process": "^0.11.10", - "uuid": "^9.0.0" - }, - "dependencies": { - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - } - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "devOptional": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", - "devOptional": true, - "requires": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "devOptional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", - "devOptional": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "devOptional": true - }, - "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "devOptional": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - }, - "npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", - "devOptional": true, - "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", - "devOptional": true, - "requires": { - "npm-normalize-package-bin": "^2.0.0" - } - }, - "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "devOptional": true - } - } - }, - "npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", - "devOptional": true, - "requires": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - } - }, - "npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", - "devOptional": true, - "requires": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "devOptional": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "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, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "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, - "requires": { - "ee-first": "1.1.1" - } - }, - "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 - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "devOptional": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "dev": true - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "requires": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "devOptional": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "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==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "devOptional": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "dependencies": { - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - } - } - }, - "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==" - }, - "pac-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", - "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^5.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - }, - "dependencies": { - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "socks-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" - } - } - } - }, - "pac-resolver": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", - "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", - "dev": true, - "requires": { - "degenerator": "^3.0.2", - "ip": "^1.1.5", - "netmask": "^2.0.2" - }, - "dependencies": { - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - } - } - }, - "pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", - "devOptional": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - } - }, - "pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" - }, - "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, - "requires": { - "callsites": "^3.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "@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" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", - "requires": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, - "parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", - "requires": { - "parse5": "^6.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "patch-db-client": { - "version": "file:../patch-db/client", - "requires": { - "@types/node": "16.4.13", - "@types/uuid": "8.3.1", - "husky": "^4.3.8", - "lint-staged": "^12.3.7", - "prettier": "^2.6.1", - "sorted-btree": "1.5.0", - "ts-node": "10.2.0", - "tslint": "6.1.3", - "typescript": "4.3.5", - "uuid": "8.3.2" - } - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "optional": true - }, - "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==" - }, - "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==", - "devOptional": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "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==", - "devOptional": true - }, - "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 - }, - "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 - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true - }, - "pidtree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", - "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", - "dev": true, - "requires": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0", - "nice-napi": "^1.0.2" - } - }, - "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==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" - }, - "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-properties": { - "version": "12.1.9", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.9.tgz", - "integrity": "sha512-/E7PRvK8DAVljBbeWrcEQJPG72jaImxF3vvCNFwv9cC8CzigVoNIpeyfnJzphnN3Fd8/auBf5wvkw6W9MfmTyg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "requires": {} - }, - "postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.7" - } - }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "requires": {} - }, - "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, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "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, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "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, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true - }, - "postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "requires": {} - }, - "postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", - "dev": true, - "requires": { - "@csstools/postcss-cascade-layers": "^1.0.5", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.8", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.10", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "requires": {} - }, - "postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-url": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", - "dev": true, - "requires": { - "make-dir": "~3.1.0", - "mime": "~2.5.2", - "minimatch": "~3.0.4", - "xxhashjs": "~0.2.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true - }, - "minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "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 - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true - }, - "proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "devOptional": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" - }, - "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 - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "devOptional": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "devOptional": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "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, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "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 - } - } - }, - "proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", - "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", - "dev": true, - "requires": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^5.0.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" - }, - "dependencies": { - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "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==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "socks-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "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==", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qrcode": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", - "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==", - "requires": { - "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "devOptional": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "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 - }, - "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, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "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==", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", - "devOptional": true, - "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "devOptional": true - } - } - }, - "read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "devOptional": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "devOptional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "regexpu-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", - "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "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==" - }, - "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==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "devOptional": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "devOptional": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "devOptional": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "devOptional": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rollup": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.0.tgz", - "integrity": "sha512-x4KsrCgwQ7ZJPcFA/SUu6QVcYlO7uRLfLAy0DSA4NS2eG8japdbpM50ToH7z4iObodRYOJ0soneF0iaQRJ6zhA==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-sourcemaps": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.6.3.tgz", - "integrity": "sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.9", - "source-map-resolve": "^0.6.0" - } - }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "dev": true - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "devOptional": true - }, - "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==", - "devOptional": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", - "requires": { - "tslib": "^2.1.0" - } - }, - "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==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "sass": { - "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "sax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "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==", - "dev": true - } - } - }, - "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 - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "devOptional": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "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==", - "devOptional": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true - }, - "semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "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 - }, - "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 - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "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, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "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, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "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 - } - } - }, - "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, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "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, - "requires": { - "kind-of": "^6.0.2" - } - }, - "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==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "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==" - }, - "sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - }, - "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, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - } - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "devOptional": true - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", - "devOptional": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "devOptional": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - }, - "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==", - "dev": true - }, - "source-map-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "source-map-resolve": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", - "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0" - } - }, - "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==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "devOptional": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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==", - "devOptional": true - }, - "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==", - "devOptional": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "devOptional": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "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, - "requires": { - "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" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "ssh-config": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", - "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==", - "dev": true - }, - "ssr-window": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", - "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" - }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "devOptional": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - } - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "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==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "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==" - } - } - }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true - }, - "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==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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==", - "dev": true - }, - "stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", - "dev": true, - "requires": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - } - } - }, - "stylus-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "klona": "^2.0.5", - "normalize-path": "^3.0.0" - } - }, - "superagent": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", - "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", - "dev": true, - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "dependencies": { - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - } - } - }, - "superagent-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", - "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", - "dev": true, - "requires": { - "debug": "^4.3.2", - "proxy-agent": "^5.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "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==", - "devOptional": true - }, - "swiper": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.2.tgz", - "integrity": "sha512-nMD/RHVYxJxrLqjWQX2n0B94ANwpnuUv/3PUDT8Aaf+mSteFvZGFng4ypAYq70zW4svryyV+8TRlbRZ+6cgv9A==", - "requires": { - "dom7": "^4.0.4", - "ssr-window": "^4.0.2" - } - }, - "symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "devOptional": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "devOptional": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "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==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "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==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "text-mask-core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/text-mask-core/-/text-mask-core-5.1.2.tgz", - "integrity": "sha512-VfkCMdmRRZqXgQZFlDMiavm3hzsMzBM23CxHZsaeAYg66ZhXCNJWrFmnJwNy8KF9f74YvAUAuQenxsMCfuvhUw==" - }, - "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 - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "devOptional": true - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "devOptional": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "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==", - "dev": true - }, - "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==", - "devOptional": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "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 - }, - "totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "dev": true - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-matches": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ts-matches/-/ts-matches-5.2.1.tgz", - "integrity": "sha512-QSG3V7b3NKIBwBzR8wJcx2VRn0maj5s1Gkj8pdivYtD9us8we7kforlNsREmXobzvPYHE+8poT5gjmDgwQtJ9g==" - }, - "ts-morph": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-10.0.2.tgz", - "integrity": "sha512-TVuIfEqtr9dW25K3Jajqpqx7t/zLRFxKu2rXQZSDjTm4MO4lfmuj1hn8WEryjeDDBFcNOCi+yOmYUYR4HucrAg==", - "optional": true, - "requires": { - "@ts-morph/common": "~0.9.0", - "code-block-writer": "^10.1.1" - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true - }, - "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==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "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==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "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==", - "devOptional": true - }, - "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, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-assert": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", - "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true - }, - "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==", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "devOptional": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "devOptional": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "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 - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "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==", - "devOptional": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", - "devOptional": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "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 - }, - "vm2": { - "version": "3.9.11", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.11.tgz", - "integrity": "sha512-PFG8iJRSjvvBdisowQ7iVF580DXb1uCIiGaXgm7tynMR1uTBlv7UJlB1zdv5KJ+Tmq1f0Upnj3fayoEOPpCBKg==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-walk": "^8.2.0" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "requires": { - "defaults": "^1.0.3" - } - }, - "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "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.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "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==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "has-flag": "^4.0.0" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - } - } - }, - "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, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", - "dev": true, - "requires": { - "@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.1", - "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", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "dependencies": { - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "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==", - "dev": true - }, - "webpack-subresource-integrity": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", - "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", - "dev": true, - "requires": { - "typed-assert": "^1.0.8" - } - }, - "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, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "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 - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "devOptional": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" - }, - "which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "dev": true - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "devOptional": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "requires": { - "execa": "^4.0.2" - }, - "dependencies": { - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "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==", - "devOptional": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", - "devOptional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "devOptional": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "requires": {} - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", - "dev": true - }, - "xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", - "dev": true, - "requires": { - "cuint": "^0.2.2" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "devOptional": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "devOptional": true, - "requires": { - "cliui": "^7.0.2", - "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.0.0" - } - }, - "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==", - "devOptional": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "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==", - "dev": true - }, - "zone.js": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", - "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", - "requires": { - "tslib": "^2.3.0" - } - } } } diff --git a/frontend/package.json b/frontend/package.json index e18cb29db..3b03dd26f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -73,7 +73,7 @@ "node-jose": "^2.2.0", "patch-db-client": "file: ../../../patch-db/client", "pbkdf2": "^3.1.2", - "rxjs": "^7.5.6", + "rxjs": "^7.8.1", "swiper": "^8.2.4", "ts-matches": "^5.2.1", "tslib": "^2.3.0", @@ -103,7 +103,7 @@ "raw-loader": "^4.0.2", "ts-node": "^10.7.0", "tslint": "^6.1.3", - "typescript": "^4.6.3", + "typescript": "4.8.4", "webpack-bundle-analyzer": "^4.8.0" }, "husky": { diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-list/app-list.page.html b/frontend/projects/ui/src/app/pages/apps-routes/app-list/app-list.page.html index 05e4a76cf..4dcc24234 100644 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-list/app-list.page.html +++ b/frontend/projects/ui/src/app/pages/apps-routes/app-list/app-list.page.html @@ -14,7 +14,7 @@

Welcome to StartOS

- + diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-list/package-info.pipe.ts b/frontend/projects/ui/src/app/pages/apps-routes/app-list/package-info.pipe.ts index 76712e4a3..103845620 100644 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-list/package-info.pipe.ts +++ b/frontend/projects/ui/src/app/pages/apps-routes/app-list/package-info.pipe.ts @@ -1,5 +1,5 @@ import { Pipe, PipeTransform } from '@angular/core' -import { Observable } from 'rxjs' +import { Observable, combineLatest } from 'rxjs' import { filter, map, startWith } from 'rxjs/operators' import { DataModel, @@ -7,16 +7,23 @@ import { } from 'src/app/services/patch-db/data-model' import { getPackageInfo, PkgInfo } from '../../../util/get-package-info' import { PatchDB } from 'patch-db-client' +import { DepErrorService } from 'src/app/services/dep-error.service' @Pipe({ name: 'packageInfo', }) export class PackageInfoPipe implements PipeTransform { - constructor(private readonly patch: PatchDB) {} + constructor( + private readonly patch: PatchDB, + private readonly depErrorService: DepErrorService, + ) {} transform(pkg: PackageDataEntry): Observable { - return this.patch - .watch$('package-data', pkg.manifest.id) - .pipe(filter(Boolean), startWith(pkg), map(getPackageInfo)) + return combineLatest([ + this.patch + .watch$('package-data', pkg.manifest.id) + .pipe(filter(Boolean), startWith(pkg)), + this.depErrorService.depErrors$, + ]).pipe(map(([pkg, depErrors]) => getPackageInfo(pkg, depErrors))) } } diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.module.ts b/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.module.ts index f9288494c..c69910c78 100644 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.module.ts +++ b/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.module.ts @@ -18,8 +18,6 @@ import { AppShowAdditionalComponent } from './components/app-show-additional/app import { HealthColorPipe } from './pipes/health-color.pipe' import { ToHealthChecksPipe } from './pipes/to-health-checks.pipe' import { ToButtonsPipe } from './pipes/to-buttons.pipe' -import { ToDependenciesPipe } from './pipes/to-dependencies.pipe' -import { ToStatusPipe } from './pipes/to-status.pipe' import { ProgressDataPipe } from './pipes/progress-data.pipe' const routes: Routes = [ @@ -36,8 +34,6 @@ const routes: Routes = [ ProgressDataPipe, ToHealthChecksPipe, ToButtonsPipe, - ToDependenciesPipe, - ToStatusPipe, AppShowHeaderComponent, AppShowProgressComponent, AppShowStatusComponent, diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.html b/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.html index 7de824787..d2b7eaead 100644 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.html +++ b/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.html @@ -1,9 +1,9 @@ - + - + - + - - - - + + + + + + - - - - - - - - - - - - - + > + + + + + + + + diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.ts b/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.ts index a56a7565b..0a82d89b9 100644 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.ts +++ b/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.ts @@ -3,16 +3,37 @@ import { NavController } from '@ionic/angular' import { PatchDB } from 'patch-db-client' import { DataModel, + InstalledPackageDataEntry, + Manifest, PackageDataEntry, PackageState, } from 'src/app/services/patch-db/data-model' import { PackageStatus, PrimaryStatus, + renderPkgStatus, } from 'src/app/services/pkg-status-rendering.service' -import { tap } from 'rxjs/operators' -import { ActivatedRoute } from '@angular/router' +import { map, tap } from 'rxjs/operators' +import { ActivatedRoute, NavigationExtras } from '@angular/router' import { getPkgId } from '@start9labs/shared' +import { ModalService } from 'src/app/services/modal.service' +import { DependentInfo } from 'src/app/types/dependent-info' +import { + DepErrorService, + DependencyErrorType, + PackageDependencyErrors, +} from 'src/app/services/dep-error.service' +import { combineLatest } from 'rxjs' + +export interface DependencyInfo { + id: string + title: string + icon: string + version: string + errorText: string + actionText: string + action: () => any +} const STATES = [ PackageState.Installing, @@ -28,10 +49,21 @@ const STATES = [ export class AppShowPage { private readonly pkgId = getPkgId(this.route) - readonly pkg$ = this.patch.watch$('package-data', this.pkgId).pipe( - tap(pkg => { + readonly pkgPlus$ = combineLatest([ + this.patch.watch$('package-data'), + this.depErrorService.depErrors$, + ]).pipe( + tap(([pkgs, _]) => { // if package disappears, navigate to list page - if (!pkg) this.navCtrl.navigateRoot('/services') + if (!pkgs[this.pkgId]) this.navCtrl.navigateRoot('/services') + }), + map(([pkgs, depErrors]) => { + const pkg = pkgs[this.pkgId] + return { + pkg, + dependencies: this.getDepInfo(pkg, depErrors), + status: renderPkgStatus(pkg, depErrors), + } }), ) @@ -39,6 +71,8 @@ export class AppShowPage { private readonly route: ActivatedRoute, private readonly navCtrl: NavController, private readonly patch: PatchDB, + private readonly modalService: ModalService, + private readonly depErrorService: DepErrorService, ) {} isInstalled({ state }: PackageDataEntry): boolean { @@ -56,4 +90,136 @@ export class AppShowPage { showProgress({ state }: PackageDataEntry): boolean { return STATES.includes(state) } + + private getDepInfo( + pkg: PackageDataEntry, + depErrors: PackageDependencyErrors, + ): DependencyInfo[] { + const pkgInstalled = pkg.installed + + if (!pkgInstalled) return [] + + return Object.keys(pkgInstalled['current-dependencies']) + .filter(id => !!pkgInstalled.manifest.dependencies[id]) + .map(id => this.getDepValues(pkgInstalled, id, depErrors)) + } + + private getDepValues( + pkgInstalled: InstalledPackageDataEntry, + depId: string, + depErrors: PackageDependencyErrors, + ): DependencyInfo { + const { errorText, fixText, fixAction } = this.getDepErrors( + pkgInstalled, + depId, + depErrors, + ) + + const depInfo = pkgInstalled['dependency-info'][depId] + + return { + id: depId, + version: pkgInstalled.manifest.dependencies[depId].version, // do we want this version range? + title: depInfo?.manifest?.title || depId, + icon: depInfo?.icon || '', + errorText: errorText + ? `${errorText}. ${pkgInstalled.manifest.title} will not work as expected.` + : '', + actionText: fixText || 'View', + action: + fixAction || (() => this.navCtrl.navigateForward(`/services/${depId}`)), + } + } + + private getDepErrors( + pkgInstalled: InstalledPackageDataEntry, + depId: string, + depErrors: PackageDependencyErrors, + ) { + const pkgManifest = pkgInstalled.manifest + const depError = depErrors[pkgInstalled.manifest.id][depId] + + let errorText: string | null = null + let fixText: string | null = null + let fixAction: (() => any) | null = null + + if (depError) { + if (depError.type === DependencyErrorType.NotInstalled) { + errorText = 'Not installed' + fixText = 'Install' + fixAction = () => this.fixDep(pkgManifest, 'install', depId) + } else if (depError.type === DependencyErrorType.IncorrectVersion) { + errorText = 'Incorrect version' + fixText = 'Update' + fixAction = () => this.fixDep(pkgManifest, 'update', depId) + } else if (depError.type === DependencyErrorType.ConfigUnsatisfied) { + errorText = 'Config not satisfied' + fixText = 'Auto config' + fixAction = () => this.fixDep(pkgManifest, 'configure', depId) + } else if (depError.type === DependencyErrorType.NotRunning) { + errorText = 'Not running' + fixText = 'Start' + } else if (depError.type === DependencyErrorType.HealthChecksFailed) { + errorText = 'Health check failed' + } else if (depError.type === DependencyErrorType.Transitive) { + errorText = 'Dependency has a dependency issue' + } + } + + return { + errorText, + fixText, + fixAction, + } + } + + private async fixDep( + pkgManifest: Manifest, + action: 'install' | 'update' | 'configure', + id: string, + ): Promise { + switch (action) { + case 'install': + case 'update': + return this.installDep(pkgManifest, id) + case 'configure': + return this.configureDep(pkgManifest, id) + } + } + + private async installDep( + pkgManifest: Manifest, + depId: string, + ): Promise { + const version = pkgManifest.dependencies[depId].version + + const dependentInfo: DependentInfo = { + id: pkgManifest.id, + title: pkgManifest.title, + version, + } + const navigationExtras: NavigationExtras = { + state: { dependentInfo }, + } + + await this.navCtrl.navigateForward( + `/marketplace/${depId}`, + navigationExtras, + ) + } + + private async configureDep( + pkgManifest: Manifest, + dependencyId: string, + ): Promise { + const dependentInfo: DependentInfo = { + id: pkgManifest.id, + title: pkgManifest.title, + } + + await this.modalService.presentModalConfig({ + pkgId: dependencyId, + dependentInfo, + }) + } } diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-dependencies/app-show-dependencies.component.ts b/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-dependencies/app-show-dependencies.component.ts index 26d4cd026..3a2fee53b 100644 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-dependencies/app-show-dependencies.component.ts +++ b/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-dependencies/app-show-dependencies.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { DependencyInfo } from '../../pipes/to-dependencies.pipe' +import { DependencyInfo } from '../../app-show.page' @Component({ selector: 'app-show-dependencies', diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.ts b/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.ts index 574100678..61e5e9d92 100644 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.ts +++ b/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.ts @@ -15,7 +15,6 @@ import { ErrorToastService } from '@start9labs/shared' import { AlertController, LoadingController } from '@ionic/angular' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ModalService } from 'src/app/services/modal.service' -import { DependencyInfo } from '../../pipes/to-dependencies.pipe' import { hasCurrentDeps } from 'src/app/util/has-deps' import { ConnectionService } from 'src/app/services/connection.service' @@ -32,9 +31,6 @@ export class AppShowStatusComponent { @Input() status!: PackageStatus - @Input() - dependencies: DependencyInfo[] = [] - PR = PrimaryRendering readonly connected$ = this.connectionService.connected$ @@ -80,7 +76,7 @@ export class AppShowStatusComponent { } async tryStart(): Promise { - if (this.dependencies.some(d => !!d.errorText)) { + if (this.status.dependency === 'warning') { const depErrMsg = `${this.pkg.manifest.title} has unmet dependencies. It will not work as expected.` const proceed = await this.presentAlertStart(depErrMsg) diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-show/pipes/to-dependencies.pipe.ts b/frontend/projects/ui/src/app/pages/apps-routes/app-show/pipes/to-dependencies.pipe.ts deleted file mode 100644 index 5fdc4f45e..000000000 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-show/pipes/to-dependencies.pipe.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { NavigationExtras } from '@angular/router' -import { NavController } from '@ionic/angular' -import { - DependencyError, - DependencyErrorType, - PackageDataEntry, -} from 'src/app/services/patch-db/data-model' -import { DependentInfo } from 'src/app/types/dependent-info' -import { ModalService } from 'src/app/services/modal.service' - -export interface DependencyInfo { - id: string - title: string - icon: string - version: string - errorText: string - actionText: string - action: () => any -} - -@Pipe({ - name: 'toDependencies', -}) -export class ToDependenciesPipe implements PipeTransform { - constructor( - private readonly navCtrl: NavController, - private readonly modalService: ModalService, - ) {} - - transform(pkg: PackageDataEntry): DependencyInfo[] { - if (!pkg.installed) return [] - - return Object.keys(pkg.installed?.['current-dependencies']) - .filter(id => !!pkg.manifest.dependencies[id]) - .map(id => - this.setDepValues(pkg, id, pkg.installed!.status['dependency-errors']), - ) - } - - private setDepValues( - pkg: PackageDataEntry, - id: string, - errors: { [id: string]: DependencyError | null }, - ): DependencyInfo { - let errorText = '' - let actionText = 'View' - let action: () => any = () => - this.navCtrl.navigateForward(`/services/${id}`) - - const error = errors[id] - - if (error) { - // health checks failed - if ( - [ - DependencyErrorType.InterfaceHealthChecksFailed, - DependencyErrorType.HealthChecksFailed, - ].includes(error.type) - ) { - errorText = 'Health check failed' - // not installed - } else if (error.type === DependencyErrorType.NotInstalled) { - errorText = 'Not installed' - actionText = 'Install' - action = () => this.fixDep(pkg, 'install', id) - // incorrect version - } else if (error.type === DependencyErrorType.IncorrectVersion) { - errorText = 'Incorrect version' - actionText = 'Update' - action = () => this.fixDep(pkg, 'update', id) - // not running - } else if (error.type === DependencyErrorType.NotRunning) { - errorText = 'Not running' - actionText = 'Start' - // config unsatisfied - } else if (error.type === DependencyErrorType.ConfigUnsatisfied) { - errorText = 'Config not satisfied' - actionText = 'Auto config' - action = () => this.fixDep(pkg, 'configure', id) - } else if (error.type === DependencyErrorType.Transitive) { - errorText = 'Dependency has a dependency issue' - } - errorText = `${errorText}. ${pkg.manifest.title} will not work as expected.` - } - - const depInfo = pkg.installed?.['dependency-info'][id] - - return { - id, - version: pkg.manifest.dependencies[id].version, - title: depInfo?.manifest?.title || id, - icon: depInfo?.icon || '', - errorText, - actionText, - action, - } - } - - async fixDep( - pkg: PackageDataEntry, - action: 'install' | 'update' | 'configure', - id: string, - ): Promise { - switch (action) { - case 'install': - case 'update': - return this.installDep(pkg, id) - case 'configure': - return this.configureDep(pkg, id) - } - } - - private async installDep( - pkg: PackageDataEntry, - depId: string, - ): Promise { - const version = pkg.manifest.dependencies[depId].version - - const dependentInfo: DependentInfo = { - id: pkg.manifest.id, - title: pkg.manifest.title, - version, - } - const navigationExtras: NavigationExtras = { - state: { dependentInfo }, - } - - await this.navCtrl.navigateForward( - `/marketplace/${depId}`, - navigationExtras, - ) - } - - private async configureDep( - pkg: PackageDataEntry, - dependencyId: string, - ): Promise { - const dependentInfo: DependentInfo = { - id: pkg.manifest.id, - title: pkg.manifest.title, - } - - await this.modalService.presentModalConfig({ - pkgId: dependencyId, - dependentInfo, - }) - } -} diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-show/pipes/to-status.pipe.ts b/frontend/projects/ui/src/app/pages/apps-routes/app-show/pipes/to-status.pipe.ts deleted file mode 100644 index 1fc9e83f3..000000000 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-show/pipes/to-status.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' -import { - PackageStatus, - renderPkgStatus, -} from 'src/app/services/pkg-status-rendering.service' - -@Pipe({ - name: 'toStatus', -}) -export class ToStatusPipe implements PipeTransform { - transform(pkg: PackageDataEntry): PackageStatus { - return renderPkgStatus(pkg) - } -} diff --git a/frontend/projects/ui/src/app/pages/marketplace-routes/marketplace-show/marketplace-show-controls/marketplace-show-controls.component.ts b/frontend/projects/ui/src/app/pages/marketplace-routes/marketplace-show/marketplace-show-controls/marketplace-show-controls.component.ts index d9e2d99d8..c2edfc15d 100644 --- a/frontend/projects/ui/src/app/pages/marketplace-routes/marketplace-show/marketplace-show-controls/marketplace-show-controls.component.ts +++ b/frontend/projects/ui/src/app/pages/marketplace-routes/marketplace-show/marketplace-show-controls/marketplace-show-controls.component.ts @@ -23,11 +23,10 @@ import { import { ClientStorageService } from 'src/app/services/client-storage.service' import { MarketplaceService } from 'src/app/services/marketplace.service' import { hasCurrentDeps } from 'src/app/util/has-deps' -import { ApiService } from 'src/app/services/api/embassy-api.service' -import { Breakages } from 'src/app/services/api/api.types' import { PatchDB } from 'patch-db-client' import { getAllPackages } from 'src/app/util/get-package-data' import { firstValueFrom } from 'rxjs' +import { dryUpdate } from 'src/app/util/dry-update' @Component({ selector: 'marketplace-show-controls', @@ -57,7 +56,6 @@ export class MarketplaceShowControlsComponent { private readonly loadingCtrl: LoadingController, private readonly emver: Emver, private readonly errToast: ErrorToastService, - private readonly embassyApi: ApiService, private readonly patch: PatchDB, ) {} @@ -142,30 +140,19 @@ export class MarketplaceShowControlsComponent { } private async dryInstall(url: string) { - const loader = await this.loadingCtrl.create({ - message: 'Checking dependent services...', - }) - await loader.present() + const breakages = dryUpdate( + this.pkg.manifest, + await getAllPackages(this.patch), + this.emver, + ) - const { id, version } = this.pkg.manifest - - try { - const breakages = await this.embassyApi.dryUpdatePackage({ - id, - version: `${version}`, - }) - - if (isEmptyObject(breakages)) { - this.install(url, loader) - } else { - await loader.dismiss() - const proceed = await this.presentAlertBreakages(breakages) - if (proceed) { - this.install(url) - } + if (isEmptyObject(breakages)) { + this.install(url) + } else { + const proceed = await this.presentAlertBreakages(breakages) + if (proceed) { + this.install(url) } - } catch (e: any) { - this.errToast.present(e) } } @@ -194,14 +181,11 @@ export class MarketplaceShowControlsComponent { await alert.present() } - private async install(url: string, loader?: HTMLIonLoadingElement) { - const message = 'Beginning Install...' - if (loader) { - loader.message = message - } else { - loader = await this.loadingCtrl.create({ message }) - await loader.present() - } + private async install(url: string) { + const loader = await this.loadingCtrl.create({ + message: 'Beginning Install...', + }) + await loader.present() const { id, version } = this.pkg.manifest @@ -214,14 +198,10 @@ export class MarketplaceShowControlsComponent { } } - private async presentAlertBreakages(breakages: Breakages): Promise { + private async presentAlertBreakages(breakages: string[]): Promise { let message: string = 'As a result of this update, the following services will no longer work properly and may crash:
    ' - const localPkgs = await getAllPackages(this.patch) - const bullets = Object.keys(breakages).map(id => { - const title = localPkgs[id].manifest.title - return `
  • ${title}
  • ` - }) + const bullets = breakages.map(title => `
  • ${title}
  • `) message = `${message}${bullets.join('')}
` return new Promise(async resolve => { diff --git a/frontend/projects/ui/src/app/pages/updates/updates.page.ts b/frontend/projects/ui/src/app/pages/updates/updates.page.ts index cfa833e67..522b51218 100644 --- a/frontend/projects/ui/src/app/pages/updates/updates.page.ts +++ b/frontend/projects/ui/src/app/pages/updates/updates.page.ts @@ -1,5 +1,4 @@ import { Component, Inject } from '@angular/core' -import { ApiService } from 'src/app/services/api/embassy-api.service' import { PatchDB } from 'patch-db-client' import { DataModel, @@ -16,14 +15,10 @@ import { import { Emver, isEmptyObject } from '@start9labs/shared' import { Pipe, PipeTransform } from '@angular/core' import { combineLatest, Observable } from 'rxjs' -import { - AlertController, - LoadingController, - NavController, -} from '@ionic/angular' +import { AlertController, NavController } from '@ionic/angular' import { hasCurrentDeps } from 'src/app/util/has-deps' import { getAllPackages } from 'src/app/util/get-package-data' -import { Breakages } from 'src/app/services/api/api.types' +import { dryUpdate } from 'src/app/util/dry-update' interface UpdatesData { hosts: StoreIdentity[] @@ -48,11 +43,10 @@ export class UpdatesPage { constructor( @Inject(AbstractMarketplaceService) readonly marketplaceService: MarketplaceService, - private readonly api: ApiService, private readonly patch: PatchDB, private readonly navCtrl: NavController, - private readonly loadingCtrl: LoadingController, private readonly alertCtrl: AlertController, + private readonly emver: Emver, ) {} viewInMarketplace(event: Event, url: string, id: string) { @@ -77,55 +71,40 @@ export class UpdatesPage { this.marketplaceService.updateQueue[id] = true if (hasCurrentDeps(local)) { - this.dryUpdate(manifest, url) + this.dryInstall(manifest, url) } else { - this.update(id, version, url) + this.install(id, version, url) } } - private async dryUpdate(manifest: MarketplaceManifest, url: string) { - const loader = await this.loadingCtrl.create({ - message: 'Checking dependent services...', - }) - await loader.present() + private async dryInstall(manifest: MarketplaceManifest, url: string) { + const { id, version, title } = manifest - const { id, version } = manifest + const breakages = dryUpdate( + manifest, + await getAllPackages(this.patch), + this.emver, + ) - try { - const breakages = await this.api.dryUpdatePackage({ - id, - version: `${version}`, - }) - await loader.dismiss() - - if (isEmptyObject(breakages)) { - this.update(id, version, url) + if (isEmptyObject(breakages)) { + this.install(id, version, url) + } else { + const proceed = await this.presentAlertBreakages(title, breakages) + if (proceed) { + this.install(id, version, url) } else { - const proceed = await this.presentAlertBreakages( - manifest.title, - breakages, - ) - if (proceed) { - this.update(id, version, url) - } else { - delete this.marketplaceService.updateQueue[id] - } + delete this.marketplaceService.updateQueue[id] } - } catch (e: any) { - delete this.marketplaceService.updateQueue[id] - this.marketplaceService.updateErrors[id] = e.message } } private async presentAlertBreakages( title: string, - breakages: Breakages, + breakages: string[], ): Promise { let message: string = `As a result of updating ${title}, the following services will no longer work properly and may crash:
    ` - const localPkgs = await getAllPackages(this.patch) - const bullets = Object.keys(breakages).map(id => { - const title = localPkgs[id].manifest.title - return `
  • ${title}
  • ` + const bullets = breakages.map(depTitle => { + return `
  • ${depTitle}
  • ` }) message = `${message}${bullets.join('')}
` @@ -156,7 +135,7 @@ export class UpdatesPage { }) } - private async update(id: string, version: string, url: string) { + private async install(id: string, version: string, url: string) { try { await this.marketplaceService.installPackage(id, version, url) delete this.marketplaceService.updateQueue[id] diff --git a/frontend/projects/ui/src/app/pages/widgets/built-in/health/health.component.ts b/frontend/projects/ui/src/app/pages/widgets/built-in/health/health.component.ts index 0da0b17af..f69a0407b 100644 --- a/frontend/projects/ui/src/app/pages/widgets/built-in/health/health.component.ts +++ b/frontend/projects/ui/src/app/pages/widgets/built-in/health/health.component.ts @@ -1,7 +1,10 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { PatchDB } from 'patch-db-client' import { map } from 'rxjs/operators' -import { PackageDataEntry } from 'src/app/services/patch-db/data-model' +import { + DataModel, + PackageDataEntry, +} from 'src/app/services/patch-db/data-model' import { PrimaryStatus } from 'src/app/services/pkg-status-rendering.service' import { getPackageInfo, PkgInfo } from '../../../../util/get-package-info' @@ -20,11 +23,13 @@ export class HealthComponent { 'Transitioning', ] as const - readonly data$ = inject(PatchDB) + readonly data$ = inject(PatchDB) .watch$('package-data') .pipe( map(data => { - const pkgs = Object.values(data).map(getPackageInfo) + const pkgs = Object.values(data).map( + pkg => getPackageInfo(pkg, {}), // @TODO hack because not currently using widget + ) const result = this.labels.reduce>( (acc, label) => ({ ...acc, diff --git a/frontend/projects/ui/src/app/services/api/api.fixures.ts b/frontend/projects/ui/src/app/services/api/api.fixures.ts index 6e999e956..7d447573b 100644 --- a/frontend/projects/ui/src/app/services/api/api.fixures.ts +++ b/frontend/projects/ui/src/app/services/api/api.fixures.ts @@ -1,5 +1,4 @@ import { - DependencyErrorType, DockerIoFormat, Manifest, PackageDataEntry, @@ -1889,7 +1888,7 @@ export module Mock { started: new Date().toISOString(), health: {}, }, - 'dependency-errors': {}, + 'dependency-config-errors': {}, }, 'interface-addresses': { ui: { @@ -1935,7 +1934,7 @@ export module Mock { main: { status: PackageMainStatus.Stopped, }, - 'dependency-errors': {}, + 'dependency-config-errors': {}, }, manifest: MockManifestBitcoinProxy, 'interface-addresses': { @@ -1984,10 +1983,8 @@ export module Mock { main: { status: PackageMainStatus.Stopped, }, - 'dependency-errors': { - 'btc-rpc-proxy': { - type: DependencyErrorType.NotInstalled, - }, + 'dependency-config-errors': { + 'btc-rpc-proxy': 'Username not found', }, }, manifest: MockManifestLnd, diff --git a/frontend/projects/ui/src/app/services/api/api.types.ts b/frontend/projects/ui/src/app/services/api/api.types.ts index 372ec8e75..472cb5ab9 100644 --- a/frontend/projects/ui/src/app/services/api/api.types.ts +++ b/frontend/projects/ui/src/app/services/api/api.types.ts @@ -4,7 +4,7 @@ import { PackagePropertiesVersioned } from 'src/app/util/properties.util' import { ConfigSpec } from 'src/app/pkg-config/config-types' import { DataModel, - DependencyError, + HealthCheckResult, Manifest, } from 'src/app/services/patch-db/data-model' import { StartOSDiskInfo, LogsRes, ServerLogsReq } from '@start9labs/shared' @@ -201,9 +201,6 @@ export module RR { } // package.install export type InstallPackageRes = null - export type DryUpdatePackageReq = { id: string; version: string } // package.update.dry - export type DryUpdatePackageRes = Breakages - export type GetPackageConfigReq = { id: string } // package.config.get export type GetPackageConfigRes = { spec: ConfigSpec; config: object } @@ -465,3 +462,53 @@ declare global { parse(text: Stringified, reviver?: (key: any, value: any) => any): T } } + +export type Encrypted = { + encrypted: string +} + +export type DependencyError = + | DependencyErrorNotInstalled + | DependencyErrorNotRunning + | DependencyErrorIncorrectVersion + | DependencyErrorConfigUnsatisfied + | DependencyErrorHealthChecksFailed + | DependencyErrorTransitive + +export enum DependencyErrorType { + NotInstalled = 'not-installed', + NotRunning = 'not-running', + IncorrectVersion = 'incorrect-version', + ConfigUnsatisfied = 'config-unsatisfied', + HealthChecksFailed = 'health-checks-failed', + InterfaceHealthChecksFailed = 'interface-health-checks-failed', + Transitive = 'transitive', +} + +export interface DependencyErrorNotInstalled { + type: DependencyErrorType.NotInstalled +} + +export interface DependencyErrorNotRunning { + type: DependencyErrorType.NotRunning +} + +export interface DependencyErrorIncorrectVersion { + type: DependencyErrorType.IncorrectVersion + expected: string // version range + received: string // version +} + +export interface DependencyErrorConfigUnsatisfied { + type: DependencyErrorType.ConfigUnsatisfied + error: string +} + +export interface DependencyErrorHealthChecksFailed { + type: DependencyErrorType.HealthChecksFailed + check: HealthCheckResult +} + +export interface DependencyErrorTransitive { + type: DependencyErrorType.Transitive +} diff --git a/frontend/projects/ui/src/app/services/api/embassy-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-api.service.ts index 2a67de4ca..2a10bc473 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-api.service.ts @@ -192,10 +192,6 @@ export abstract class ApiService { params: RR.InstallPackageReq, ): Promise - abstract dryUpdatePackage( - params: RR.DryUpdatePackageReq, - ): Promise - abstract getPackageConfig( params: RR.GetPackageConfigReq, ): Promise diff --git a/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts index bf436b6e1..63b36aa93 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts @@ -354,12 +354,6 @@ export class LiveApiService extends ApiService { return this.rpcRequest({ method: 'package.install', params }) } - async dryUpdatePackage( - params: RR.DryUpdatePackageReq, - ): Promise { - return this.rpcRequest({ method: 'package.update.dry', params }) - } - async getPackageConfig( params: RR.GetPackageConfigReq, ): Promise { diff --git a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts index c80bab73b..c8c1a1f22 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts @@ -10,7 +10,6 @@ import { } from 'patch-db-client' import { DataModel, - DependencyErrorType, InstallProgress, PackageDataEntry, PackageMainStatus, @@ -631,22 +630,6 @@ export class MockApiService extends ApiService { return this.withRevision(patch) } - async dryUpdatePackage( - params: RR.DryUpdatePackageReq, - ): Promise { - await pauseFor(2000) - return { - lnd: { - dependency: 'bitcoind', - error: { - type: DependencyErrorType.IncorrectVersion, - expected: '>0.23.0', - received: params.version, - }, - }, - } - } - async getPackageConfig( params: RR.GetPackageConfigReq, ): Promise { diff --git a/frontend/projects/ui/src/app/services/api/mock-patch.ts b/frontend/projects/ui/src/app/services/api/mock-patch.ts index 114ee9b30..6cf5fa7e1 100644 --- a/frontend/projects/ui/src/app/services/api/mock-patch.ts +++ b/frontend/projects/ui/src/app/services/api/mock-patch.ts @@ -1,6 +1,5 @@ import { DataModel, - DependencyErrorType, DockerIoFormat, HealthResult, Manifest, @@ -438,7 +437,7 @@ export const mockPatchData: DataModel = { }, }, }, - 'dependency-errors': {}, + 'dependency-config-errors': {}, }, 'interface-addresses': { ui: { @@ -637,11 +636,8 @@ export const mockPatchData: DataModel = { main: { status: PackageMainStatus.Stopped, }, - 'dependency-errors': { - 'btc-rpc-proxy': { - type: DependencyErrorType.ConfigUnsatisfied, - error: 'This is a config unsatisfied error', - }, + 'dependency-config-errors': { + 'btc-rpc-proxy': 'This is a config unsatisfied error', }, }, 'interface-addresses': { diff --git a/frontend/projects/ui/src/app/services/dep-error.service.ts b/frontend/projects/ui/src/app/services/dep-error.service.ts new file mode 100644 index 000000000..733b0a377 --- /dev/null +++ b/frontend/projects/ui/src/app/services/dep-error.service.ts @@ -0,0 +1,211 @@ +import { Injectable } from '@angular/core' +import { Emver } from '@start9labs/shared' +import { map, shareReplay } from 'rxjs/operators' +import { PatchDB } from 'patch-db-client' +import { + DataModel, + HealthCheckResult, + HealthResult, + InstalledPackageDataEntry, + PackageMainStatus, +} from './patch-db/data-model' + +export type PackageDependencyErrors = Record +export type DependencyErrors = Record + +@Injectable({ + providedIn: 'root', +}) +export class DepErrorService { + readonly depErrors$ = this.patch.watch$('package-data').pipe( + map(pkgs => + Object.keys(pkgs) + .map(id => ({ + id, + depth: dependencyDepth(pkgs, id), + })) + .sort((a, b) => (b.depth > a.depth ? -1 : 1)) + .reduce( + (errors, { id }): PackageDependencyErrors => ({ + ...errors, + [id]: this.getDepErrors(pkgs, id, errors), + }), + {} as PackageDependencyErrors, + ), + ), + shareReplay(1), + ) + + constructor( + private readonly emver: Emver, + private readonly patch: PatchDB, + ) {} + + private getDepErrors( + pkgs: DataModel['package-data'], + pkgId: string, + outerErrors: PackageDependencyErrors, + ): DependencyErrors { + const pkgInstalled = pkgs[pkgId].installed + + if (!pkgInstalled) return {} + + return currentDeps(pkgs, pkgId).reduce( + (innerErrors, depId): DependencyErrors => ({ + ...innerErrors, + [depId]: this.getDepError(pkgs, pkgInstalled, depId, outerErrors), + }), + {} as DependencyErrors, + ) + } + + private getDepError( + pkgs: DataModel['package-data'], + pkgInstalled: InstalledPackageDataEntry, + depId: string, + outerErrors: PackageDependencyErrors, + ): DependencyError | null { + const depInstalled = pkgs[depId]?.installed + + // not installed + if (!depInstalled) { + return { + type: DependencyErrorType.NotInstalled, + } + } + + const pkgManifest = pkgInstalled.manifest + const depManifest = depInstalled.manifest + + // incorrect version + if ( + !this.emver.satisfies( + depManifest.version, + pkgManifest.dependencies[depId].version, + ) + ) { + return { + type: DependencyErrorType.IncorrectVersion, + expected: pkgManifest.dependencies[depId].version, + received: depManifest.version, + } + } + + // invalid config + if ( + Object.values(pkgInstalled.status['dependency-config-errors']).some( + err => !!err, + ) + ) { + return { + type: DependencyErrorType.ConfigUnsatisfied, + } + } + + const depStatus = depInstalled.status.main.status + + // not running + if ( + depStatus !== PackageMainStatus.Running && + depStatus !== PackageMainStatus.Starting && + !( + depStatus === PackageMainStatus.BackingUp && + depInstalled.status.main.started + ) + ) { + return { + type: DependencyErrorType.NotRunning, + } + } + + // health check failure + if (depStatus === PackageMainStatus.Running) { + for (let id of pkgInstalled['current-dependencies'][depId][ + 'health-checks' + ]) { + if ( + depInstalled.status.main.health[id].result !== HealthResult.Success + ) { + return { + type: DependencyErrorType.HealthChecksFailed, + check: depInstalled.status.main.health[id], + } + } + } + } + + // transitive + const transitiveError = currentDeps(pkgs, depId).some(transitiveId => + Object.values(outerErrors[transitiveId]).some(err => !!err), + ) + + if (transitiveError) { + return { + type: DependencyErrorType.Transitive, + } + } + + return null + } +} + +function currentDeps(pkgs: DataModel['package-data'], id: string): string[] { + return Object.keys( + pkgs[id]?.installed?.['current-dependencies'] || {}, + ).filter(depId => depId !== id) +} + +function dependencyDepth( + pkgs: DataModel['package-data'], + id: string, + depth = 0, +): number { + return currentDeps(pkgs, id).reduce( + (prev, depId) => dependencyDepth(pkgs, depId, prev + 1), + depth, + ) +} + +export type DependencyError = + | DependencyErrorNotInstalled + | DependencyErrorNotRunning + | DependencyErrorIncorrectVersion + | DependencyErrorConfigUnsatisfied + | DependencyErrorHealthChecksFailed + | DependencyErrorTransitive + +export enum DependencyErrorType { + NotInstalled = 'notInstalled', + NotRunning = 'notRunning', + IncorrectVersion = 'incorrectVersion', + ConfigUnsatisfied = 'configUnsatisfied', + HealthChecksFailed = 'healthChecksFailed', + Transitive = 'transitive', +} + +export interface DependencyErrorNotInstalled { + type: DependencyErrorType.NotInstalled +} + +export interface DependencyErrorNotRunning { + type: DependencyErrorType.NotRunning +} + +export interface DependencyErrorIncorrectVersion { + type: DependencyErrorType.IncorrectVersion + expected: string // version range + received: string // version +} + +export interface DependencyErrorConfigUnsatisfied { + type: DependencyErrorType.ConfigUnsatisfied +} + +export interface DependencyErrorHealthChecksFailed { + type: DependencyErrorType.HealthChecksFailed + check: HealthCheckResult +} + +export interface DependencyErrorTransitive { + type: DependencyErrorType.Transitive +} diff --git a/frontend/projects/ui/src/app/services/patch-db/data-model.ts b/frontend/projects/ui/src/app/services/patch-db/data-model.ts index 43839ae43..554a0dc30 100644 --- a/frontend/projects/ui/src/app/services/patch-db/data-model.ts +++ b/frontend/projects/ui/src/app/services/patch-db/data-model.ts @@ -277,7 +277,7 @@ export interface Action { export interface Status { configured: boolean main: MainStatus - 'dependency-errors': { [id: string]: DependencyError | null } + 'dependency-config-errors': { [id: string]: string | null } } export type MainStatus = @@ -362,52 +362,6 @@ export interface HealthCheckResultFailure { error: string } -export type DependencyError = - | DependencyErrorNotInstalled - | DependencyErrorNotRunning - | DependencyErrorIncorrectVersion - | DependencyErrorConfigUnsatisfied - | DependencyErrorHealthChecksFailed - | DependencyErrorTransitive - -export enum DependencyErrorType { - NotInstalled = 'not-installed', - NotRunning = 'not-running', - IncorrectVersion = 'incorrect-version', - ConfigUnsatisfied = 'config-unsatisfied', - HealthChecksFailed = 'health-checks-failed', - InterfaceHealthChecksFailed = 'interface-health-checks-failed', - Transitive = 'transitive', -} - -export interface DependencyErrorNotInstalled { - type: DependencyErrorType.NotInstalled -} - -export interface DependencyErrorNotRunning { - type: DependencyErrorType.NotRunning -} - -export interface DependencyErrorIncorrectVersion { - type: DependencyErrorType.IncorrectVersion - expected: string // version range - received: string // version -} - -export interface DependencyErrorConfigUnsatisfied { - type: DependencyErrorType.ConfigUnsatisfied - error: string -} - -export interface DependencyErrorHealthChecksFailed { - type: DependencyErrorType.HealthChecksFailed - check: HealthCheckResult -} - -export interface DependencyErrorTransitive { - type: DependencyErrorType.Transitive -} - export interface InstallProgress { readonly size: number | null readonly downloaded: number diff --git a/frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts b/frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts index 58fab27bf..ce415bcbd 100644 --- a/frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts +++ b/frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts @@ -1,11 +1,13 @@ import { isEmptyObject } from '@start9labs/shared' import { + InstalledPackageDataEntry, MainStatusStarting, PackageDataEntry, PackageMainStatus, PackageState, Status, } from 'src/app/services/patch-db/data-model' +import { PackageDependencyErrors } from './dep-error.service' export interface PackageStatus { primary: PrimaryStatus @@ -13,16 +15,21 @@ export interface PackageStatus { health: HealthStatus | null } -export function renderPkgStatus(pkg: PackageDataEntry): PackageStatus { +export function renderPkgStatus( + pkg: PackageDataEntry, + depErrors: PackageDependencyErrors, +): PackageStatus { let primary: PrimaryStatus let dependency: DependencyStatus | null = null let health: HealthStatus | null = null - const hasHealthChecks = !isEmptyObject(pkg.manifest['health-checks']) if (pkg.state === PackageState.Installed && pkg.installed) { primary = getPrimaryStatus(pkg.installed.status) - dependency = getDependencyStatus(pkg) - health = getHealthStatus(pkg.installed.status, hasHealthChecks) + dependency = getDependencyStatus(pkg.installed, depErrors) + health = getHealthStatus( + pkg.installed.status, + !isEmptyObject(pkg.manifest['health-checks']), + ) } else { primary = pkg.state as string as PrimaryStatus } @@ -40,15 +47,13 @@ function getPrimaryStatus(status: Status): PrimaryStatus { } } -function getDependencyStatus(pkg: PackageDataEntry): DependencyStatus | null { - const installed = pkg.installed - if (!installed || isEmptyObject(installed['current-dependencies'])) - return null - - const depErrors = installed.status['dependency-errors'] - const depIds = Object.keys(depErrors).filter(key => !!depErrors[key]) - - return depIds.length ? DependencyStatus.Warning : DependencyStatus.Satisfied +function getDependencyStatus( + pkg: InstalledPackageDataEntry, + depErrors: PackageDependencyErrors, +): DependencyStatus { + return Object.values(depErrors[pkg.manifest.id]).some(err => !!err) + ? DependencyStatus.Warning + : DependencyStatus.Satisfied } function getHealthStatus( diff --git a/frontend/projects/ui/src/app/util/dry-update.ts b/frontend/projects/ui/src/app/util/dry-update.ts new file mode 100644 index 000000000..9b7ba44a3 --- /dev/null +++ b/frontend/projects/ui/src/app/util/dry-update.ts @@ -0,0 +1,17 @@ +import { Emver } from '@start9labs/shared' +import { DataModel } from '../services/patch-db/data-model' + +export function dryUpdate( + { id, version }: { id: string; version: string }, + pkgs: DataModel['package-data'], + emver: Emver, +): string[] { + return Object.values(pkgs) + .filter( + pkg => + Object.keys(pkg.installed?.['current-dependencies'] || {}).some( + pkgId => pkgId === id, + ) && !emver.satisfies(version, pkg.manifest.dependencies[id].version), + ) + .map(pkg => pkg.manifest.title) +} diff --git a/frontend/projects/ui/src/app/util/get-package-data.ts b/frontend/projects/ui/src/app/util/get-package-data.ts index 816471832..0645f3b3c 100644 --- a/frontend/projects/ui/src/app/util/get-package-data.ts +++ b/frontend/projects/ui/src/app/util/get-package-data.ts @@ -14,6 +14,6 @@ export async function getPackage( export async function getAllPackages( patch: PatchDB, -): Promise> { +): Promise { return firstValueFrom(patch.watch$('package-data')) } diff --git a/frontend/projects/ui/src/app/util/get-package-info.ts b/frontend/projects/ui/src/app/util/get-package-info.ts index 1dde896ae..f98d969fb 100644 --- a/frontend/projects/ui/src/app/util/get-package-info.ts +++ b/frontend/projects/ui/src/app/util/get-package-info.ts @@ -10,9 +10,13 @@ import { import { ProgressData } from 'src/app/types/progress-data' import { Subscription } from 'rxjs' import { packageLoadingProgress } from './package-loading-progress' +import { PackageDependencyErrors } from '../services/dep-error.service' -export function getPackageInfo(entry: PackageDataEntry): PkgInfo { - const statuses = renderPkgStatus(entry) +export function getPackageInfo( + entry: PackageDataEntry, + depErrors: PackageDependencyErrors, +): PkgInfo { + const statuses = renderPkgStatus(entry, depErrors) const primaryRendering = PrimaryRendering[statuses.primary] return { diff --git a/libs/Cargo.lock b/libs/Cargo.lock index 55ea76110..49db9a61e 100644 --- a/libs/Cargo.lock +++ b/libs/Cargo.lock @@ -45,6 +45,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if", + "getrandom 0.2.10", "once_cell", "version_check", ] @@ -243,15 +244,6 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - [[package]] name = "bitmaps" version = "3.2.0" @@ -295,44 +287,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" -[[package]] -name = "bollard" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82e7850583ead5f8bbef247e2a3c37a19bd576e8420cd262a6711921827e1e5" -dependencies = [ - "base64 0.13.1", - "bollard-stubs", - "bytes", - "futures-core", - "futures-util", - "hex", - "http", - "hyper", - "hyperlocal", - "log", - "pin-project-lite", - "serde", - "serde_derive", - "serde_json", - "serde_urlencoded", - "thiserror", - "tokio", - "tokio-util", - "url", - "winapi", -] - -[[package]] -name = "bollard-stubs" -version = "1.42.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed59b5c00048f48d7af971b71f800fdf23e858844a6f9e4d32ca72e9399e7864" -dependencies = [ - "serde", - "serde_with", -] - [[package]] name = "bumpalo" version = "3.13.0" @@ -411,7 +365,7 @@ dependencies = [ "indenter", "once_cell", "owo-colors", - "tracing-error 0.2.0", + "tracing-error", ] [[package]] @@ -423,7 +377,7 @@ dependencies = [ "once_cell", "owo-colors", "tracing-core", - "tracing-error 0.2.0", + "tracing-error", ] [[package]] @@ -560,41 +514,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core", - "quote", - "syn 1.0.109", -] - [[package]] name = "dashmap" version = "5.5.0" @@ -898,7 +817,7 @@ dependencies = [ "color-eyre", "futures", "helpers", - "imbl 2.0.0", + "imbl", "nix 0.25.1", "procfs", "serde", @@ -906,9 +825,9 @@ dependencies = [ "tokio", "tokio-stream", "tracing", - "tracing-error 0.2.0", + "tracing-error", "tracing-futures", - "tracing-subscriber 0.3.17", + "tracing-subscriber", "yajrc 0.1.0 (git+https://github.com/dr-bonez/yajrc.git?branch=develop)", ] @@ -1259,8 +1178,14 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.7.6", + "ahash 0.8.3", ] [[package]] @@ -1282,15 +1207,6 @@ dependencies = [ "hashbrown 0.14.0", ] -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "heck" version = "0.4.1" @@ -1437,19 +1353,6 @@ dependencies = [ "tokio-native-tls", ] -[[package]] -name = "hyperlocal" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c" -dependencies = [ - "futures-util", - "hex", - "hyper", - "pin-project", - "tokio", -] - [[package]] name = "iana-time-zone" version = "0.1.57" @@ -1473,12 +1376,6 @@ dependencies = [ "cc", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "0.4.0" @@ -1495,30 +1392,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" -[[package]] -name = "imbl" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "543682c9082b25e63d03b5acbd65ad111fd49dd93e70843e5175db4ff81d606b" -dependencies = [ - "bitmaps 2.1.0", - "rand_core 0.6.4", - "rand_xoshiro", - "sized-chunks", - "typenum", - "version_check", -] - [[package]] name = "imbl" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2806b69cd9f4664844027b64465eacb444c67c1db9c778e341adff0c25cdb0d" dependencies = [ - "bitmaps 3.2.0", + "bitmaps", "imbl-sized-chunks", "rand_core 0.6.4", "rand_xoshiro", + "serde", "version_check", ] @@ -1528,7 +1412,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6957ea0b2541c5ca561d3ef4538044af79f8a05a1eb3a3b148936aaceaa1076" dependencies = [ - "bitmaps 3.2.0", + "bitmaps", +] + +[[package]] +name = "imbl-value" +version = "0.1.0" +source = "git+https://github.com/Start9Labs/imbl-value.git#929395141c3a882ac366c12ac9402d0ebaa2201b" +dependencies = [ + "imbl", + "serde", + "serde_json", + "treediff", + "yasi", ] [[package]] @@ -1566,20 +1462,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "internment" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161079c3ad892faa215fcfcf3fd7a6a3c9288df2b06a2c2bad7fbfad4f01d69d" -dependencies = [ - "ahash 0.7.6", - "dashmap", - "hashbrown 0.12.3", - "once_cell", - "parking_lot 0.12.1", - "serde", -] - [[package]] name = "io-lifetimes" version = "1.0.11" @@ -1668,9 +1550,9 @@ dependencies = [ name = "json-patch" version = "0.2.7-alpha.0" dependencies = [ + "imbl-value", "json-ptr", "serde", - "serde_json", "treediff", ] @@ -1678,8 +1560,9 @@ dependencies = [ name = "json-ptr" version = "0.1.0" dependencies = [ + "imbl", + "imbl-value", "serde", - "serde_json", "thiserror", ] @@ -1893,6 +1776,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -1929,11 +1821,10 @@ dependencies = [ name = "models" version = "0.1.0" dependencies = [ - "bollard", + "base64 0.21.2", "color-eyre", "ed25519-dalek", "emver", - "internment", "ipnet", "lazy_static", "mbrman", @@ -1941,6 +1832,7 @@ dependencies = [ "patch-db", "rand 0.8.5", "regex", + "reqwest", "rpc-toolkit", "serde", "serde_json", @@ -1950,6 +1842,7 @@ dependencies = [ "tokio", "torut", "tracing", + "yasi", ] [[package]] @@ -1976,19 +1869,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -[[package]] -name = "nix" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if", - "libc", - "memoffset", -] - [[package]] name = "nix" version = "0.24.3" @@ -1998,7 +1878,7 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset", + "memoffset 0.6.5", ] [[package]] @@ -2011,10 +1891,24 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset", + "memoffset 0.6.5", "pin-utils", ] +[[package]] +name = "nix" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", + "static_assertions", +] + [[package]] name = "nom" version = "7.1.3" @@ -2282,19 +2176,19 @@ dependencies = [ "async-trait", "fd-lock-rs", "futures", - "imbl 1.0.1", + "imbl", + "imbl-value", "json-patch", "json-ptr", "lazy_static", - "nix 0.23.2", + "nix 0.26.2", "patch-db-macro", "serde", "serde_cbor 0.11.1", - "serde_json", "thiserror", "tokio", "tracing", - "tracing-error 0.1.2", + "tracing-error", ] [[package]] @@ -2310,7 +2204,7 @@ dependencies = [ name = "patch-db-macro-internals" version = "0.1.0" dependencies = [ - "heck 0.3.3", + "heck", "proc-macro2", "quote", "syn 1.0.109", @@ -3085,28 +2979,6 @@ dependencies = [ "v8", ] -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "serde", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "sha-1" version = "0.10.0" @@ -3199,16 +3071,6 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps 2.1.0", - "typenum", -] - [[package]] name = "slab" version = "0.4.8" @@ -3368,7 +3230,7 @@ checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9" dependencies = [ "dotenvy", "either", - "heck 0.4.1", + "heck", "hex", "once_cell", "proc-macro2", @@ -3517,7 +3379,7 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "quote", "rustversion", @@ -4136,16 +3998,6 @@ dependencies = [ "valuable", ] -[[package]] -name = "tracing-error" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d7c0b83d4a500748fa5879461652b361edf5c9d51ede2a2ac03875ca185e24" -dependencies = [ - "tracing", - "tracing-subscriber 0.2.25", -] - [[package]] name = "tracing-error" version = "0.2.0" @@ -4153,7 +4005,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" dependencies = [ "tracing", - "tracing-subscriber 0.3.17", + "tracing-subscriber", ] [[package]] @@ -4177,17 +4029,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "sharded-slab", - "thread_local", - "tracing-core", -] - [[package]] name = "tracing-subscriber" version = "0.3.17" @@ -4695,6 +4536,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "yasi" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f355ab62ebe30b758c1f4ab096a306722c4b7dbfb9d8c07d18c70d71a945588" +dependencies = [ + "ahash 0.8.3", + "hashbrown 0.13.2", + "lazy_static", + "serde", +] + [[package]] name = "zeroize" version = "1.6.0" diff --git a/libs/embassy_container_init/src/main.rs b/libs/embassy_container_init/src/main.rs index 705fa085f..7ac72ca77 100644 --- a/libs/embassy_container_init/src/main.rs +++ b/libs/embassy_container_init/src/main.rs @@ -5,7 +5,8 @@ use std::process::Stdio; use std::sync::Arc; use embassy_container_init::{ - LogParams, OutputParams, OutputStrategy, ProcessGroupId, ProcessId, RunCommandParams, SendSignalParams, SignalGroupParams, + LogParams, OutputParams, OutputStrategy, ProcessGroupId, ProcessId, RunCommandParams, + SendSignalParams, SignalGroupParams, }; use futures::StreamExt; use helpers::NonDetachingJoinHandle; @@ -14,7 +15,7 @@ use nix::sys::signal::Signal; use serde::{Deserialize, Serialize}; use serde_json::json; use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; -use tokio::process::{Child, Command}; +use tokio::process::{Child, Command}; use tokio::select; use tokio::sync::{watch, Mutex}; use yajrc::{Id, RpcError}; @@ -102,7 +103,7 @@ impl Handler { // Input::ReadLineStderr(ReadLineStderrParams { pid }) => { // Output::ReadLineStderr(self.read_line_stderr(pid).await?) // } - Input::Log(LogParams { gid, level }) => { + Input::Log(LogParams { gid: _, level }) => { level.trace(); Output::Log } @@ -362,23 +363,23 @@ async fn main() { let req = serde_json::from_str::(&line?)?; match handler.handle(req.input).await { Ok(output) => { - if let Err(err) = w.lock().await.write_all( + if w.lock().await.write_all( format!("{}\n", json!({ "id": req.id, "jsonrpc": "2.0", "result": output })) .as_bytes(), ) - .await { + .await.is_err() { tracing::error!("Error sending to {id:?}", id = req.id); } } Err(e) => - if let Err(err) = w + if w .lock() .await .write_all( format!("{}\n", json!({ "id": req.id, "jsonrpc": "2.0", "error": e })) .as_bytes(), ) - .await { + .await.is_err() { tracing::error!("Handle + Error sending to {id:?}", id = req.id); }, diff --git a/libs/helpers/src/lib.rs b/libs/helpers/src/lib.rs index d5893b0a1..b854f142c 100644 --- a/libs/helpers/src/lib.rs +++ b/libs/helpers/src/lib.rs @@ -1,9 +1,7 @@ +use std::future::Future; +use std::ops::{Deref, DerefMut}; use std::path::{Path, PathBuf}; use std::time::Duration; -use std::{ - future::Future, - ops::{Deref, DerefMut}, -}; use color_eyre::eyre::{eyre, Context, Error}; use futures::future::BoxFuture; diff --git a/libs/js_engine/Cargo.toml b/libs/js_engine/Cargo.toml index 7bf8c49f2..904a63fdb 100644 --- a/libs/js_engine/Cargo.toml +++ b/libs/js_engine/Cargo.toml @@ -8,8 +8,8 @@ edition = "2021" [dependencies] async-trait = "0.1.56" dashmap = "5.3.4" -deno_core = "0.195.0" -deno_ast = { version = "0.27.2", features = ["transpiling"] } +deno_core = "=0.195.0" +deno_ast = { version = "=0.27.2", features = ["transpiling"] } embassy_container_init = { path = "../embassy_container_init" } reqwest = { version = "0.11.11" } sha2 = "0.10.2" diff --git a/libs/models/Cargo.toml b/libs/models/Cargo.toml index 6362919f6..9a05f98b6 100644 --- a/libs/models/Cargo.toml +++ b/libs/models/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bollard = "0.13.0" +base64 = "0.21.0" color-eyre = "0.6.1" ed25519-dalek = { version = "1.0.1", features = ["serde"] } lazy_static = "1.4" @@ -14,7 +14,6 @@ mbrman = "0.5.0" emver = { version = "0.1", git = "https://github.com/Start9Labs/emver-rs.git", features = [ "serde", ] } -internment = { version = "0.7.0", features = ["arc", "serde"] } ipnet = "2.7.1" openssl = { version = "0.10.41", features = ["vendored"] } patch-db = { version = "*", path = "../../patch-db/patch-db", features = [ @@ -22,9 +21,10 @@ patch-db = { version = "*", path = "../../patch-db/patch-db", features = [ ] } rand = "0.8" regex = "1.7.1" +reqwest = "0.11.14" rpc-toolkit = "0.2.1" serde = { version = "1.0", features = ["derive", "rc"] } -serde_json = "1.0.82" +serde_json = "1.0" sqlx = { version = "0.6.0", features = [ "chrono", "offline", @@ -36,3 +36,4 @@ thiserror = "1.0" tokio = { version = "1", features = ["full"] } torut = "0.2.1" tracing = "0.1.35" +yasi = "0.1.2" diff --git a/libs/models/src/data_url.rs b/libs/models/src/data_url.rs new file mode 100644 index 000000000..e2141b15a --- /dev/null +++ b/libs/models/src/data_url.rs @@ -0,0 +1,171 @@ +use std::borrow::Cow; +use std::path::Path; + +use base64::Engine; +use color_eyre::eyre::eyre; +use reqwest::header::CONTENT_TYPE; +use serde::{Deserialize, Serialize}; +use tokio::io::{AsyncRead, AsyncReadExt}; +use yasi::InternedString; + +use crate::{mime, Error, ErrorKind, ResultExt}; + +#[derive(Clone)] +pub struct DataUrl<'a> { + mime: InternedString, + data: Cow<'a, [u8]>, +} +impl<'a> DataUrl<'a> { + pub const DEFAULT_MIME: &'static str = "application/octet-stream"; + pub const MAX_SIZE: u64 = 100 * 1024; + + // data:{mime};base64,{data} + pub fn to_string(&self) -> String { + use std::fmt::Write; + let mut res = String::with_capacity(self.data_url_len_without_mime() + self.mime.len()); + let _ = write!(res, "data:{};base64,", self.mime); + base64::engine::general_purpose::STANDARD.encode_string(&self.data, &mut res); + res + } + + fn data_url_len_without_mime(&self) -> usize { + 5 + 8 + (4 * self.data.len() / 3) + 3 + } + + pub fn data_url_len(&self) -> usize { + self.data_url_len_without_mime() + self.mime.len() + } + + pub fn from_slice(mime: &str, data: &'a [u8]) -> Self { + Self { + mime: InternedString::intern(mime), + data: Cow::Borrowed(data), + } + } +} +impl DataUrl<'static> { + pub async fn from_reader( + mime: &str, + rdr: impl AsyncRead + Unpin, + size_est: Option, + ) -> Result { + let check_size = |s| { + if s > Self::MAX_SIZE { + Err(Error::new( + eyre!("Data URLs must be smaller than 100KiB"), + ErrorKind::Filesystem, + )) + } else { + Ok(s) + } + }; + let mut buf = size_est + .map(check_size) + .transpose()? + .map(|s| Vec::with_capacity(s as usize)) + .unwrap_or_default(); + rdr.take(Self::MAX_SIZE + 1).read_to_end(&mut buf).await?; + check_size(buf.len() as u64)?; + + Ok(Self { + mime: InternedString::intern(mime), + data: Cow::Owned(buf), + }) + } + + pub async fn from_path(path: impl AsRef) -> Result { + let path = path.as_ref(); + let f = tokio::fs::File::open(path).await?; + let m = f.metadata().await?; + let mime = path + .extension() + .and_then(|s| s.to_str()) + .and_then(mime) + .unwrap_or(Self::DEFAULT_MIME); + Self::from_reader(mime, f, Some(m.len())).await + } + + pub async fn from_response(res: reqwest::Response) -> Result { + let mime = InternedString::intern( + res.headers() + .get(CONTENT_TYPE) + .and_then(|h| h.to_str().ok()) + .unwrap_or(Self::DEFAULT_MIME), + ); + let data = res.bytes().await.with_kind(ErrorKind::Network)?.to_vec(); + Ok(Self { + mime, + data: Cow::Owned(data), + }) + } + + pub fn from_vec(mime: &str, data: Vec) -> Self { + Self { + mime: InternedString::intern(mime), + data: Cow::Owned(data), + } + } +} + +impl<'a> std::fmt::Debug for DataUrl<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&self.to_string()) + } +} + +impl<'de> Deserialize<'de> for DataUrl<'static> { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + struct Visitor; + impl<'de> serde::de::Visitor<'de> for Visitor { + type Value = DataUrl<'static>; + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(formatter, "a valid base64 data url") + } + fn visit_str(self, v: &str) -> Result + where + E: serde::de::Error, + { + v.strip_prefix("data:") + .and_then(|v| v.split_once(";base64,")) + .and_then(|(mime, data)| { + Some(DataUrl { + mime: InternedString::intern(mime), + data: Cow::Owned( + base64::engine::general_purpose::STANDARD + .decode(data) + .ok()?, + ), + }) + }) + .ok_or_else(|| { + E::invalid_value(serde::de::Unexpected::Str(v), &"a valid base64 data url") + }) + } + } + deserializer.deserialize_any(Visitor) + } +} + +impl<'a> Serialize for DataUrl<'a> { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +#[test] +fn doesnt_reallocate() { + let random: [u8; 10] = rand::random(); + for i in 0..10 { + let icon = DataUrl { + mime: InternedString::intern("png"), + data: Cow::Borrowed(&random[..i]), + }; + assert_eq!(dbg!(icon.to_string()).capacity(), icon.data_url_len()); + } +} diff --git a/libs/models/src/errors.rs b/libs/models/src/errors.rs index c429ccd7c..b0d786830 100644 --- a/libs/models/src/errors.rs +++ b/libs/models/src/errors.rs @@ -235,19 +235,14 @@ impl From for Error { Error::new(e, ErrorKind::InvalidSignature) } } -impl From for Error { - fn from(e: bollard::errors::Error) -> Self { - Error::new(e, ErrorKind::Docker) +impl From for Error { + fn from(e: std::net::AddrParseError) -> Self { + Error::new(e, ErrorKind::ParseNetAddress) } } impl From for Error { fn from(e: torut::control::ConnError) -> Self { - Error::new(eyre!("{:?}", e), ErrorKind::Tor) - } -} -impl From for Error { - fn from(e: std::net::AddrParseError) -> Self { - Error::new(e, ErrorKind::ParseNetAddress) + Error::new(e, ErrorKind::Tor) } } impl From for Error { @@ -275,6 +270,23 @@ impl From for Error { Error::new(e, ErrorKind::OpenSsh) } } +impl From for Error { + fn from(e: reqwest::Error) -> Self { + Error::new(e, ErrorKind::Network) + } +} +impl From for Error { + fn from(value: patch_db::value::Error) -> Self { + match value.kind { + patch_db::value::ErrorKind::Serialization => { + Error::new(value.source, ErrorKind::Serialization) + } + patch_db::value::ErrorKind::Deserialization => { + Error::new(value.source, ErrorKind::Deserialization) + } + } + } +} impl From for RpcError { fn from(e: Error) -> Self { @@ -388,6 +400,18 @@ where } } +pub trait OptionExt +where + Self: Sized, +{ + fn or_not_found(self, message: impl std::fmt::Display) -> Result; +} +impl OptionExt for Option { + fn or_not_found(self, message: impl std::fmt::Display) -> Result { + self.ok_or_else(|| Error::new(eyre!("{}", message), ErrorKind::NotFound)) + } +} + #[macro_export] macro_rules! ensure_code { ($x:expr, $c:expr, $fmt:expr $(, $arg:expr)*) => { diff --git a/libs/models/src/action_id.rs b/libs/models/src/id/action.rs similarity index 100% rename from libs/models/src/action_id.rs rename to libs/models/src/id/action.rs diff --git a/libs/models/src/id/address.rs b/libs/models/src/id/address.rs new file mode 100644 index 000000000..1bd670525 --- /dev/null +++ b/libs/models/src/id/address.rs @@ -0,0 +1,59 @@ +use std::path::Path; + +use serde::{Deserialize, Deserializer, Serialize}; + +use crate::Id; + +#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)] +pub struct AddressId(Id); +impl From for AddressId { + fn from(id: Id) -> Self { + Self(id) + } +} +impl std::fmt::Display for AddressId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", &self.0) + } +} +impl std::ops::Deref for AddressId { + type Target = str; + fn deref(&self) -> &Self::Target { + &*self.0 + } +} +impl AsRef for AddressId { + fn as_ref(&self) -> &str { + self.0.as_ref() + } +} +impl<'de> Deserialize<'de> for AddressId { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + Ok(AddressId(Deserialize::deserialize(deserializer)?)) + } +} +impl AsRef for AddressId { + fn as_ref(&self) -> &Path { + self.0.as_ref().as_ref() + } +} +impl<'q> sqlx::Encode<'q, sqlx::Postgres> for AddressId { + fn encode_by_ref( + &self, + buf: &mut >::ArgumentBuffer, + ) -> sqlx::encode::IsNull { + <&str as sqlx::Encode<'q, sqlx::Postgres>>::encode_by_ref(&&**self, buf) + } +} +impl sqlx::Type for AddressId { + fn type_info() -> sqlx::postgres::PgTypeInfo { + <&str as sqlx::Type>::type_info() + } + + fn compatible(ty: &sqlx::postgres::PgTypeInfo) -> bool { + <&str as sqlx::Type>::compatible(ty) + } +} diff --git a/libs/models/src/health_check_id.rs b/libs/models/src/id/health_check.rs similarity index 100% rename from libs/models/src/health_check_id.rs rename to libs/models/src/id/health_check.rs diff --git a/libs/models/src/image_id.rs b/libs/models/src/id/image.rs similarity index 100% rename from libs/models/src/image_id.rs rename to libs/models/src/id/image.rs diff --git a/libs/models/src/interface_id.rs b/libs/models/src/id/interface.rs similarity index 61% rename from libs/models/src/interface_id.rs rename to libs/models/src/id/interface.rs index b2f82f83c..d062a3648 100644 --- a/libs/models/src/interface_id.rs +++ b/libs/models/src/id/interface.rs @@ -17,7 +17,7 @@ impl std::fmt::Display for InterfaceId { } } impl std::ops::Deref for InterfaceId { - type Target = String; + type Target = str; fn deref(&self) -> &Self::Target { &*self.0 } @@ -40,3 +40,20 @@ impl AsRef for InterfaceId { self.0.as_ref().as_ref() } } +impl<'q> sqlx::Encode<'q, sqlx::Postgres> for InterfaceId { + fn encode_by_ref( + &self, + buf: &mut >::ArgumentBuffer, + ) -> sqlx::encode::IsNull { + <&str as sqlx::Encode<'q, sqlx::Postgres>>::encode_by_ref(&&**self, buf) + } +} +impl sqlx::Type for InterfaceId { + fn type_info() -> sqlx::postgres::PgTypeInfo { + <&str as sqlx::Type>::type_info() + } + + fn compatible(ty: &sqlx::postgres::PgTypeInfo) -> bool { + <&str as sqlx::Type>::compatible(ty) + } +} diff --git a/libs/models/src/invalid_id.rs b/libs/models/src/id/invalid_id.rs similarity index 100% rename from libs/models/src/invalid_id.rs rename to libs/models/src/id/invalid_id.rs diff --git a/libs/models/src/id.rs b/libs/models/src/id/mod.rs similarity index 53% rename from libs/models/src/id.rs rename to libs/models/src/id/mod.rs index 30a1818ec..ac32ceb22 100644 --- a/libs/models/src/id.rs +++ b/libs/models/src/id/mod.rs @@ -1,21 +1,37 @@ use std::borrow::Borrow; -use internment::ArcIntern; use regex::Regex; use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use yasi::InternedString; -use crate::invalid_id::InvalidId; +mod action; +mod address; +mod health_check; +mod image; +mod interface; +mod invalid_id; +mod package; +mod volume; + +pub use action::ActionId; +pub use address::AddressId; +pub use health_check::HealthCheckId; +pub use image::ImageId; +pub use interface::InterfaceId; +pub use invalid_id::InvalidId; +pub use package::{PackageId, SYSTEM_PACKAGE_ID}; +pub use volume::VolumeId; lazy_static::lazy_static! { static ref ID_REGEX: Regex = Regex::new("^[a-z]+(-[a-z]+)*$").unwrap(); - pub static ref SYSTEM_ID: Id = Id(ArcIntern::from_ref("x_system")); + pub static ref SYSTEM_ID: Id = Id(InternedString::intern("x_system")); } #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] -pub struct Id(ArcIntern); -impl TryFrom> for Id { +pub struct Id(InternedString); +impl TryFrom for Id { type Error = InvalidId; - fn try_from(value: ArcIntern) -> Result { + fn try_from(value: InternedString) -> Result { if ID_REGEX.is_match(&*value) { Ok(Id(value)) } else { @@ -27,7 +43,7 @@ impl TryFrom for Id { type Error = InvalidId; fn try_from(value: String) -> Result { if ID_REGEX.is_match(&value) { - Ok(Id(ArcIntern::new(value))) + Ok(Id(InternedString::intern(value))) } else { Err(InvalidId) } @@ -37,14 +53,14 @@ impl TryFrom<&str> for Id { type Error = InvalidId; fn try_from(value: &str) -> Result { if ID_REGEX.is_match(&value) { - Ok(Id(ArcIntern::from_ref(value))) + Ok(Id(InternedString::intern(value))) } else { Err(InvalidId) } } } impl std::ops::Deref for Id { - type Target = String; + type Target = str; fn deref(&self) -> &Self::Target { &*self.0 } @@ -69,7 +85,7 @@ impl<'de> Deserialize<'de> for Id { where D: Deserializer<'de>, { - let unchecked: String = Deserialize::deserialize(deserializer)?; + let unchecked: InternedString = Deserialize::deserialize(deserializer)?; Id::try_from(unchecked).map_err(serde::de::Error::custom) } } @@ -78,6 +94,23 @@ impl Serialize for Id { where Ser: Serializer, { - serializer.serialize_str(self.as_ref()) + serializer.serialize_str(&*self) + } +} +impl<'q> sqlx::Encode<'q, sqlx::Postgres> for Id { + fn encode_by_ref( + &self, + buf: &mut >::ArgumentBuffer, + ) -> sqlx::encode::IsNull { + <&str as sqlx::Encode<'q, sqlx::Postgres>>::encode_by_ref(&&**self, buf) + } +} +impl sqlx::Type for Id { + fn type_info() -> sqlx::postgres::PgTypeInfo { + <&str as sqlx::Type>::type_info() + } + + fn compatible(ty: &sqlx::postgres::PgTypeInfo) -> bool { + <&str as sqlx::Type>::compatible(ty) } } diff --git a/libs/models/src/package_id.rs b/libs/models/src/id/package.rs similarity index 73% rename from libs/models/src/package_id.rs rename to libs/models/src/id/package.rs index 9b534a4f5..14c29d88b 100644 --- a/libs/models/src/package_id.rs +++ b/libs/models/src/id/package.rs @@ -23,7 +23,7 @@ impl From for PackageId { } } impl std::ops::Deref for PackageId { - type Target = String; + type Target = str; fn deref(&self) -> &Self::Target { &*self.0 } @@ -69,3 +69,20 @@ impl Serialize for PackageId { Serialize::serialize(&self.0, serializer) } } +impl<'q> sqlx::Encode<'q, sqlx::Postgres> for PackageId { + fn encode_by_ref( + &self, + buf: &mut >::ArgumentBuffer, + ) -> sqlx::encode::IsNull { + <&str as sqlx::Encode<'q, sqlx::Postgres>>::encode_by_ref(&&**self, buf) + } +} +impl sqlx::Type for PackageId { + fn type_info() -> sqlx::postgres::PgTypeInfo { + <&str as sqlx::Type>::type_info() + } + + fn compatible(ty: &sqlx::postgres::PgTypeInfo) -> bool { + <&str as sqlx::Type>::compatible(ty) + } +} diff --git a/libs/models/src/volume_id.rs b/libs/models/src/id/volume.rs similarity index 100% rename from libs/models/src/volume_id.rs rename to libs/models/src/id/volume.rs diff --git a/libs/models/src/lib.rs b/libs/models/src/lib.rs index 01edd65e8..ad9055f24 100644 --- a/libs/models/src/lib.rs +++ b/libs/models/src/lib.rs @@ -1,23 +1,13 @@ -mod action_id; +mod data_url; mod errors; -mod health_check_id; mod id; -mod image_id; -mod interface_id; -mod invalid_id; -mod package_id; +mod mime; mod procedure_name; mod version; -mod volume_id; -pub use action_id::*; +pub use data_url::*; pub use errors::*; -pub use health_check_id::*; pub use id::*; -pub use image_id::*; -pub use interface_id::*; -pub use invalid_id::*; -pub use package_id::*; +pub use mime::*; pub use procedure_name::*; pub use version::*; -pub use volume_id::*; diff --git a/libs/models/src/mime.rs b/libs/models/src/mime.rs new file mode 100644 index 000000000..ea02473d7 --- /dev/null +++ b/libs/models/src/mime.rs @@ -0,0 +1,47 @@ +pub fn mime(extension: &str) -> Option<&'static str> { + match extension { + "apng" => Some("image/apng"), + "avif" => Some("image/avif"), + "flif" => Some("image/flif"), + "gif" => Some("image/gif"), + "jpg" | "jpeg" | "jfif" | "pjpeg" | "pjp" => Some("image/jpeg"), + "jxl" => Some("image/jxl"), + "png" => Some("image/png"), + "svg" => Some("image/svg+xml"), + "webp" => Some("image/webp"), + "mng" | "x-mng" => Some("image/x-mng"), + "css" => Some("text/css"), + "csv" => Some("text/csv"), + "html" => Some("text/html"), + "php" => Some("text/php"), + "plain" | "md" | "txt" => Some("text/plain"), + "xml" => Some("text/xml"), + "js" => Some("text/javascript"), + "wasm" => Some("application/wasm"), + _ => None, + } +} + +pub fn unmime(mime: &str) -> Option<&'static str> { + match mime { + "image/apng" => Some("apng"), + "image/avif" => Some("avif"), + "image/flif" => Some("flif"), + "image/gif" => Some("gif"), + "jpg" | "jpeg" | "jfif" | "pjpeg" | "image/jpeg" => Some("pjp"), + "image/jxl" => Some("jxl"), + "image/png" => Some("png"), + "image/svg+xml" => Some("svg"), + "image/webp" => Some("webp"), + "mng" | "image/x-mng" => Some("x-mng"), + "text/css" => Some("css"), + "text/csv" => Some("csv"), + "text/html" => Some("html"), + "text/php" => Some("php"), + "plain" | "md" | "text/plain" => Some("txt"), + "text/xml" => Some("xml"), + "text/javascript" => Some("js"), + "application/wasm" => Some("wasm"), + _ => None, + } +} diff --git a/libs/models/src/version.rs b/libs/models/src/version.rs index 82b577820..1e4798ba1 100644 --- a/libs/models/src/version.rs +++ b/libs/models/src/version.rs @@ -2,7 +2,6 @@ use std::hash::{Hash, Hasher}; use std::ops::Deref; use std::str::FromStr; -use patch_db::{HasModel, Model}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; #[derive(Debug, Clone)] @@ -105,6 +104,3 @@ impl Serialize for Version { self.string.serialize(serializer) } } -impl HasModel for Version { - type Model = Model; -} diff --git a/patch-db b/patch-db index 85959db11..b553ff7b5 160000 --- a/patch-db +++ b/patch-db @@ -1 +1 @@ -Subproject commit 85959db110dfdddefdc9bef1e8f2013acf32d23f +Subproject commit b553ff7b5304c77acd886a0a87e65a01ce91790a diff --git a/system-images/compat/Cargo.lock b/system-images/compat/Cargo.lock index bfa86c907..3e05e0d4b 100644 --- a/system-images/compat/Cargo.lock +++ b/system-images/compat/Cargo.lock @@ -41,6 +41,18 @@ dependencies = [ "version_check", ] +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "getrandom 0.2.8", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "0.7.20" @@ -292,15 +304,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - [[package]] name = "bitmaps" version = "3.2.0" @@ -355,44 +358,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" -[[package]] -name = "bollard" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82e7850583ead5f8bbef247e2a3c37a19bd576e8420cd262a6711921827e1e5" -dependencies = [ - "base64 0.13.1", - "bollard-stubs", - "bytes", - "futures-core", - "futures-util", - "hex", - "http", - "hyper", - "hyperlocal", - "log", - "pin-project-lite", - "serde", - "serde_derive", - "serde_json", - "serde_urlencoded", - "thiserror", - "tokio", - "tokio-util", - "url", - "winapi", -] - -[[package]] -name = "bollard-stubs" -version = "1.42.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed59b5c00048f48d7af971b71f800fdf23e858844a6f9e4d32ca72e9399e7864" -dependencies = [ - "serde", - "serde_with 1.14.0", -] - [[package]] name = "brotli" version = "3.3.4" @@ -484,7 +449,7 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23170228b96236b5a7299057ac284a321457700bc8c41a4476052f0f4ba5349d" dependencies = [ - "hashbrown", + "hashbrown 0.12.3", ] [[package]] @@ -584,7 +549,7 @@ dependencies = [ "indenter", "once_cell", "owo-colors", - "tracing-error 0.2.0", + "tracing-error", ] [[package]] @@ -596,7 +561,7 @@ dependencies = [ "once_cell", "owo-colors", "tracing-core", - "tracing-error 0.2.0", + "tracing-error", ] [[package]] @@ -609,6 +574,7 @@ dependencies = [ "dashmap", "emver", "failure", + "imbl-value", "indexmap", "itertools 0.10.5", "lazy_static", @@ -905,38 +871,14 @@ dependencies = [ "syn 1.0.107", ] -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", -] - [[package]] name = "darling" version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0dd3cd20dc6b5a876612a6e5accfe7f3dd883db6d07acfbf14c128f61550dfa" dependencies = [ - "darling_core 0.14.2", - "darling_macro 0.14.2", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2 1.0.50", - "quote 1.0.23", - "strsim 0.10.0", - "syn 1.0.107", + "darling_core", + "darling_macro", ] [[package]] @@ -953,24 +895,13 @@ dependencies = [ "syn 1.0.107", ] -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core 0.13.4", - "quote 1.0.23", - "syn 1.0.107", -] - [[package]] name = "darling_macro" version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7618812407e9402654622dd402b0a89dff9ba93badd6540781526117b92aab7e" dependencies = [ - "darling_core 0.14.2", + "darling_core", "quote 1.0.23", "syn 1.0.107", ] @@ -982,7 +913,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ "cfg-if", - "hashbrown", + "hashbrown 0.12.3", "lock_api", "once_cell", "parking_lot_core 0.9.6", @@ -1192,7 +1123,7 @@ dependencies = [ "color-eyre", "futures", "helpers", - "imbl 2.0.0", + "imbl", "nix 0.25.1", "procfs", "serde", @@ -1200,9 +1131,9 @@ dependencies = [ "tokio", "tokio-stream", "tracing", - "tracing-error 0.2.0", + "tracing-error", "tracing-futures", - "tracing-subscriber 0.3.16", + "tracing-subscriber", "yajrc 0.1.0 (git+https://github.com/dr-bonez/yajrc.git?branch=develop)", ] @@ -1253,7 +1184,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ - "heck 0.4.0", + "heck", "proc-macro2 1.0.50", "quote 1.0.23", "syn 1.0.107", @@ -1646,7 +1577,16 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash", + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", ] [[package]] @@ -1655,23 +1595,14 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" dependencies = [ - "hashbrown", + "hashbrown 0.12.3", ] [[package]] name = "heck" -version = "0.3.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "heck" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" dependencies = [ "unicode-segmentation", ] @@ -1851,19 +1782,6 @@ dependencies = [ "tokio-tungstenite", ] -[[package]] -name = "hyperlocal" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c" -dependencies = [ - "futures-util", - "hex", - "hyper", - "pin-project", - "tokio", -] - [[package]] name = "iana-time-zone" version = "0.1.53" @@ -1915,30 +1833,17 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "imbl" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "543682c9082b25e63d03b5acbd65ad111fd49dd93e70843e5175db4ff81d606b" -dependencies = [ - "bitmaps 2.1.0", - "rand_core 0.6.4", - "rand_xoshiro", - "sized-chunks", - "typenum", - "version_check", -] - [[package]] name = "imbl" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2806b69cd9f4664844027b64465eacb444c67c1db9c778e341adff0c25cdb0d" dependencies = [ - "bitmaps 3.2.0", + "bitmaps", "imbl-sized-chunks", "rand_core 0.6.4", "rand_xoshiro", + "serde", "version_check", ] @@ -1948,7 +1853,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6957ea0b2541c5ca561d3ef4538044af79f8a05a1eb3a3b148936aaceaa1076" dependencies = [ - "bitmaps 3.2.0", + "bitmaps", +] + +[[package]] +name = "imbl-value" +version = "0.1.0" +source = "git+https://github.com/Start9Labs/imbl-value.git#929395141c3a882ac366c12ac9402d0ebaa2201b" +dependencies = [ + "imbl", + "serde", + "serde_json", + "treediff", + "yasi", ] [[package]] @@ -1983,7 +1900,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", "serde", ] @@ -1996,20 +1913,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "internment" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a798d7677f07d6f1e77be484ea8626ddb1566194de399f1206306820c406371" -dependencies = [ - "ahash", - "dashmap", - "hashbrown", - "once_cell", - "parking_lot 0.12.1", - "serde", -] - [[package]] name = "io-lifetimes" version = "1.0.4" @@ -2106,7 +2009,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb52eeac20f256459e909bd4a03bb8c4fab6a1fdbb8ed52d00f644152df48ece" dependencies = [ - "ahash", + "ahash 0.7.6", "dyn-clone", "hifijson", "indexmap", @@ -2169,9 +2072,9 @@ dependencies = [ name = "json-patch" version = "0.2.7-alpha.0" dependencies = [ + "imbl-value", "json-ptr", "serde", - "serde_json", "treediff", ] @@ -2179,17 +2082,18 @@ dependencies = [ name = "json-ptr" version = "0.1.0" dependencies = [ + "imbl", + "imbl-value", "serde", - "serde_json", "thiserror", ] [[package]] name = "jsonpath_lib" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" +source = "git+https://github.com/Start9Labs/jsonpath.git#1cacbd64afa2e1941a21fef06bad14317ba92f30" dependencies = [ + "imbl-value", "log", "serde", "serde_json", @@ -2380,6 +2284,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.16" @@ -2417,11 +2330,10 @@ dependencies = [ name = "models" version = "0.1.0" dependencies = [ - "bollard", + "base64 0.21.0", "color-eyre", "ed25519-dalek", "emver", - "internment", "ipnet", "lazy_static", "mbrman", @@ -2429,6 +2341,7 @@ dependencies = [ "patch-db", "rand 0.8.5", "regex", + "reqwest", "rpc-toolkit", "serde", "serde_json", @@ -2438,6 +2351,7 @@ dependencies = [ "tokio", "torut", "tracing", + "yasi", ] [[package]] @@ -2483,19 +2397,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "nix" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" -dependencies = [ - "bitflags", - "cc", - "cfg-if", - "libc", - "memoffset", -] - [[package]] name = "nix" version = "0.24.3" @@ -2505,7 +2406,7 @@ dependencies = [ "bitflags", "cfg-if", "libc", - "memoffset", + "memoffset 0.6.5", ] [[package]] @@ -2518,7 +2419,20 @@ dependencies = [ "bitflags", "cfg-if", "libc", - "memoffset", + "memoffset 0.6.5", + "pin-utils", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset 0.7.1", "pin-utils", ] @@ -2880,19 +2794,19 @@ dependencies = [ "async-trait", "fd-lock-rs", "futures", - "imbl 1.0.1", + "imbl", + "imbl-value", "json-patch", "json-ptr", "lazy_static", - "nix 0.23.2", + "nix 0.26.4", "patch-db-macro", "serde", "serde_cbor 0.11.1", - "serde_json", "thiserror", "tokio", "tracing", - "tracing-error 0.1.2", + "tracing-error", ] [[package]] @@ -2908,7 +2822,7 @@ dependencies = [ name = "patch-db-macro-internals" version = "0.1.0" dependencies = [ - "heck 0.3.3", + "heck", "proc-macro2 1.0.50", "quote 1.0.23", "syn 1.0.107", @@ -3400,11 +3314,11 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.13" +version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" +checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" dependencies = [ - "base64 0.13.1", + "base64 0.21.0", "bytes", "cookie", "cookie_store 0.16.1", @@ -3424,7 +3338,6 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "proc-macro-hack", "serde", "serde_json", "serde_urlencoded", @@ -3436,6 +3349,7 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", "winreg", ] @@ -3814,16 +3728,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "serde", - "serde_with_macros 1.5.2", -] - [[package]] name = "serde_with" version = "2.2.0" @@ -3836,29 +3740,17 @@ dependencies = [ "indexmap", "serde", "serde_json", - "serde_with_macros 2.2.0", + "serde_with_macros", "time 0.3.17", ] -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling 0.13.4", - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", -] - [[package]] name = "serde_with_macros" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1966009f3c05f095697c537312f5415d1e3ed31ce0a56942bac4c771c5c335e" dependencies = [ - "darling 0.14.2", + "darling", "proc-macro2 1.0.50", "quote 1.0.23", "syn 1.0.107", @@ -4002,16 +3894,6 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps 2.1.0", - "typenum", -] - [[package]] name = "slab" version = "0.4.7" @@ -4080,7 +3962,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105" dependencies = [ - "ahash", + "ahash 0.7.6", "atoi", "base64 0.13.1", "bitflags", @@ -4136,7 +4018,7 @@ checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" dependencies = [ "dotenvy", "either", - "heck 0.4.0", + "heck", "hex", "once_cell", "proc-macro2 1.0.50", @@ -4227,7 +4109,8 @@ dependencies = [ "http", "hyper", "hyper-ws-listener", - "imbl 2.0.0", + "imbl", + "imbl-value", "include_dir", "indexmap", "ipnet", @@ -4269,7 +4152,7 @@ dependencies = [ "scopeguard", "serde", "serde_json", - "serde_with 2.2.0", + "serde_with", "serde_yaml 0.9.16", "sha2 0.10.6", "sha2 0.9.9", @@ -4289,9 +4172,9 @@ dependencies = [ "toml", "torut", "tracing", - "tracing-error 0.2.0", + "tracing-error", "tracing-futures", - "tracing-subscriber 0.3.16", + "tracing-subscriber", "trust-dns-server", "typed-builder", "url", @@ -4742,16 +4625,6 @@ dependencies = [ "valuable", ] -[[package]] -name = "tracing-error" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d7c0b83d4a500748fa5879461652b361edf5c9d51ede2a2ac03875ca185e24" -dependencies = [ - "tracing", - "tracing-subscriber 0.2.25", -] - [[package]] name = "tracing-error" version = "0.2.0" @@ -4759,7 +4632,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" dependencies = [ "tracing", - "tracing-subscriber 0.3.16", + "tracing-subscriber", ] [[package]] @@ -4783,17 +4656,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "sharded-slab", - "thread_local", - "tracing-core", -] - [[package]] name = "tracing-subscriber" version = "0.3.16" @@ -5178,6 +5040,19 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +[[package]] +name = "wasm-streams" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.60" @@ -5254,13 +5129,13 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.42.1", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm 0.42.1", + "windows_x86_64_msvc 0.42.1", ] [[package]] @@ -5269,7 +5144,16 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] @@ -5278,13 +5162,28 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.42.1", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm 0.42.1", + "windows_x86_64_msvc 0.42.1", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -5293,36 +5192,72 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_i686_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_x86_64_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_msvc" version = "0.42.1" @@ -5330,12 +5265,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] -name = "winreg" -version = "0.10.1" +name = "windows_x86_64_msvc" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] @@ -5388,6 +5330,18 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yasi" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f355ab62ebe30b758c1f4ab096a306722c4b7dbfb9d8c07d18c70d71a945588" +dependencies = [ + "ahash 0.8.3", + "hashbrown 0.13.2", + "lazy_static", + "serde", +] + [[package]] name = "zeroize" version = "1.5.7" diff --git a/system-images/compat/Cargo.toml b/system-images/compat/Cargo.toml index 735667a36..199b7e1c5 100644 --- a/system-images/compat/Cargo.toml +++ b/system-images/compat/Cargo.toml @@ -17,6 +17,7 @@ emver = { version = "0.1.7", git = "https://github.com/Start9Labs/emver-rs.git", ] } failure = "0.1.8" indexmap = { version = "1.6.2", features = ["serde"] } +imbl-value = { git = "https://github.com/Start9Labs/imbl-value.git" } itertools = "0.10.0" lazy_static = "1.4" linear-map = { version = "1.2", features = ["serde_impl"] } diff --git a/system-images/compat/src/config/mod.rs b/system-images/compat/src/config/mod.rs index 89e4b9282..ce591b06a 100644 --- a/system-images/compat/src/config/mod.rs +++ b/system-images/compat/src/config/mod.rs @@ -79,7 +79,7 @@ pub fn validate_dependency_configuration( if let Some(config) = config { cfgs.insert(name, Cow::Borrowed(&config)) } else { - cfgs.insert(name, Cow::Owned(serde_json::Map::new())) + cfgs.insert(name, Cow::Owned(imbl_value::InOMap::new())) }; let rule_check = rules .into_iter() @@ -104,7 +104,7 @@ pub fn apply_dependency_configuration( cfgs.insert(dependency_id, Cow::Owned(dep_config.clone())); match config { Some(config) => cfgs.insert(package_id, Cow::Owned(config.clone())), - None => cfgs.insert(package_id, Cow::Owned(serde_json::Map::new())), + None => cfgs.insert(package_id, Cow::Owned(imbl_value::InOMap::new())), }; let rule_check = rules .into_iter() diff --git a/system-images/compat/src/config/rules.rs b/system-images/compat/src/config/rules.rs index ea2650237..a74ae195c 100644 --- a/system-images/compat/src/config/rules.rs +++ b/system-images/compat/src/config/rules.rs @@ -1,11 +1,11 @@ use std::borrow::Cow; use std::sync::Arc; +use imbl_value::{InternedString, Value}; use linear_map::LinearMap; use pest::iterators::Pairs; use pest::Parser; use rand::SeedableRng; -use serde_json::Value; use startos::config::util::STATIC_NULL; use startos::config::Config; @@ -382,7 +382,7 @@ fn compile_var_rec(mut ident: Pairs) -> Option { match idx.as_rule() { Rule::list_access_function_first => { let mut pred_iter = idx.into_inner(); - let item_var = pred_iter.next().unwrap().as_str().to_owned(); + let item_var: InternedString = pred_iter.next().unwrap().as_str().into(); let predicate = compile_bool_expr(pred_iter.next().unwrap().into_inner()); Box::new(move |v, cfgs| match v { Value::Array(l) => VarRes::Exactly( @@ -411,7 +411,7 @@ fn compile_var_rec(mut ident: Pairs) -> Option { } Rule::list_access_function_last => { let mut pred_iter = idx.into_inner(); - let item_var = pred_iter.next().unwrap().as_str().to_owned(); + let item_var: InternedString = pred_iter.next().unwrap().as_str().into(); let predicate = compile_bool_expr(pred_iter.next().unwrap().into_inner()); Box::new(move |v, cfgs| match v { Value::Array(l) => VarRes::Exactly( @@ -440,7 +440,7 @@ fn compile_var_rec(mut ident: Pairs) -> Option { } Rule::list_access_function_any => { let mut pred_iter = idx.into_inner(); - let item_var = pred_iter.next().unwrap().as_str().to_owned(); + let item_var: InternedString = pred_iter.next().unwrap().as_str().into(); let predicate = compile_bool_expr(pred_iter.next().unwrap().into_inner()); Box::new(move |v, cfgs| match v { Value::Array(l) => VarRes::Any( @@ -469,7 +469,7 @@ fn compile_var_rec(mut ident: Pairs) -> Option { } Rule::list_access_function_all => { let mut pred_iter = idx.into_inner(); - let item_var = pred_iter.next().unwrap().as_str().to_owned(); + let item_var: InternedString = pred_iter.next().unwrap().as_str().into(); let predicate = compile_bool_expr(pred_iter.next().unwrap().into_inner()); Box::new(move |v, cfgs| match v { Value::Array(l) => VarRes::All( @@ -506,7 +506,7 @@ fn compile_var_rec(mut ident: Pairs) -> Option { let idx = idx.as_str().to_owned(); Box::new(move |v, _| match v { Value::Object(o) => { - VarRes::Exactly(o.get(&idx).unwrap_or(&STATIC_NULL)) + VarRes::Exactly(o.get(&*idx).unwrap_or(&STATIC_NULL)) } _ => VarRes::Exactly(&STATIC_NULL), }) @@ -514,8 +514,9 @@ fn compile_var_rec(mut ident: Pairs) -> Option { Rule::sub_ident_regular_expr => { let idx = compile_str_expr(idx.into_inner().next().unwrap().into_inner()); Box::new(move |v, dep_cfg| match v { - Value::Object(o) => idx(&Config::default(), dep_cfg) - .map(|idx| idx.and_then(|idx| o.get(&idx)).unwrap_or(&STATIC_NULL)), + Value::Object(o) => idx(&Config::default(), dep_cfg).map(|idx| { + idx.and_then(|idx| o.get(&*idx)).unwrap_or(&STATIC_NULL) + }), _ => VarRes::Exactly(&STATIC_NULL), }) } @@ -575,7 +576,7 @@ fn compile_var(mut var: Pairs) -> CompiledExpr> { return VarRes::Exactly(Value::Null); }; } - let val = cfg.get(&first_seg_string).unwrap_or(&STATIC_NULL); + let val = cfg.get(&*first_seg_string).unwrap_or(&STATIC_NULL); if let Some(accessor) = &accessor { accessor(val, cfgs).map(|v| v.clone()) } else { @@ -593,7 +594,7 @@ fn compile_var_mut_rec(mut ident: Pairs) -> Result, fa match idx.as_rule() { Rule::list_access_function_first => { let mut pred_iter = idx.into_inner(); - let item_var = pred_iter.next().unwrap().as_str().to_owned(); + let item_var: InternedString = pred_iter.next().unwrap().as_str().into(); let predicate = compile_bool_expr(pred_iter.next().unwrap().into_inner()); Box::new(move |v, cfgs| match v { Value::Array(l) => l @@ -618,7 +619,7 @@ fn compile_var_mut_rec(mut ident: Pairs) -> Result, fa } Rule::list_access_function_last => { let mut pred_iter = idx.into_inner(); - let item_var = pred_iter.next().unwrap().as_str().to_owned(); + let item_var: InternedString = pred_iter.next().unwrap().as_str().into(); let predicate = compile_bool_expr(pred_iter.next().unwrap().into_inner()); Box::new(move |v, cfgs| match v { Value::Array(l) => l @@ -651,14 +652,14 @@ fn compile_var_mut_rec(mut ident: Pairs) -> Result, fa let idx = idx.into_inner().next().unwrap(); match idx.as_rule() { Rule::sub_ident_regular_base => { - let idx = idx.as_str().to_owned(); + let idx: InternedString = idx.as_str().into(); Box::new(move |v, _| match v { Value::Object(ref mut o) => { - if o.contains_key(&idx) { - o.get_mut(&idx) + if o.contains_key(&*idx) { + o.get_mut(&*idx) } else { o.insert(idx.clone(), Value::Null); - o.get_mut(&idx) + o.get_mut(&*idx) } } _ => None, @@ -669,11 +670,11 @@ fn compile_var_mut_rec(mut ident: Pairs) -> Result, fa Box::new( move |v, dep_cfg| match (v, idx(&Config::default(), dep_cfg)) { (Value::Object(ref mut o), VarRes::Exactly(Some(ref idx))) => { - if o.contains_key(idx) { - o.get_mut(idx) + if o.contains_key(&**idx) { + o.get_mut(&**idx) } else { o.insert(idx.clone(), Value::Null); - o.get_mut(idx) + o.get_mut(&**idx) } } _ => None, @@ -693,7 +694,7 @@ fn compile_var_mut_rec(mut ident: Pairs) -> Result, fa if l.len() > idx { l.get_mut(idx) } else if idx == l.len() { - l.push(Value::Null); + l.push_back(Value::Null); l.get_mut(idx) } else { None @@ -711,7 +712,7 @@ fn compile_var_mut_rec(mut ident: Pairs) -> Result, fa if l.len() > idx { l.get_mut(idx) } else if idx == l.len() { - l.push(Value::Null); + l.push_back(Value::Null); l.get_mut(idx) } else { None @@ -741,11 +742,11 @@ fn compile_var_mut(mut var: Pairs) -> Result) -> CompiledRule { } } -fn compile_str_var(var: Pairs) -> CompiledExpr>> { +fn compile_str_var(var: Pairs) -> CompiledExpr>> { let var = compile_var(var); Box::new(move |cfg, cfgs| { var(cfg, cfgs).map(|a| match a { - Value::String(s) => Some(s), - Value::Number(n) => Some(format!("{}", n)), - Value::Bool(b) => Some(format!("{}", b)), + Value::String(s) => Some(InternedString::from(&*s)), + Value::Number(n) => Some(InternedString::from_display(&n)), + Value::Bool(b) => Some(InternedString::from_display(&b)), _ => None, }) }) } -fn compile_str(str_str: &str) -> CompiledExpr>> { +fn compile_str(str_str: &str) -> CompiledExpr>> { let str_str = &str_str[1..str_str.len() - 1]; let mut out = String::with_capacity(str_str.len()); let mut escape = false; @@ -904,11 +905,11 @@ fn compile_str(str_str: &str) -> CompiledExpr>> { } } } - let res = VarRes::Exactly(Some(out)); + let res = VarRes::Exactly(Some(out.into())); Box::new(move |_, _| res.clone()) } -fn compile_str_expr(pairs: Pairs) -> CompiledExpr>> { +fn compile_str_expr(pairs: Pairs) -> CompiledExpr>> { STR_PREC_CLIMBER.climb( pairs, |pair| match pair.as_rule() { @@ -921,9 +922,9 @@ fn compile_str_expr(pairs: Pairs) -> CompiledExpr>> Rule::add => Box::new(move |cfg, cfgs| { lhs(cfg, cfgs).and_then(|lhs| { rhs(cfg, cfgs).map(|rhs| { - let lhs = lhs.clone()?; + let lhs = lhs.as_ref()?.to_string(); let rhs = rhs?; - Some(lhs + &rhs) + Some(InternedString::from(lhs + &*rhs)) }) }) }), @@ -941,7 +942,7 @@ fn compile_str_cmp_expr(mut pairs: Pairs) -> CompiledRule { lhs(cfg, cfgs) .and_then(|lhs| { rhs(cfg, cfgs).map(|rhs| match (&lhs, &rhs) { - (Some(lhs), Some(rhs)) => rhs.contains(lhs) && lhs.len() < rhs.len(), + (Some(lhs), Some(rhs)) => rhs.contains(&**lhs) && lhs.len() < rhs.len(), _ => false, }) }) @@ -951,7 +952,7 @@ fn compile_str_cmp_expr(mut pairs: Pairs) -> CompiledRule { lhs(cfg, cfgs) .and_then(|lhs| { rhs(cfg, cfgs).map(|rhs| match (&lhs, &rhs) { - (Some(lhs), Some(rhs)) => rhs.contains(lhs), + (Some(lhs), Some(rhs)) => rhs.contains(&**lhs), _ => false, }) }) @@ -983,7 +984,7 @@ fn compile_str_cmp_expr(mut pairs: Pairs) -> CompiledRule { lhs(cfg, cfgs) .and_then(|lhs| { rhs(cfg, cfgs).map(|rhs| match (&lhs, &rhs) { - (Some(lhs), Some(rhs)) => lhs.contains(rhs) && lhs.len() > rhs.len(), + (Some(lhs), Some(rhs)) => lhs.contains(&**rhs) && lhs.len() > rhs.len(), _ => true, }) }) @@ -993,7 +994,7 @@ fn compile_str_cmp_expr(mut pairs: Pairs) -> CompiledRule { lhs(cfg, cfgs) .and_then(|lhs| { rhs(cfg, cfgs).map(|rhs| match (&lhs, &rhs) { - (Some(lhs), Some(rhs)) => lhs.contains(rhs), + (Some(lhs), Some(rhs)) => lhs.contains(&**rhs), _ => true, }) }) @@ -1037,7 +1038,10 @@ fn compile_value_expr(mut pairs: Pairs) -> CompiledExpr> { Rule::str_expr => { let expr = compile_str_expr(expr.into_inner()); Box::new(move |cfg, cfgs| { - expr(cfg, cfgs).map(|s| s.map(Value::String).unwrap_or(Value::Null)) + expr(cfg, cfgs).map(|s| { + s.map(|s| Value::String(Arc::new(s.to_string()))) + .unwrap_or(Value::Null) + }) }) } Rule::num_expr => { @@ -1059,7 +1063,7 @@ fn compile_value_expr(mut pairs: Pairs) -> CompiledExpr> { fn compile_del_action(mut pairs: Pairs) -> Result { let list_mut = compile_var_mut(pairs.next().unwrap().into_inner())?; - let var = pairs.next().unwrap().as_str().to_owned(); + let var: InternedString = pairs.next().unwrap().as_str().into(); let predicate = compile_bool_expr(pairs.next().unwrap().into_inner()); Ok(Box::new(move |cfg, cfgs| match (&list_mut)(cfg, cfgs) { Some(Value::Array(ref mut l)) => { @@ -1093,7 +1097,7 @@ fn compile_push_action(mut pairs: Pairs, value: Value) -> Result a, _ => return, }; - vec.push(value.clone()) + vec.push_back(value.clone()) })) } @@ -1122,7 +1126,9 @@ fn compile_set_action(var: &str, to: &SetVariant) -> Result