From 564be6112a5123d46013e5033bd36d2e625a5ef8 Mon Sep 17 00:00:00 2001 From: 0forks <114709761+0forks@users.noreply.github.com> Date: Wed, 18 Jan 2023 22:22:36 +0300 Subject: [PATCH] gui: More info in tracker table and IMU visualizer (#450) --- gui/package.json | 4 +- gui/public/i18n/en-x-owo/translation.ftl | 25 +- gui/public/i18n/en/translation.ftl | 25 +- gui/public/i18n/es-419/translation.ftl | 25 +- gui/public/i18n/fr/translation.ftl | 25 +- gui/public/i18n/it/translation.ftl | 25 +- gui/public/i18n/ja/translation.ftl | 25 +- gui/public/i18n/ko/translation.ftl | 25 +- gui/public/i18n/pl/translation.ftl | 25 +- gui/public/i18n/pt-BR/translation.ftl | 25 +- gui/public/i18n/vi/translation.ftl | 25 +- gui/public/i18n/zh-Hans/translation.ftl | 25 +- gui/src/components/MainLayout.tsx | 8 + .../components/commons/icon/WarningIcon.tsx | 17 + .../pages/mounting/ManualMounting.tsx | 9 +- gui/src/components/tracker/TrackerBattery.tsx | 15 +- gui/src/components/tracker/TrackerCard.tsx | 14 +- .../components/tracker/TrackerSettings.tsx | 55 +- gui/src/components/tracker/TrackerWifi.tsx | 17 +- gui/src/components/tracker/TrackersTable.tsx | 422 +- gui/src/components/utils/formatting.ts | 4 + .../widgets/DeveloperModeWidget.tsx | 83 + .../widgets/IMUVisualizerWidget.tsx | 169 + gui/src/components/widgets/OverlayWidget.tsx | 10 +- gui/src/hooks/app.ts | 23 +- gui/src/hooks/config.ts | 2 + gui/src/hooks/datafeed-config.ts | 37 + gui/src/hooks/tracker.ts | 84 +- gui/src/hooks/websocket-api.ts | 12 +- gui/src/maths/quaternion.ts | 80 +- gui/src/maths/vector3.ts | 16 + package-lock.json | 5216 ++++++++++++++++- 32 files changed, 6214 insertions(+), 358 deletions(-) create mode 100644 gui/src/components/commons/icon/WarningIcon.tsx create mode 100644 gui/src/components/widgets/DeveloperModeWidget.tsx create mode 100644 gui/src/components/widgets/IMUVisualizerWidget.tsx create mode 100644 gui/src/hooks/datafeed-config.ts create mode 100644 gui/src/maths/vector3.ts diff --git a/gui/package.json b/gui/package.json index 8f2ea4673..df805c7fc 100644 --- a/gui/package.json +++ b/gui/package.json @@ -7,6 +7,7 @@ "@fluent/react": "^0.14.1", "@fontsource/poppins": "^4.5.8", "@formatjs/intl-localematcher": "^0.2.32", + "@react-three/fiber": "^8.10.0", "@tauri-apps/api": "^1.2.0", "@vitejs/plugin-react": "^3.0.0", "browserslist": "^4.18.1", @@ -25,7 +26,6 @@ "postcss-normalize": "^10.0.1", "postcss-preset-env": "^7.0.1", "prompts": "^2.4.2", - "quaternion": "^1.4.0", "react": "^18.0.0", "react-dev-utils": "^12.0.0", "react-dom": "^18.0.0", @@ -34,6 +34,7 @@ "react-router-dom": "^6.2.2", "semver": "^7.3.5", "solarxr-protocol": "file:../solarxr-protocol", + "three": "^0.148.0", "typescript": "^4.6.3" }, "scripts": { @@ -71,6 +72,7 @@ "@types/react": "18.0.25", "@types/react-dom": "^18.0.5", "@types/react-modal": "3.13.1", + "@types/three": "^0.148.0", "@typescript-eslint/eslint-plugin": "^5.43.0", "@typescript-eslint/parser": "^5.43.0", "autoprefixer": "^10.4.4", diff --git a/gui/public/i18n/en-x-owo/translation.ftl b/gui/public/i18n/en-x-owo/translation.ftl index 21c3e7930..bad4fc00e 100644 --- a/gui/public/i18n/en-x-owo/translation.ftl +++ b/gui/public/i18n/en-x-owo/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = sewtings bvh-start_recording = wecowd bvh bvh-recording = wecowding... -## Overlay settings -overlay-is_visible_label = show owovelay in steawmvr -overlay-is_mirrored_label = dispway owovelay as miwwow +## Widget: Overlay settings +widget-overlay = owovelay +widget-overlay-is_visible_label = show owovelay in steawmvr +widget-overlay-is_mirrored_label = dispway owovelay as miwwow + +## Widget: Developer settings +widget-developer_mode = devwowwewow mode +widget-developer_mode-high_contrast = high contwast +widget-developer_mode-precise_rotation = pwecise wotation +widget-developer_mode-fast_data_feed = fast data feed +widget-developer_mode-filter_slimes_and_hmd = fiwtew swimes a-and HMD +widget-developer_mode-sort_by_name = sowt by nyame +widget-developer_mode-raw_slime_rotation = waw wotation +widget-developer_mode-more_info = mowe info + +## Widget: IMU Visualizer +widget-imu_visualizer = wotation +widget-imu_visualizer-rotation_raw = waw +widget-imu_visualizer-rotation_preview = pwewiew ## Tracker status tracker-status-none = no stawtus @@ -104,6 +120,9 @@ tracker-table-column-name = nayme tracker-table-column-type = type tracker-table-column-battery = battewy tracker-table-column-ping = pyng +tracker-table-column-tps = tps +tracker-table-column-temperature = temp. °C +tracker-table-column-linear-acceleration = accew. X/Y/Z tracker-table-column-rotation = wotaytion x/y/z tracker-table-column-position = pawsytion x/y/z tracker-table-column-url = uawl diff --git a/gui/public/i18n/en/translation.ftl b/gui/public/i18n/en/translation.ftl index 72f3b2f96..3b865671f 100644 --- a/gui/public/i18n/en/translation.ftl +++ b/gui/public/i18n/en/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = Settings bvh-start_recording = Record BVH bvh-recording = Recording... -## Overlay settings -overlay-is_visible_label = Show Overlay in SteamVR -overlay-is_mirrored_label = Display Overlay as Mirror +## Widget: Overlay settings +widget-overlay = Overlay +widget-overlay-is_visible_label = Show Overlay in SteamVR +widget-overlay-is_mirrored_label = Display Overlay as Mirror + +## Widget: Developer settings +widget-developer_mode = Developer Mode +widget-developer_mode-high_contrast = High contrast +widget-developer_mode-precise_rotation = Precise rotation +widget-developer_mode-fast_data_feed = Fast data feed +widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD +widget-developer_mode-sort_by_name = Sort by name +widget-developer_mode-raw_slime_rotation = Raw rotation +widget-developer_mode-more_info = More info + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = No Status @@ -104,6 +120,9 @@ tracker-table-column-name = Name tracker-table-column-type = Type tracker-table-column-battery = Battery tracker-table-column-ping = Ping +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = Rotation X/Y/Z tracker-table-column-position = Position X/Y/Z tracker-table-column-url = URL diff --git a/gui/public/i18n/es-419/translation.ftl b/gui/public/i18n/es-419/translation.ftl index 32ad6ce79..8429462fb 100644 --- a/gui/public/i18n/es-419/translation.ftl +++ b/gui/public/i18n/es-419/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = Ajustes bvh-start_recording = Grabar BVH bvh-recording = Grabando... -## Overlay settings -overlay-is_visible_label = Mostrar interfaz en SteamVR -overlay-is_mirrored_label = Mostrar interfaz reflejada +## Widget: Overlay settings +widget-overlay = Overlay +widget-overlay-is_visible_label = Mostrar interfaz en SteamVR +widget-overlay-is_mirrored_label = Mostrar interfaz reflejada + +## Widget: Developer settings +widget-developer_mode = Developer Mode +widget-developer_mode-high_contrast = High contrast +widget-developer_mode-precise_rotation = Precise rotation +widget-developer_mode-fast_data_feed = Fast data feed +widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD +widget-developer_mode-sort_by_name = Sort by name +widget-developer_mode-raw_slime_rotation = Raw rotation +widget-developer_mode-more_info = More info + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = Sin estado @@ -104,6 +120,9 @@ tracker-table-column-name = Nombre tracker-table-column-type = Tipo tracker-table-column-battery = Batería tracker-table-column-ping = Latencia +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = Rotación X/Y/Z tracker-table-column-position = Posición X/Y/Z tracker-table-column-url = URL diff --git a/gui/public/i18n/fr/translation.ftl b/gui/public/i18n/fr/translation.ftl index ba922f3b1..81d4510d6 100644 --- a/gui/public/i18n/fr/translation.ftl +++ b/gui/public/i18n/fr/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = Réglages bvh-start_recording = Enregistrer BVH bvh-recording = Enregistrement... -## Overlay settings -overlay-is_visible_label = Superposer le squelette dans SteamVR -overlay-is_mirrored_label = Afficher le squelette en tant que miroir +## Widget: Overlay settings +widget-overlay = Squelette +widget-overlay-is_visible_label = Superposer le squelette dans SteamVR +widget-overlay-is_mirrored_label = Afficher le squelette en tant que miroir + +## Widget: Developer settings +widget-developer_mode = Developer Mode +widget-developer_mode-high_contrast = High contrast +widget-developer_mode-precise_rotation = Precise rotation +widget-developer_mode-fast_data_feed = Fast data feed +widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD +widget-developer_mode-sort_by_name = Sort by name +widget-developer_mode-raw_slime_rotation = Raw rotation +widget-developer_mode-more_info = More info + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = Pas de statut @@ -104,6 +120,9 @@ tracker-table-column-name = Nom tracker-table-column-type = Type tracker-table-column-battery = Batterie tracker-table-column-ping = Ping +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = Rotation X/Y/Z tracker-table-column-position = Position X/Y/Z tracker-table-column-url = URL diff --git a/gui/public/i18n/it/translation.ftl b/gui/public/i18n/it/translation.ftl index 921bcfc3a..7aa3577ae 100644 --- a/gui/public/i18n/it/translation.ftl +++ b/gui/public/i18n/it/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = Impostazioni bvh-start_recording = Registra BVH bvh-recording = Registrazione in corso... -## Overlay settings -overlay-is_visible_label = Mostra Overlay in SteamVR -overlay-is_mirrored_label = Includi uno specchio nel Overlay +## Widget: Overlay settings +widget-overlay = Overlay +widget-overlay-is_visible_label = Mostra Overlay in SteamVR +widget-overlay-is_mirrored_label = Includi uno specchio nel Overlay + +## Widget: Developer settings +widget-developer_mode = Developer Mode +widget-developer_mode-high_contrast = High contrast +widget-developer_mode-precise_rotation = Precise rotation +widget-developer_mode-fast_data_feed = Fast data feed +widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD +widget-developer_mode-sort_by_name = Sort by name +widget-developer_mode-raw_slime_rotation = Raw rotation +widget-developer_mode-more_info = More info + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = Nessuno Stato @@ -104,6 +120,9 @@ tracker-table-column-name = Nome tracker-table-column-type = Tipologia tracker-table-column-battery = Batteria tracker-table-column-ping = Ping +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = Rotazione X/Y/Z tracker-table-column-position = Rotazione X/Y/Z tracker-table-column-url = URL diff --git a/gui/public/i18n/ja/translation.ftl b/gui/public/i18n/ja/translation.ftl index a253ba2d8..d1296c443 100644 --- a/gui/public/i18n/ja/translation.ftl +++ b/gui/public/i18n/ja/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = 設定 bvh-start_recording = BVHレコーディング bvh-recording = レコーディング中... -## Overlay settings -overlay-is_visible_label = SteamVRでオーバーレイを表示する -overlay-is_mirrored_label = オーバーレイをミラーとして表示する +## Widget: Overlay settings +widget-overlay = オーバーレイ設定 +widget-overlay-is_visible_label = SteamVRでオーバーレイを表示する +widget-overlay-is_mirrored_label = オーバーレイをミラーとして表示する + +## Widget: Developer settings +widget-developer_mode = 開発者モード +widget-developer_mode-high_contrast = ハイ コントラスト +widget-developer_mode-precise_rotation = 正確な回転角度を表示 +widget-developer_mode-fast_data_feed = 高速表示モード +widget-developer_mode-filter_slimes_and_hmd = SlimeVRとHMDのみを表示 +widget-developer_mode-sort_by_name = 表示名順 +widget-developer_mode-raw_slime_rotation = 元の回転角度 +widget-developer_mode-more_info = 他情報 + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = ステータスなし @@ -104,6 +120,9 @@ tracker-table-column-name = Name tracker-table-column-type = Type tracker-table-column-battery = Battery tracker-table-column-ping = Ping +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = Rotation X/Y/Z tracker-table-column-position = Position X/Y/Z tracker-table-column-url = URL diff --git a/gui/public/i18n/ko/translation.ftl b/gui/public/i18n/ko/translation.ftl index d17ce42ac..55bf22296 100644 --- a/gui/public/i18n/ko/translation.ftl +++ b/gui/public/i18n/ko/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = 설정 bvh-start_recording = BVH 기록 bvh-recording = 기록중... -## Overlay settings -overlay-is_visible_label = SteamVR에서 오버레이 표시 -overlay-is_mirrored_label = 오버레이 반전 +## Widget: Overlay settings +widget-overlay = 오버레이 +widget-overlay-is_visible_label = SteamVR에서 오버레이 표시 +widget-overlay-is_mirrored_label = 오버레이 반전 + +## Widget: Developer settings +widget-developer_mode = 개발자 모드 +widget-developer_mode-high_contrast = High contrast +widget-developer_mode-precise_rotation = Precise rotation +widget-developer_mode-fast_data_feed = Fast data feed +widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD +widget-developer_mode-sort_by_name = Sort by name +widget-developer_mode-raw_slime_rotation = Raw rotation +widget-developer_mode-more_info = More info + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = No Status @@ -104,6 +120,9 @@ tracker-table-column-name = 이름 tracker-table-column-type = 타입 tracker-table-column-battery = 배터리 tracker-table-column-ping = Ping +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = X/Y/Z 회전 tracker-table-column-position = X/Y/Z 위치 tracker-table-column-url = URL diff --git a/gui/public/i18n/pl/translation.ftl b/gui/public/i18n/pl/translation.ftl index 3e0a53be6..266d6a758 100644 --- a/gui/public/i18n/pl/translation.ftl +++ b/gui/public/i18n/pl/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = Ustawienia bvh-start_recording = Nagraj BVH bvh-recording = Nagrywam... -## Overlay settings -overlay-is_visible_label = Pokaż Overlay w SteamVR -overlay-is_mirrored_label = Pokaż Overlay jako Lustro +## Widget: Overlay settings +widget-overlay = Overlay +widget-overlay-is_visible_label = Pokaż Overlay w SteamVR +widget-overlay-is_mirrored_label = Pokaż Overlay jako Lustro + +## Widget: Developer settings +widget-developer_mode = Tryb Dewelopera +widget-developer_mode-high_contrast = High contrast +widget-developer_mode-precise_rotation = Precise rotation +widget-developer_mode-fast_data_feed = Fast data feed +widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD +widget-developer_mode-sort_by_name = Sort by name +widget-developer_mode-raw_slime_rotation = Raw rotation +widget-developer_mode-more_info = More info + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = Brak Statusu @@ -104,6 +120,9 @@ tracker-table-column-name = Nazwa tracker-table-column-type = Typ tracker-table-column-battery = Bateria tracker-table-column-ping = Ping +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = Rotacja X/Y/Z tracker-table-column-position = Pozycja X/Y/Z tracker-table-column-url = URL diff --git a/gui/public/i18n/pt-BR/translation.ftl b/gui/public/i18n/pt-BR/translation.ftl index ed740490a..1d247a843 100644 --- a/gui/public/i18n/pt-BR/translation.ftl +++ b/gui/public/i18n/pt-BR/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = Opções bvh-start_recording = Gravar BVH bvh-recording = Gravando... -## Overlay settings -overlay-is_visible_label = Mostrar Overlay na SteamVR -overlay-is_mirrored_label = Mostrar Overlay como espelho +## Widget: Overlay settings +widget-overlay = Overlay +widget-overlay-is_visible_label = Mostrar Overlay na SteamVR +widget-overlay-is_mirrored_label = Mostrar Overlay como espelho + +## Widget: Developer settings +widget-developer_mode = Modo de desenvolvedor +widget-developer_mode-high_contrast = High contrast +widget-developer_mode-precise_rotation = Precise rotation +widget-developer_mode-fast_data_feed = Fast data feed +widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD +widget-developer_mode-sort_by_name = Sort by name +widget-developer_mode-raw_slime_rotation = Raw rotation +widget-developer_mode-more_info = More info + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = Sem Status @@ -104,6 +120,9 @@ tracker-table-column-name = Nome tracker-table-column-type = Tipo tracker-table-column-battery = Bateria tracker-table-column-ping = Ping +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = Rotação X/Y/Z tracker-table-column-position = Posição X/Y/Z tracker-table-column-url = URL diff --git a/gui/public/i18n/vi/translation.ftl b/gui/public/i18n/vi/translation.ftl index f7c05b57d..0daaf864a 100644 --- a/gui/public/i18n/vi/translation.ftl +++ b/gui/public/i18n/vi/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = Cài đặt bvh-start_recording = Ghi BVH bvh-recording = Đang ghi... -## Overlay settings -overlay-is_visible_label = Xem overlay trên SteamVR -overlay-is_mirrored_label = Xem overlay trong gương +## Widget: Overlay settings +widget-overlay = Overlay +widget-overlay-is_visible_label = Xem overlay trên SteamVR +widget-overlay-is_mirrored_label = Xem overlay trong gương + +## Widget: Developer settings +widget-developer_mode = Chế độ nhà phát triển +widget-developer_mode-high_contrast = High contrast +widget-developer_mode-precise_rotation = Precise rotation +widget-developer_mode-fast_data_feed = Fast data feed +widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD +widget-developer_mode-sort_by_name = Sort by name +widget-developer_mode-raw_slime_rotation = Raw rotation +widget-developer_mode-more_info = More info + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = Không có tình trạng @@ -104,6 +120,9 @@ tracker-table-column-name = Tên tracker-table-column-type = Loại tracker-table-column-battery = Pin tracker-table-column-ping = Ping +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = Chiều chuyển X/Y/Z tracker-table-column-position = Vị trí X/Y/Z tracker-table-column-url = URL diff --git a/gui/public/i18n/zh-Hans/translation.ftl b/gui/public/i18n/zh-Hans/translation.ftl index f3f3d3a8c..9b9d0bb41 100644 --- a/gui/public/i18n/zh-Hans/translation.ftl +++ b/gui/public/i18n/zh-Hans/translation.ftl @@ -87,9 +87,25 @@ navbar-settings = 设置 bvh-start_recording = 录制 BVH 文件 bvh-recording = 录制中... -## Overlay settings -overlay-is_visible_label = 在 SteamVR 中显示覆盖层 -overlay-is_mirrored_label = 镜像显示覆盖层 +## Widget: Overlay settings +widget-overlay = 覆盖层 +widget-overlay-is_visible_label = 在 SteamVR 中显示覆盖层 +widget-overlay-is_mirrored_label = 镜像显示覆盖层 + +## Widget: Developer settings +widget-developer_mode = 开发者模式 +widget-developer_mode-high_contrast = High contrast +widget-developer_mode-precise_rotation = Precise rotation +widget-developer_mode-fast_data_feed = Fast data feed +widget-developer_mode-filter_slimes_and_hmd = Filter slimes and HMD +widget-developer_mode-sort_by_name = Sort by name +widget-developer_mode-raw_slime_rotation = Raw rotation +widget-developer_mode-more_info = More info + +## Widget: IMU Visualizer +widget-imu_visualizer = Rotation +widget-imu_visualizer-rotation_raw = Raw +widget-imu_visualizer-rotation_preview = Preview ## Tracker status tracker-status-none = 无状态 @@ -104,6 +120,9 @@ tracker-table-column-name = 名字 tracker-table-column-type = 类型 tracker-table-column-battery = 电量 tracker-table-column-ping = 延迟 +tracker-table-column-tps = TPS +tracker-table-column-temperature = Temp. °C +tracker-table-column-linear-acceleration = Accel. X/Y/Z tracker-table-column-rotation = 旋转 X/Y/Z tracker-table-column-position = 位置 X/Y/Z tracker-table-column-url = 地址 diff --git a/gui/src/components/MainLayout.tsx b/gui/src/components/MainLayout.tsx index 83c9d0827..c25a550f5 100644 --- a/gui/src/components/MainLayout.tsx +++ b/gui/src/components/MainLayout.tsx @@ -1,11 +1,13 @@ import classNames from 'classnames'; import { ReactNode } from 'react'; import { ResetType } from 'solarxr-protocol'; +import { useConfig } from '../hooks/config'; import { useLayout } from '../hooks/layout'; import { BVHButton } from './BVHButton'; import { ResetButton } from './home/ResetButton'; import { Navbar } from './Navbar'; import { TopBar } from './TopBar'; +import { DeveloperModeWidget } from './widgets/DeveloperModeWidget'; import { OverlayWidget } from './widgets/OverlayWidget'; export function MainLayoutRoute({ @@ -19,6 +21,7 @@ export function MainLayoutRoute({ }) { const { layoutHeight, ref } = useLayout(); const { layoutWidth, ref: refw } = useLayout(); + const { config } = useConfig(); return ( <> @@ -59,6 +62,11 @@ export function MainLayoutRoute({
+ {config?.debug && ( +
+ +
+ )} )} diff --git a/gui/src/components/commons/icon/WarningIcon.tsx b/gui/src/components/commons/icon/WarningIcon.tsx new file mode 100644 index 000000000..2372f582b --- /dev/null +++ b/gui/src/components/commons/icon/WarningIcon.tsx @@ -0,0 +1,17 @@ +export function WarningIcon(props: any) { + return ( + + + + ); +} diff --git a/gui/src/components/onboarding/pages/mounting/ManualMounting.tsx b/gui/src/components/onboarding/pages/mounting/ManualMounting.tsx index 6b353705e..469a2a764 100644 --- a/gui/src/components/onboarding/pages/mounting/ManualMounting.tsx +++ b/gui/src/components/onboarding/pages/mounting/ManualMounting.tsx @@ -1,11 +1,10 @@ -import Quaternion from 'quaternion'; import { useMemo, useState } from 'react'; import { AssignTrackerRequestT, BodyPart, RpcMessage } from 'solarxr-protocol'; import { FlatDeviceTracker } from '../../../../hooks/app'; import { useOnboarding } from '../../../../hooks/onboarding'; import { useTrackers } from '../../../../hooks/tracker'; import { useWebsocketAPI } from '../../../../hooks/websocket-api'; -import { QuaternionToQuatT } from '../../../../maths/quaternion'; +import { MountingOrientationDegreesToQuatT } from '../../../../maths/quaternion'; import { ArrowLink } from '../../../commons/ArrowLink'; import { Button } from '../../../commons/Button'; import { TipBox } from '../../../commons/TipBox'; @@ -41,13 +40,13 @@ export function ManualMountingPage() { [assignedTrackers] ); - const onDirectionSelected = (mountingOrientation: number) => { + const onDirectionSelected = (mountingOrientationDegrees: number) => { (trackerPartGrouped[selectedRole] || []).forEach((td) => { const assignreq = new AssignTrackerRequestT(); assignreq.bodyPosition = td.tracker.info?.bodyPart || BodyPart.NONE; - assignreq.mountingOrientation = QuaternionToQuatT( - Quaternion.fromEuler(0, +mountingOrientation, 0) + assignreq.mountingOrientation = MountingOrientationDegreesToQuatT( + mountingOrientationDegrees ); assignreq.trackerId = td.tracker.trackerId; sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq); diff --git a/gui/src/components/tracker/TrackerBattery.tsx b/gui/src/components/tracker/TrackerBattery.tsx index 717e00b6d..406daa7bd 100644 --- a/gui/src/components/tracker/TrackerBattery.tsx +++ b/gui/src/components/tracker/TrackerBattery.tsx @@ -3,21 +3,28 @@ import { Typography } from '../commons/Typography'; export function TrackerBattery({ value, + voltage, disabled, + textColor = 'secondary', }: { value: number; + voltage?: number | null; disabled?: boolean; + textColor?: string; }) { + const percent = value * 100; + return (
- +
{!disabled && (
- - {(value * 100).toFixed(0)} % - + {percent.toFixed(0)} % + {voltage && ( + {voltage.toFixed(2)} V + )}
)} {disabled && ( diff --git a/gui/src/components/tracker/TrackerCard.tsx b/gui/src/components/tracker/TrackerCard.tsx index 24ea72537..8a24f2f43 100644 --- a/gui/src/components/tracker/TrackerCard.tsx +++ b/gui/src/components/tracker/TrackerCard.tsx @@ -44,10 +44,11 @@ function TrackerBig({ /> )}
- {device.hardwareStatus.rssi && device.hardwareStatus.ping && ( + {(device.hardwareStatus.rssi != null || + device.hardwareStatus.ping != null) && ( )} @@ -90,10 +91,11 @@ function TrackerSmol({ )}
- {device.hardwareStatus.rssi && device.hardwareStatus.ping && ( + {(device.hardwareStatus.rssi != null || + device.hardwareStatus.ping != null) && ( )} diff --git a/gui/src/components/tracker/TrackerSettings.tsx b/gui/src/components/tracker/TrackerSettings.tsx index 8c1d49a0b..bc5bf3f63 100644 --- a/gui/src/components/tracker/TrackerSettings.tsx +++ b/gui/src/components/tracker/TrackerSettings.tsx @@ -1,5 +1,4 @@ import { IPv4 } from 'ip-num/IPNumber'; -import Quaternion from 'quaternion'; import { useEffect, useMemo, useState } from 'react'; import { useForm } from 'react-hook-form'; import { useParams } from 'react-router-dom'; @@ -7,8 +6,10 @@ import { AssignTrackerRequestT, BodyPart, RpcMessage } from 'solarxr-protocol'; import { useDebouncedEffect } from '../../hooks/timeout'; import { useTrackerFromId } from '../../hooks/tracker'; import { useWebsocketAPI } from '../../hooks/websocket-api'; -import { DEG_TO_RAD, RAD_TO_DEG } from '../../maths/angle'; -import { FixEuler, GetYaw, QuaternionToQuatT } from '../../maths/quaternion'; +import { + getYawInDegrees, + MountingOrientationDegreesToQuatT, +} from '../../maths/quaternion'; import { ArrowLink } from '../commons/ArrowLink'; import { Button } from '../commons/Button'; import { FootIcon } from '../commons/icon/FootIcon'; @@ -19,6 +20,10 @@ import { SingleTrackerBodyAssignmentMenu } from './SingleTrackerBodyAssignmentMe import { TrackerCard } from './TrackerCard'; import { CheckBox } from '../commons/Checkbox'; import { useLocalization } from '@fluent/react'; +import { IMUVisualizerWidget } from '../widgets/IMUVisualizerWidget'; +import { useConfig } from '../../hooks/config'; +import { WarningIcon } from '../commons/icon/WarningIcon'; +import classNames from 'classnames'; export const rotationToQuatMap = { FRONT: 180, @@ -36,6 +41,7 @@ const rotationsLabels = { export function TrackerSettingsPage() { const { l10n } = useLocalization(); + const { config } = useConfig(); const { sendRPCPacket } = useWebsocketAPI(); const [firstLoad, setFirstLoad] = useState(false); @@ -59,18 +65,13 @@ export function TrackerSettingsPage() { const tracker = useTrackerFromId(trackernum, deviceid); - const onDirectionSelected = (mountingOrientation: number) => { + const onDirectionSelected = (mountingOrientationDegrees: number) => { if (!tracker) return; const assignreq = new AssignTrackerRequestT(); - assignreq.mountingOrientation = QuaternionToQuatT( - Quaternion.fromEuler( - 0, - 0, - FixEuler(+mountingOrientation) * DEG_TO_RAD, - 'XZY' - ) + assignreq.mountingOrientation = MountingOrientationDegreesToQuatT( + mountingOrientationDegrees ); assignreq.bodyPosition = tracker?.tracker.info?.bodyPart || BodyPart.NONE; assignreq.trackerId = tracker?.tracker.trackerId; @@ -92,9 +93,9 @@ export function TrackerSettingsPage() { setSelectBodypart(false); }; - const currRotation = useMemo(() => { + const currRotationDegrees = useMemo(() => { return tracker?.tracker.info?.mountingOrientation - ? FixEuler(GetYaw(tracker.tracker.info?.mountingOrientation) * RAD_TO_DEG) + ? getYawInDegrees(tracker?.tracker.info?.mountingOrientation) : rotationToQuatMap.FRONT; }, [tracker?.tracker.info?.mountingOrientation]); @@ -108,10 +109,9 @@ export function TrackerSettingsPage() { return; const assignreq = new AssignTrackerRequestT(); assignreq.bodyPosition = tracker?.tracker.info?.bodyPart || BodyPart.NONE; - assignreq.mountingOrientation = assignreq.mountingOrientation = - QuaternionToQuatT( - Quaternion.fromEuler(0, 0, FixEuler(+currRotation) * DEG_TO_RAD, 'XZY') - ); + assignreq.mountingOrientation = + MountingOrientationDegreesToQuatT(currRotationDegrees); + assignreq.displayName = trackerName; assignreq.trackerId = tracker?.tracker.trackerId; assignreq.allowDriftCompensation = allowDriftCompensation; @@ -222,6 +222,11 @@ export function TrackerSettingsPage() {
+ {tracker?.tracker && config?.debug && ( + + )}
@@ -241,8 +246,18 @@ export function TrackerSettingsPage() {
- - + {tracker?.tracker.info?.bodyPart !== BodyPart.NONE && ( + + )} + {tracker?.tracker.info?.bodyPart === BodyPart.NONE && ( + + )} + {l10n.getString( 'body_part-' + BodyPart[tracker?.tracker.info?.bodyPart || BodyPart.NONE] @@ -270,7 +285,7 @@ export function TrackerSettingsPage() {
- {l10n.getString(rotationsLabels[currRotation])} + {l10n.getString(rotationsLabels[currRotationDegrees])}
diff --git a/gui/src/components/tracker/TrackerWifi.tsx b/gui/src/components/tracker/TrackerWifi.tsx index 36efaff6e..b1ee480a8 100644 --- a/gui/src/components/tracker/TrackerWifi.tsx +++ b/gui/src/components/tracker/TrackerWifi.tsx @@ -4,24 +4,31 @@ import { Typography } from '../commons/Typography'; export function TrackerWifi({ rssi, ping, + rssiShowNumeric, disabled, + textColor = 'secondary', }: { rssi: number; ping: number; + rssiShowNumeric?: boolean; disabled?: boolean; + textColor?: string; }) { return ( -
-
+
+
{!disabled && ( -
- {ping} ms +
+ {ping} ms + {rssiShowNumeric && ( + {rssi} dBm + )}
)} {disabled && ( -
+
)} diff --git a/gui/src/components/tracker/TrackersTable.tsx b/gui/src/components/tracker/TrackersTable.tsx index 3802f05af..0dddf0874 100644 --- a/gui/src/components/tracker/TrackersTable.tsx +++ b/gui/src/components/tracker/TrackersTable.tsx @@ -1,6 +1,6 @@ import classNames from 'classnames'; import { IPv4 } from 'ip-num/IPNumber'; -import { MouseEventHandler, ReactNode, useState } from 'react'; +import { MouseEventHandler, ReactNode, useState, useMemo } from 'react'; import { TrackerDataT, TrackerIdT, @@ -14,8 +14,45 @@ import { TrackerBattery } from './TrackerBattery'; import { TrackerStatus } from './TrackerStatus'; import { TrackerWifi } from './TrackerWifi'; import { useLocalization } from '@fluent/react'; +import { formatVector3 } from '../utils/formatting'; +import { useConfig } from '../../hooks/config'; -export function TrackerNameCol({ tracker }: { tracker: TrackerDataT }) { +enum DisplayColumn { + NAME, + TYPE, + BATTERY, + PING, + TPS, + ROTATION, + TEMPERATURE, + LINEAR_ACCELERATION, + POSITION, + URL, +} + +const displayColumns: { [k: string]: boolean } = { + [DisplayColumn.NAME]: true, + [DisplayColumn.TYPE]: true, + [DisplayColumn.BATTERY]: true, + [DisplayColumn.PING]: true, + [DisplayColumn.TPS]: true, + [DisplayColumn.ROTATION]: true, + [DisplayColumn.TEMPERATURE]: true, + [DisplayColumn.LINEAR_ACCELERATION]: true, + [DisplayColumn.POSITION]: true, + [DisplayColumn.URL]: true, +}; + +const isSlime = ({ device }: FlatDeviceTracker) => + device?.hardwareInfo?.manufacturer === 'SlimeVR'; + +const getDeviceName = ({ device }: FlatDeviceTracker) => + device?.customName?.toString() || ''; + +const getTrackerName = ({ tracker }: FlatDeviceTracker) => + tracker?.info?.customName?.toString() || ''; + +export function TrackerNameCell({ tracker }: { tracker: TrackerDataT }) { const { useName } = useTracker(tracker); const name = useName(); @@ -33,17 +70,28 @@ export function TrackerNameCol({ tracker }: { tracker: TrackerDataT }) { ); } -export function TrackerRotCol({ tracker }: { tracker: TrackerDataT }) { - const { useRotationDegrees } = useTracker(tracker); +export function TrackerRotCell({ + tracker, + precise, + color, + referenceAdjusted, +}: { + tracker: TrackerDataT; + precise?: boolean; + color?: string; + referenceAdjusted?: boolean; +}) { + const { useRawRotationEulerDegrees, useRefAdjRotationEulerDegrees } = + useTracker(tracker); - const rot = useRotationDegrees(); + const rot = referenceAdjusted + ? useRefAdjRotationEulerDegrees() + : useRawRotationEulerDegrees(); return ( - + - {`${rot.pitch.toFixed(0)} / ${rot.yaw.toFixed(0)} / ${rot.roll.toFixed( - 0 - )}`} + {formatVector3(rot, precise ? 2 : 0)} ); @@ -90,7 +138,7 @@ export function RowContainer({ 'min-h-[50px] flex flex-col justify-center px-3', rounded === 'left' && 'rounded-l-lg', rounded === 'right' && 'rounded-r-lg', - hover ? 'bg-background-50' : 'bg-background-60' + hover ? 'bg-background-50 cursor-pointer' : 'bg-background-60' )} > {children} @@ -108,168 +156,218 @@ export function TrackersTable({ }) { const { l10n } = useLocalization(); const [hoverTracker, setHoverTracker] = useState(null); + const { config } = useConfig(); const trackerEqual = (id: TrackerIdT | null) => id?.trackerNum == hoverTracker?.trackerNum && (!id?.deviceId || id.deviceId.id == hoverTracker?.deviceId?.id); + const filteringEnabled = + config?.debug && config?.devSettings?.filterSlimesAndHMD; + const sortingEnabled = config?.debug && config?.devSettings?.sortByName; + // TODO: fix memo + const filteredSortedTrackers = useMemo(() => { + const list = filteringEnabled + ? flatTrackers.filter((t) => getDeviceName(t) === 'HMD' || isSlime(t)) + : flatTrackers; + + if (sortingEnabled) { + list.sort((a, b) => getTrackerName(a).localeCompare(getTrackerName(b))); + } + return list; + }, [flatTrackers, filteringEnabled, sortingEnabled]); + + const fontColor = config?.devSettings?.highContrast ? 'primary' : 'secondary'; + const moreInfo = config?.devSettings?.moreInfo; + + const hasTemperature = !!filteredSortedTrackers.find( + ({ tracker }) => Number(tracker?.temp?.temp) != 0 + ); + displayColumns[DisplayColumn.TEMPERATURE] = hasTemperature || false; + displayColumns[DisplayColumn.POSITION] = moreInfo || false; + displayColumns[DisplayColumn.LINEAR_ACCELERATION] = moreInfo || false; + displayColumns[DisplayColumn.URL] = moreInfo || false; + const displayColumnsKeys = Object.keys(displayColumns).filter( + (k) => displayColumns[k] + ); + const firstColumnId = +displayColumnsKeys[0]; + const lastColumnId = +displayColumnsKeys[displayColumnsKeys.length - 1]; + + function column({ + id, + label, + labelClassName, + row, + }: { + id: DisplayColumn; + label: string; + labelClassName?: string; + row: (data: FlatDeviceTracker) => ReactNode | null; + }) { + let rounded: 'left' | 'right' | 'none' = 'none'; + if (firstColumnId === id) rounded = 'left'; + else if (lastColumnId === id) rounded = 'right'; + + if (!displayColumns[id]) return <>; + + return ( +
+
+ {label} +
+ {filteredSortedTrackers.map((data, index) => ( + clickedTracker(data.tracker)} + hover={trackerEqual(data.tracker.trackerId)} + onMouseOver={() => setHoverTracker(data.tracker.trackerId)} + onMouseOut={() => setHoverTracker(null)} + > + {row(data) || <>} + + ))} +
+ ); + } + return (
-
-
- {l10n.getString('tracker-table-column-name')} -
- {flatTrackers.map(({ tracker }, index) => ( - clickedTracker(tracker)} - hover={trackerEqual(tracker.trackerId)} - onMouseOver={() => setHoverTracker(tracker.trackerId)} - onMouseOut={() => setHoverTracker(null)} - > - - - ))} -
-
-
- {l10n.getString('tracker-table-column-type')} -
- {flatTrackers.map(({ device, tracker }, index) => ( - clickedTracker(tracker)} - hover={trackerEqual(tracker.trackerId)} - onMouseOver={() => setHoverTracker(tracker.trackerId)} - onMouseOut={() => setHoverTracker(null)} - > - - {device?.hardwareInfo?.manufacturer || '--'} - - - ))} -
-
-
- {l10n.getString('tracker-table-column-battery')} -
- {flatTrackers.map(({ device, tracker }, index) => ( - clickedTracker(tracker)} - hover={trackerEqual(tracker.trackerId)} - onMouseOver={() => setHoverTracker(tracker.trackerId)} - onMouseOut={() => setHoverTracker(null)} - > - {(device && - device.hardwareStatus && - device.hardwareStatus.batteryPctEstimate && ( - - )) || <>} - - ))} -
-
-
- {l10n.getString('tracker-table-column-ping')} -
- {flatTrackers.map(({ device, tracker }, index) => ( - clickedTracker(tracker)} - hover={trackerEqual(tracker.trackerId)} - onMouseOver={() => setHoverTracker(tracker.trackerId)} - onMouseOut={() => setHoverTracker(null)} - > - {(device && - device.hardwareStatus && - device.hardwareStatus.rssi && - device.hardwareStatus.ping && ( - - )) || <>} - - ))} -
-
-
- {l10n.getString('tracker-table-column-rotation')} -
- {flatTrackers.map(({ tracker }, index) => ( - clickedTracker(tracker)} - hover={trackerEqual(tracker.trackerId)} - onMouseOver={() => setHoverTracker(tracker.trackerId)} - onMouseOut={() => setHoverTracker(null)} - > - - - ))} -
-
-
- {l10n.getString('tracker-table-column-position')} -
- {flatTrackers.map(({ tracker }, index) => ( - clickedTracker(tracker)} - hover={trackerEqual(tracker.trackerId)} - onMouseOver={() => setHoverTracker(tracker.trackerId)} - onMouseOut={() => setHoverTracker(null)} - > - {(tracker.position && ( - - - {`${tracker.position?.x.toFixed( - 0 - )} / ${tracker.position?.y.toFixed( - 0 - )} / ${tracker.position?.z.toFixed(0)}`} - - - )) || <>} - - ))} -
-
-
- {l10n.getString('tracker-table-column-url')} -
+ {column({ + id: DisplayColumn.NAME, + label: l10n.getString('tracker-table-column-name'), + row: ({ tracker }) => ( + + ), + })} - {flatTrackers.map(({ device, tracker }, index) => ( - ( + + {device?.hardwareInfo?.manufacturer || '--'} + + ), + })} + + {column({ + id: DisplayColumn.BATTERY, + label: l10n.getString('tracker-table-column-battery'), + row: ({ device, tracker }) => + device?.hardwareStatus?.batteryPctEstimate && ( + + ), + })} + + {column({ + id: DisplayColumn.PING, + label: l10n.getString('tracker-table-column-ping'), + row: ({ device, tracker }) => + (device?.hardwareStatus?.rssi != null || + device?.hardwareStatus?.ping != null) && ( + + ), + })} + + {column({ + id: DisplayColumn.TPS, + label: l10n.getString('tracker-table-column-tps'), + row: ({ device }) => ( + + {(device?.hardwareStatus?.tps != null && ( + <>{device.hardwareStatus.tps || 0} + )) || <>} + + ), + })} + + {column({ + id: DisplayColumn.ROTATION, + label: l10n.getString('tracker-table-column-rotation'), + labelClassName: classNames({ + 'w-44': config?.devSettings?.preciseRotation, + 'w-32': !config?.devSettings?.preciseRotation, + }), + row: ({ tracker }) => ( + clickedTracker(tracker)} - hover={trackerEqual(tracker.trackerId)} - onMouseOver={() => setHoverTracker(tracker.trackerId)} - onMouseOut={() => setHoverTracker(null)} - > - - udp:// - {IPv4.fromNumber( - device?.hardwareInfo?.ipAddress?.addr || 0 - ).toString()} + precise={config?.devSettings?.preciseRotation} + referenceAdjusted={!config?.devSettings?.rawSlimeRotation} + color={fontColor} + /> + ), + })} + + {column({ + id: DisplayColumn.TEMPERATURE, + label: l10n.getString('tracker-table-column-temperature'), + row: ({ tracker }) => + tracker.temp?.temp != 0 && ( + + + {`${tracker.temp?.temp.toFixed(2)}`} + - - ))} -
+ ), + })} + + {column({ + id: DisplayColumn.LINEAR_ACCELERATION, + label: l10n.getString('tracker-table-column-linear-acceleration'), + labelClassName: 'w-36', + row: ({ tracker }) => + tracker.linearAcceleration && ( + + + {formatVector3(tracker.linearAcceleration, 1)} + + + ), + })} + + {column({ + id: DisplayColumn.POSITION, + label: l10n.getString('tracker-table-column-position'), + labelClassName: 'w-36', + row: ({ tracker }) => + tracker.position && ( + + + {formatVector3(tracker.position, 1)} + + + ), + })} + + {column({ + id: DisplayColumn.URL, + label: l10n.getString('tracker-table-column-url'), + row: ({ device }) => ( + + udp:// + {IPv4.fromNumber( + device?.hardwareInfo?.ipAddress?.addr || 0 + ).toString()} + + ), + })}
); } diff --git a/gui/src/components/utils/formatting.ts b/gui/src/components/utils/formatting.ts index 3f83689c5..bb20f08dc 100644 --- a/gui/src/components/utils/formatting.ts +++ b/gui/src/components/utils/formatting.ts @@ -2,3 +2,7 @@ import { BodyPart } from 'solarxr-protocol'; export const bodypartToString = (id: BodyPart) => BodyPart[id].replace(/_/g, ' '); + +type Vector3 = { x: number; y: number; z: number }; +export const formatVector3 = ({ x, y, z }: Vector3, precision = 0) => + `${x.toFixed(precision)} / ${y.toFixed(precision)} / ${z.toFixed(precision)}`; diff --git a/gui/src/components/widgets/DeveloperModeWidget.tsx b/gui/src/components/widgets/DeveloperModeWidget.tsx new file mode 100644 index 000000000..b3a483721 --- /dev/null +++ b/gui/src/components/widgets/DeveloperModeWidget.tsx @@ -0,0 +1,83 @@ +import { useEffect } from 'react'; +import { useForm } from 'react-hook-form'; +import { useConfig } from '../../hooks/config'; +import { useWebsocketAPI } from '../../hooks/websocket-api'; +import { CheckBox } from '../commons/Checkbox'; +import { useLocalization } from '@fluent/react'; +import { Typography } from '../commons/Typography'; + +export interface DeveloperModeWidgetForm { + highContrast: boolean; + preciseRotation: boolean; + fastDataFeed: boolean; + filterSlimesAndHMD: boolean; + sortByName: boolean; + rawSlimeRotation: boolean; + moreInfo: boolean; +} + +export function DeveloperModeWidget() { + const { l10n } = useLocalization(); + const { config, setConfig } = useConfig(); + const { reconnect } = useWebsocketAPI(); + + const { reset, control, handleSubmit, watch } = + useForm({ + defaultValues: { + highContrast: false, + preciseRotation: false, + fastDataFeed: false, + filterSlimesAndHMD: false, + sortByName: false, + rawSlimeRotation: false, + moreInfo: false, + }, + }); + + useEffect(() => { + reset(config?.devSettings || {}); + }, []); + + useEffect(() => { + const subscription = watch(() => handleSubmit(onSubmit)()); + return () => subscription.unsubscribe(); + }, []); + + const onSubmit = async (formData: DeveloperModeWidgetForm) => { + const needReconnect = + config?.devSettings?.fastDataFeed !== formData.fastDataFeed; + await setConfig({ devSettings: formData }); + if (needReconnect) reconnect(); + }; + + const makeToggle = ([name, label]: string[], index: number) => ( + + ); + + const toggles = { + highContrast: 'high_contrast', + preciseRotation: 'precise_rotation', + fastDataFeed: 'fast_data_feed', + filterSlimesAndHMD: 'filter_slimes_and_hmd', + sortByName: 'sort_by_name', + rawSlimeRotation: 'raw_slime_rotation', + moreInfo: 'more_info', + }; + + return ( +
+
+ + {l10n.getString('widget-developer_mode')} + +
+ {Object.entries(toggles).map(makeToggle)} +
+ ); +} diff --git a/gui/src/components/widgets/IMUVisualizerWidget.tsx b/gui/src/components/widgets/IMUVisualizerWidget.tsx new file mode 100644 index 000000000..46b427457 --- /dev/null +++ b/gui/src/components/widgets/IMUVisualizerWidget.tsx @@ -0,0 +1,169 @@ +import { useMemo, useState } from 'react'; +import { TrackerDataT } from 'solarxr-protocol'; +import { useTracker } from '../../hooks/tracker'; +import { Typography } from '../commons/Typography'; +import { formatVector3 } from '../utils/formatting'; +import { Canvas, useThree } from '@react-three/fiber'; +import * as THREE from 'three'; +import { CanvasTexture, PerspectiveCamera } from 'three'; +import { Button } from '../commons/Button'; +import { QuatObject } from '../../maths/quaternion'; +import { useLocalization } from '@fluent/react'; + +const groundColor = '#4444aa'; +const R = '#f01662'; +const G = '#92ff1a'; +const B = '#00b0ff'; + +const scale = 1.4; +const width = 2 * scale; +const height = 1 * scale; +const depth = 3 * scale; +const defaultFaces = ['Right', 'Left', 'Top', 'Bottom', 'Back', 'Front']; +const faceParams = [ + { scaleX: depth, scaleY: height, color: R }, // left right + { scaleX: width, scaleY: depth, color: G }, // top bottom + { scaleX: width, scaleY: height, color: B }, // front back +]; + +type FaceTypeProps = { + index: number; + scaleX: number; + scaleY: number; + resolution?: number; + font?: string; + opacity?: number; + color?: string; + hoverColor?: string; + textColor?: string; + strokeColor?: string; + faces?: string[]; +}; + +const FaceMaterial = ({ + index, + scaleX = 1, + scaleY = 1, + resolution = 128, + font = 'bold 46px monospace', + faces = defaultFaces, + color = '#f0f0f0', + textColor = 'black', + strokeColor = 'black', + opacity = 1, +}: FaceTypeProps) => { + const gl = useThree((state) => state.gl); + const texture = useMemo(() => { + const canvas = document.createElement('canvas'); + canvas.width = resolution * scaleX; + canvas.height = resolution * scaleY; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const context = canvas.getContext('2d')!; + context.fillStyle = color; + context.fillRect(0, 0, canvas.width, canvas.height); + context.strokeStyle = strokeColor; + context.lineWidth = 2; + context.strokeRect(0, 0, canvas.width, canvas.height); + context.font = font; + context.textAlign = 'center'; + context.fillStyle = textColor; + context.fillText( + faces[index].toUpperCase(), + canvas.width / 2, + canvas.height / 2 + 20 + ); + return new CanvasTexture(canvas); + }, [index, faces, font, color, textColor, strokeColor]); + return ( + + ); +}; + +const FaceCube = (props: Partial) => ( + + {[...Array(6)].map((_, i) => ( + + ))} + + +); + +function SceneRenderer({ x, y, z, w }: QuatObject) { + return ( + { + (camera as PerspectiveCamera).fov = 60; + }} + > + + + + + + + + + + + + + ); +} + +export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) { + const { l10n } = useLocalization(); + const [enabled, setEnabled] = useState(false); + const quat = tracker?.rotationIdentityAdjusted || new THREE.Quaternion(); + + const { useRawRotationEulerDegrees, useIdentAdjRotationEulerDegrees } = + useTracker(tracker); + + return ( +
+ + {l10n.getString('widget-imu_visualizer')} + + +
+ + {l10n.getString('widget-imu_visualizer-rotation_raw')} + + + {formatVector3(useRawRotationEulerDegrees(), 2)} + +
+ +
+ + {l10n.getString('widget-imu_visualizer-rotation_preview')} + + + {formatVector3(useIdentAdjRotationEulerDegrees(), 2)} + +
+ + {!enabled && ( + + )} + {enabled && } +
+ ); +} diff --git a/gui/src/components/widgets/OverlayWidget.tsx b/gui/src/components/widgets/OverlayWidget.tsx index 17367d068..6fa84268e 100644 --- a/gui/src/components/widgets/OverlayWidget.tsx +++ b/gui/src/components/widgets/OverlayWidget.tsx @@ -8,6 +8,7 @@ import { } from '../../hooks/pubSub'; import { CheckBox } from '../commons/Checkbox'; import { useLocalization } from '@fluent/react'; +import { Typography } from '../commons/Typography'; export function OverlayWidget() { const { l10n } = useLocalization(); @@ -64,17 +65,22 @@ export function OverlayWidget() { return (
+
+ + {l10n.getString('widget-overlay')} + +
); diff --git a/gui/src/hooks/app.ts b/gui/src/hooks/app.ts index 8d8fd4e21..27e1936ca 100644 --- a/gui/src/hooks/app.ts +++ b/gui/src/hooks/app.ts @@ -10,16 +10,14 @@ import { } from 'react'; import { useNavigate } from 'react-router-dom'; import { - DataFeedConfigT, DataFeedMessage, DataFeedUpdateT, - DeviceDataMaskT, DeviceDataT, StartDataFeedT, - TrackerDataMaskT, TrackerDataT, } from 'solarxr-protocol'; import { useConfig } from './config'; +import { useDataFeedConfig } from './datafeed-config'; import { useWebsocketAPI } from './websocket-api'; export interface FlatDeviceTracker { @@ -52,6 +50,7 @@ export function useProvideAppContext(): AppContext { const { sendDataFeedPacket, useDataFeedPacket, isConnected } = useWebsocketAPI(); const { config } = useConfig(); + const { dataFeedConfig } = useDataFeedConfig(); const navigate = useNavigate(); const [state, dispatch] = useReducer>( reducer, @@ -62,24 +61,8 @@ export function useProvideAppContext(): AppContext { useEffect(() => { if (isConnected) { - const trackerData = new TrackerDataMaskT(); - trackerData.position = true; - trackerData.rotation = true; - trackerData.info = true; - trackerData.status = true; - trackerData.temp = true; - - const dataMask = new DeviceDataMaskT(); - dataMask.deviceData = true; - dataMask.trackerData = trackerData; - - const config = new DataFeedConfigT(); - config.dataMask = dataMask; - config.minimumTimeSinceLast = 100; - config.syntheticTrackersMask = trackerData; - const startDataFeed = new StartDataFeedT(); - startDataFeed.dataFeeds = [config]; + startDataFeed.dataFeeds = [dataFeedConfig]; sendDataFeedPacket(DataFeedMessage.StartDataFeed, startDataFeed); } }, [isConnected]); diff --git a/gui/src/hooks/config.ts b/gui/src/hooks/config.ts index dce06a498..ce95e69a2 100644 --- a/gui/src/hooks/config.ts +++ b/gui/src/hooks/config.ts @@ -7,6 +7,7 @@ import { } from '@tauri-apps/api/fs'; import { createContext, useContext, useRef, useState } from 'react'; +import { DeveloperModeWidgetForm } from '../components/widgets/DeveloperModeWidget'; export interface WindowConfig { width: number; @@ -20,6 +21,7 @@ export interface Config { lang: string; doneOnboarding: boolean; watchNewDevices: boolean; + devSettings: DeveloperModeWidgetForm; } export interface ConfigContext { diff --git a/gui/src/hooks/datafeed-config.ts b/gui/src/hooks/datafeed-config.ts new file mode 100644 index 000000000..b344f81c4 --- /dev/null +++ b/gui/src/hooks/datafeed-config.ts @@ -0,0 +1,37 @@ +import { + DataFeedConfigT, + DeviceDataMaskT, + TrackerDataMaskT, +} from 'solarxr-protocol'; +import { useConfig } from './config'; + +export function useDataFeedConfig() { + const { config } = useConfig(); + + const fastDataFeed = config?.debug && config?.devSettings?.fastDataFeed; + const feedMaxTps = fastDataFeed ? 40 : 10; + + const trackerData = new TrackerDataMaskT(); + trackerData.position = true; + trackerData.rotation = true; + trackerData.info = true; + trackerData.status = true; + trackerData.temp = true; + trackerData.linearAcceleration = true; + trackerData.rotationReferenceAdjusted = true; + trackerData.rotationIdentityAdjusted = true; + + const dataMask = new DeviceDataMaskT(); + dataMask.deviceData = true; + dataMask.trackerData = trackerData; + + const dataFeedConfig = new DataFeedConfigT(); + dataFeedConfig.dataMask = dataMask; + dataFeedConfig.minimumTimeSinceLast = 1000 / feedMaxTps; + dataFeedConfig.syntheticTrackersMask = trackerData; + + return { + dataFeedConfig, + feedMaxTps, + }; +} diff --git a/gui/src/hooks/tracker.ts b/gui/src/hooks/tracker.ts index 4cad7d378..f40848488 100644 --- a/gui/src/hooks/tracker.ts +++ b/gui/src/hooks/tracker.ts @@ -1,9 +1,14 @@ import { useEffect, useMemo, useRef, useState } from 'react'; import { BodyPart, TrackerDataT, TrackerStatus } from 'solarxr-protocol'; -import { RAD_TO_DEG } from '../maths/angle'; -import { QuaternionFromQuatT } from '../maths/quaternion'; +import { + QuaternionFromQuatT, + QuaternionToEulerDegrees, +} from '../maths/quaternion'; import { useAppContext } from './app'; import { useLocalization } from '@fluent/react'; +import { useDataFeedConfig } from './datafeed-config'; +import { Quaternion, Vector3 } from 'three'; +import { Vector3FromVec3fT } from '../maths/vector3'; export function useTrackers() { const { trackers } = useAppContext(); @@ -39,13 +44,7 @@ export function useTrackers() { export function useTracker(tracker: TrackerDataT) { const { l10n } = useLocalization(); - const computeRot = (rot: { x: number; y: number; z: number; w: number }) => - QuaternionFromQuatT({ - x: rot.x || 0, - y: rot.y || 0, - z: rot.z || 0, - w: rot.w || 1, - }).toEuler(); + const { feedMaxTps } = useDataFeedConfig(); return { useName: () => @@ -57,54 +56,61 @@ export function useTracker(tracker: TrackerDataT) { ); return tracker.info?.displayName || 'NONE'; }, [tracker.info]), - useRotation: () => + useRawRotationEulerDegrees: () => useMemo( - () => computeRot(tracker.rotation || { x: 0, y: 0, z: 0, w: 1 }), + () => QuaternionToEulerDegrees(tracker?.rotation), [tracker.rotation] ), - useRotationDegrees: () => - useMemo(() => { - const { yaw, pitch, roll } = computeRot( - tracker.rotation || { x: 0, y: 0, z: 0, w: 1 } - ); - return { - yaw: yaw * RAD_TO_DEG, - pitch: pitch * RAD_TO_DEG, - roll: roll * RAD_TO_DEG, - }; - }, [tracker.rotation]), + useRefAdjRotationEulerDegrees: () => + useMemo( + () => QuaternionToEulerDegrees(tracker?.rotationReferenceAdjusted), + [tracker.rotationReferenceAdjusted] + ), + useIdentAdjRotationEulerDegrees: () => + useMemo( + () => QuaternionToEulerDegrees(tracker?.rotationIdentityAdjusted), + [tracker.rotationIdentityAdjusted] + ), useVelocity: () => { - const previousRot = useRef<{ - x: number; - y: number; - z: number; - w: number; - }>(tracker.rotation || { x: 0, y: 0, z: 0, w: 1 }); + const previousRot = useRef( + QuaternionFromQuatT(tracker.rotation) + ); + const previousAcc = useRef( + Vector3FromVec3fT(tracker.linearAcceleration) + ); const [velocity, setVelocity] = useState(0); - const [rots, setRotation] = useState([]); + const [deltas] = useState([]); useEffect(() => { if (tracker.rotation) { - const rot = QuaternionFromQuatT(tracker.rotation).mul( - QuaternionFromQuatT(previousRot.current).inverse() + const rot = QuaternionFromQuatT(tracker.rotation).multiply( + previousRot.current.clone().invert() ); - const dif = Math.min(1, (rot.x ** 2 + rot.y ** 2 + rot.z ** 2) * 2.5); - // Use sum of rotation of last 3 frames (0.3sec) for smoother movement and better detection of slow movement. - if (rots.length === 3) { - rots.shift(); + const acc = Vector3FromVec3fT(tracker.linearAcceleration).sub( + previousAcc.current + ); + const dif = Math.min( + 1, + (rot.x ** 2 + rot.y ** 2 + rot.z ** 2) * 2.5 + + (acc.x ** 2 + acc.y ** 2 + acc.z ** 2) / 1000 + ); + // Use sum of the rotation and acceleration delta vector lengths over 0.3sec + // for smoother movement and better detection of slow movement. + if (deltas.length >= 0.3 * feedMaxTps) { + deltas.shift(); } - rots.push(dif); - setRotation(rots); + deltas.push(dif); setVelocity( Math.min( 1, Math.max( 0, - rots.reduce((a, b) => a + b) + deltas.reduce((a, b) => a + b) ) ) ); - previousRot.current = tracker.rotation; + previousRot.current = QuaternionFromQuatT(tracker.rotation); + previousAcc.current = Vector3FromVec3fT(tracker.linearAcceleration); } }, [tracker.rotation]); diff --git a/gui/src/hooks/websocket-api.ts b/gui/src/hooks/websocket-api.ts index af3dd01ab..5a4e4f168 100644 --- a/gui/src/hooks/websocket-api.ts +++ b/gui/src/hooks/websocket-api.ts @@ -17,6 +17,7 @@ import { useInterval } from './timeout'; export interface WebSocketApi { isConnected: boolean; isFirstConnection: boolean; + reconnect: () => void; useRPCPacket: (type: RpcMessage, callback: (packet: T) => void) => void; useDataFeedPacket: ( type: DataFeedMessage, @@ -51,9 +52,8 @@ export function useProvideWebsocketApi(): WebSocketApi { useInterval(() => { if (webSocketRef.current && !isConnected) { - disconnect(); - connect(); - console.log('Try reconnecting'); + console.log('Attempting to reconnect'); + reconnect(); } }, 3000); @@ -178,6 +178,11 @@ export function useProvideWebsocketApi(): WebSocketApi { } }; + const reconnect = () => { + disconnect(); + connect(); + }; + useEffect(() => { connect(); return () => { @@ -188,6 +193,7 @@ export function useProvideWebsocketApi(): WebSocketApi { return { isConnected, isFirstConnection, + reconnect, useDataFeedPacket: ( type: DataFeedMessage, callback: (packet: T) => void diff --git a/gui/src/maths/quaternion.ts b/gui/src/maths/quaternion.ts index f481949ec..bfd7a8a6b 100644 --- a/gui/src/maths/quaternion.ts +++ b/gui/src/maths/quaternion.ts @@ -1,23 +1,15 @@ -import Quaternion from 'quaternion'; +import { Euler, Quaternion } from 'three'; import { QuatT } from 'solarxr-protocol'; +import { DEG_TO_RAD } from './angle'; -export function QuaternionFromQuatT(q: { - x: number; - y: number; - z: number; - w: number; -}) { - return new Quaternion(q.w, q.x, q.y, q.z); +export type QuatObject = { x: number; y: number; z: number; w: number }; + +export function QuaternionFromQuatT(q?: QuatObject | null) { + return q ? new Quaternion(q.x, q.y, q.z, q.w) : new Quaternion(); } -export function QuaternionToQuatT(q: { - x: number; - y: number; - z: number; - w: number; -}) { +export function QuaternionToQuatT(q: QuatObject) { const quat = new QuatT(); - quat.x = q.x; quat.y = q.y; quat.z = q.z; @@ -25,39 +17,37 @@ export function QuaternionToQuatT(q: { return quat; } -export function FixEuler(yaw: number) { - if (yaw > 180) { - yaw *= -1; - yaw += 180; - } - return Math.round(yaw); +export function MountingOrientationDegreesToQuatT( + mountingOrientationDegrees: number +) { + return QuaternionToQuatT( + new Quaternion().setFromEuler( + new Euler(0, +mountingOrientationDegrees * DEG_TO_RAD, 0) + ) + ) } -export function GetYaw(q: { x: number; y: number; z: number; w: number }) { - const squareX = q.x * q.x, - squareY = q.y * q.y, - squareZ = q.z * q.z, - squareW = q.w * q.w; +const RAD_TO_DEG = 180 / Math.PI; - // This value is 1 if the quaternion is a unit (normalized) quaternion, - // otherwise this will be a factor to compensate for the singularity pole checks - const correctionFactor = squareX + squareY + squareZ + squareW; - // This value is to test for a singularity, it will be 0.5 at the north singularity, - // -0.5 at the south singularity, and anything else at any other value - const singularityTest = q.x * q.y + q.z * q.w; +export function getYawInDegrees(q?: QuatObject) { + if (!q) return 0; - // Singularity cutoff points are 0.499 (86.3 degrees) to compensate for error - if (singularityTest > 0.499 * correctionFactor) { - // Handle the singularity at the attitude of 90 degrees (north pole) - return 2 * Math.atan2(q.x, q.w); - } else if (singularityTest < -0.499 * correctionFactor) { - // Handle the singularity at the attitude of -90 degrees (south pole) - return -2 * Math.atan2(q.x, q.w); - } + // X Y Z Result + // back: 0 0 0 0 + // front: -180 0.. -180 180 + // left: 0 90 0 90 + // right: 0 -90 0 -90 - // Otherwise calculate the yaw normally - return Math.atan2( - 2 * q.y * q.w - 2 * q.x * q.z, - squareX - squareY - squareZ + squareW - ); + const angles = new Euler().setFromQuaternion(QuaternionFromQuatT(q)); + return angles.y | 0 + ? Math.round(angles.y * RAD_TO_DEG) + : Math.round(-angles.z * RAD_TO_DEG); +} + +export function QuaternionToEulerDegrees(q?: QuatObject | null) { + const angles = { x: 0, y: 0, z: 0 }; + if (!q) return angles; + + const a = new Euler().setFromQuaternion(new Quaternion(q.x, q.y, q.z, q.w)); + return { x: a.x * RAD_TO_DEG, y: a.y * RAD_TO_DEG, z: a.z * RAD_TO_DEG }; } diff --git a/gui/src/maths/vector3.ts b/gui/src/maths/vector3.ts new file mode 100644 index 000000000..305aec84d --- /dev/null +++ b/gui/src/maths/vector3.ts @@ -0,0 +1,16 @@ +import { Vec3fT } from 'solarxr-protocol'; +import { Vector3 } from 'three'; + +export type Vector3Object = { x: number; y: number; z: number; }; + +export function Vector3FromVec3fT(vec?: Vector3Object | null) { + return vec ? new Vector3(vec.x, vec.y, vec.z) : new Vector3(); +} + +export function Vector3ToVec3fT(q: Vector3Object) { + const vec = new Vec3fT(); + vec.x = q.x; + vec.y = q.y; + vec.z = q.z; + return vec; +} diff --git a/package-lock.json b/package-lock.json index f27100eac..cc63bc180 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "slimevr-ui", "version": "0.5.1", - "lockfileVersion": 3, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -25,6 +25,7 @@ "@fluent/react": "^0.14.1", "@fontsource/poppins": "^4.5.8", "@formatjs/intl-localematcher": "^0.2.32", + "@react-three/fiber": "^8.10.0", "@tauri-apps/api": "^1.2.0", "@vitejs/plugin-react": "^3.0.0", "browserslist": "^4.18.1", @@ -43,7 +44,6 @@ "postcss-normalize": "^10.0.1", "postcss-preset-env": "^7.0.1", "prompts": "^2.4.2", - "quaternion": "^1.4.0", "react": "^18.0.0", "react-dev-utils": "^12.0.0", "react-dom": "^18.0.0", @@ -52,6 +52,7 @@ "react-router-dom": "^6.2.2", "semver": "^7.3.5", "solarxr-protocol": "file:../solarxr-protocol", + "three": "^0.148.0", "typescript": "^4.6.3" }, "devDependencies": { @@ -60,6 +61,7 @@ "@types/react": "18.0.25", "@types/react-dom": "^18.0.5", "@types/react-modal": "3.13.1", + "@types/three": "^0.148.0", "@typescript-eslint/eslint-plugin": "^5.43.0", "@typescript-eslint/parser": "^5.43.0", "autoprefixer": "^10.4.4", @@ -2835,6 +2837,55 @@ "dev": true, "license": "0BSD" }, + "node_modules/@react-three/fiber": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.10.0.tgz", + "integrity": "sha512-veyvW9clPjS0oQ4g8e2E8yW3v8C2wcXhJp3VyTgjzhpKYAL0xq0+aiofHdpNjx/CiqlR25mYyFky6HskWP3B5w==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.0.8", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/@remix-run/router": { "version": "1.2.1", "license": "MIT", @@ -3087,12 +3138,10 @@ }, "node_modules/@types/prop-types": { "version": "15.7.5", - "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.0.25", - "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -3116,15 +3165,37 @@ "@types/react": "*" } }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.2", - "dev": true, "license": "MIT" }, "node_modules/@types/semver": { "version": "7.3.13", "license": "MIT" }, + "node_modules/@types/three": { + "version": "0.148.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.148.0.tgz", + "integrity": "sha512-1GiErjt1pJMadO8EhaxNrtULzdn+f3BbM3YTukiiXBVeRvvx4CXc2rpYdEuEBU/ouCX7Rc95j1HoVG9kFQXQJw==", + "dev": true, + "dependencies": { + "@types/webxr": "*" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.0.tgz", + "integrity": "sha512-IUMDPSXnYIbEO2IereEFcgcqfDREOgmbGqtrMpVPpACTU6pltYLwHgVkrnYv0XhWEcjio9sYEfIEzgn3c7nDqA==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.48.0", "license": "MIT", @@ -4189,13 +4260,17 @@ }, "node_modules/csstype": { "version": "3.1.1", - "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "license": "BSD-2-Clause" }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, "node_modules/debug": { "version": "4.3.4", "license": "MIT", @@ -6068,6 +6143,25 @@ "version": "2.0.0", "license": "ISC" }, + "node_modules/its-fine": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.0.8.tgz", + "integrity": "sha512-MagTA9/J6kN3aEQsQu6by3nyrttCm0whCOYo4SfiNzOfYgcr1cb29mJ3zgluaJboaWOL/lHzJeMXi/QGSCfX1Q==", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.1.tgz", + "integrity": "sha512-ExBHUBykCcDh0HqqlJb6BA1yNpvW2iluIThK9tr1CX2tRMe3HeLt5/ow/bTpKGWoRBE5v/ISXFyjbnHRSKT6ng==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "license": "MIT", @@ -7575,13 +7669,6 @@ "node": ">=6" } }, - "node_modules/quaternion": { - "version": "1.4.0", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "funding": [ @@ -7723,6 +7810,29 @@ "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" } }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-reconciler/node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/react-refresh": { "version": "0.14.0", "license": "MIT", @@ -7758,6 +7868,18 @@ "react-dom": ">=16.8" } }, + "node_modules/react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "dependencies": { + "debounce": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + } + }, "node_modules/read-cache": { "version": "1.0.0", "dev": true, @@ -8217,6 +8339,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/suspend-react": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.0.8.tgz", + "integrity": "sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg==", + "peerDependencies": { + "react": ">=17.0" + } + }, "node_modules/synckit": { "version": "0.8.4", "dev": true, @@ -8343,6 +8473,11 @@ "version": "0.2.0", "license": "MIT" }, + "node_modules/three": { + "version": "0.148.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.148.0.tgz", + "integrity": "sha512-8uzVV+qhTPi0bOFs/3te3RW6hb3urL8jYEl6irjCWo/l6sr8MPNMcClFev/MMYeIxr0gmDcoXTy/8LXh/LXkfw==" + }, "node_modules/tiny-glob": { "version": "0.2.9", "dev": true, @@ -8799,6 +8934,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, "solarxr-protocol": { "version": "0.0.0", "license": "(MIT OR Apache-2.0)", @@ -8822,5 +8973,5044 @@ "node": ">=4.2.0" } } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.10" + }, + "@babel/core": { + "version": "7.20.7", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.7", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7", + "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" + } + } + }, + "@babel/eslint-parser": { + "version": "7.19.1", + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0" + }, + "semver": { + "version": "6.3.0" + } + } + }, + "@babel/generator": { + "version": "7.20.7", + "requires": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "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", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.0" + }, + "yallist": { + "version": "3.1.1" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.20.7", + "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.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "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" + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9" + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.11", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "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.20.7", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "requires": { + "@babel/types": "^7.20.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1" + }, + "@babel/helper-validator-option": { + "version": "7.18.6" + }, + "@babel/helper-wrap-function": { + "version": "7.20.5", + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + } + }, + "@babel/helpers": { + "version": "7.20.7", + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3" + }, + "escape-string-regexp": { + "version": "1.0.5" + }, + "has-flag": { + "version": "3.0.0" + }, + "supports-color": { + "version": "5.5.0", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.20.7" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@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", + "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.20.7", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.20.7", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.19.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "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", + "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", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "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", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.20.7", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "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.20.5", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "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", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.19.0", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.20.11", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.20.7", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@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.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0" + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "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", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.19.0", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-flow": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "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", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "requires": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", + "requires": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.20.7", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.20.7", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.20.7" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.19.6", + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.20.7", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.20.7", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.20.2", + "requires": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@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.20.1", + "@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.20.2", + "@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.20.0", + "@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.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@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.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@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.19.0", + "@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.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "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/preset-react": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/preset-typescript": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + } + }, + "@babel/runtime": { + "version": "7.20.7", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/runtime-corejs3": { + "version": "7.20.7", + "requires": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.20.7", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.20.10", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@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.20.7", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0" + } + } + }, + "@babel/types": { + "version": "7.20.7", + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@csstools/normalize.css": { + "version": "12.0.0" + }, + "@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "requires": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-color-function": { + "version": "1.1.1", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-hwb-function": { + "version": "1.0.2", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "1.0.1", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-nested-calc": { + "version": "1.0.0", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "1.1.1", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-unset-value": { + "version": "1.0.2", + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "2.0.2", + "requires": {} + }, + "@esbuild/android-arm": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.13.tgz", + "integrity": "sha512-JmtqThupn9Yf+FzANE+GG73ASUkssnPwOsndUElhp23685QzRK+MO1UompOlBaXV9D5FTuYcPnw7p4mCq2YbZQ==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.13.tgz", + "integrity": "sha512-r4xetsd1ez1NF9/9R2f9Q6AlxqiZLwUqo7ICOcvEVwopVkXUcspIjEbJk0EVTgT6Cp5+ymzGPT6YNV0ievx4yA==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.13.tgz", + "integrity": "sha512-hKt1bFht/Vtp0xJ0ZVzFMnPy1y1ycmM3KNnp3zsyZfQmw7nhs2WLO4vxdR5YG+6RsHKCb2zbZ3VwlC0Tij0qyA==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.13.tgz", + "integrity": "sha512-ogrVuNi2URocrr3Ps20f075EMm9V7IeenOi9FRj4qdbT6mQlwLuP4l90PW2iBrKERx0oRkcZprEUNsz/3xd7ww==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.13.tgz", + "integrity": "sha512-Agajik9SBGiKD7FPXE+ExW6x3MgA/dUdpZnXa9y1tyfE4lKQx+eQiknSdrBnWPeqa9wL0AOvkhghmYhpVkyqkA==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.13.tgz", + "integrity": "sha512-KxMO3/XihBcHM+xQUM6nQZO1SgQuOsd1DCnKF1a4SIf/i5VD45vrqN3k8ePgFrEbMi7m5JeGmvNqwJXinF0a4Q==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.13.tgz", + "integrity": "sha512-Ez15oqV1vwvZ30cVLeBW14BsWq/fdWNQGMOxxqaSJVQVLqHhvgfQ7gxGDiN9tpJdeQhqJO+Q0r02/Tce5+USNg==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.13.tgz", + "integrity": "sha512-18dLd2L3mda+iFj6sswyBMSh2UwniamD9M4DwPv8VM+9apRFlQ5IGKxBdumnTuOI4NvwwAernmUseWhYQ9k+rg==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.13.tgz", + "integrity": "sha512-qi5n7KwcGViyJeZeQnu8fB6dC3Mlm5PGaqSv2HhQDDx/MPvVfQGNMcv7zcBL4qk3FkuWhGVwXkjQ76x7R0PWlA==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.13.tgz", + "integrity": "sha512-2489Xad9sr+6GD7nB913fUqpCsSwVwgskkQTq4Or2mZntSPYPebyJm8l1YruHo7oqYMTGV6RiwGE4gRo3H+EPQ==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.13.tgz", + "integrity": "sha512-x8KplRu9Y43Px8I9YS+sPBwQ+fw44Mvp2BPVADopKDWz+h3fcj1BvRU58kxb89WObmwKX9sWdtYzepL4Fmx03A==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.13.tgz", + "integrity": "sha512-qhhdWph9FLwD9rVVC/nUf7k2U4NZIA6/mGx0B7+O6PFV0GjmPA2E3zDQ4NUjq9P26E0DeAZy9akH9dYcUBRU7A==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.13.tgz", + "integrity": "sha512-cVWAPKsrRVxI1jCeJHnYSbE3BrEU+pZTZK2gfao9HRxuc+3m4+RLfs3EVEpGLmMKEcWfVCB9wZ3yNxnknutGKQ==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.13.tgz", + "integrity": "sha512-Agb7dbRyZWnmPn5Vvf0eyqaEUqSsaIUwwyInu2EoFTaIDRp093QU2M5alUyOooMLkRbD1WvqQNwx08Z/g+SAcQ==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.13.tgz", + "integrity": "sha512-AqRBIrc/+kl08ahliNG+EyU+j41wIzQfwBTKpi80cCDiYvYFPuXjvzZsD9muiu58Isj0RVni9VgC4xK/AnSW4g==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.13.tgz", + "integrity": "sha512-S4wn2BimuhPcoArRtVrdHUKIymCCZcYAXQE47kUiX4yrUrEX2/ifn5eKNbZ5c1jJKUlh1gC2ESIN+iw3wQax3g==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.13.tgz", + "integrity": "sha512-2c8JWgfUMlQHTdaR5X3xNMwqOyad8kgeCupuVkdm3QkUOzGREjlTETQsK6oHifocYzDCo9FeKcUwsK356SdR+g==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.13.tgz", + "integrity": "sha512-Bwh+PmKD/LK+xBjqIpnYnKYj0fIyQJ0YpRxsn0F+WfzvQ2OA+GKDlf8AHosiCns26Q4Dje388jQVwfOBZ1GaFw==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.13.tgz", + "integrity": "sha512-8wwk6f9XGnhrF94/DBdFM4Xm1JeCyGTCj67r516VS9yvBVQf3Rar54L+XPVDs/oZOokwH+XsktrgkuTMAmjntg==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.13.tgz", + "integrity": "sha512-Jmwbp/5ArLCiRAHC33ODfcrlIcbP/exXkOEUVkADNJC4e/so2jm+i8IQFvVX/lA2GWvK3GdgcN0VFfp9YITAbg==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.13.tgz", + "integrity": "sha512-AX6WjntGjhJHzrPSVvjMD7grxt41koHfAOx6lxLorrpDwwIKKPaGDASPZgvFIZHTbwhOtILW6vAXxYPDsKpDJA==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.13.tgz", + "integrity": "sha512-A+U4gM6OOkPS03UgVU08GTpAAAxPsP/8Z4FmneGo4TaVSD99bK9gVJXlqUEPMO/htFXEAht2O6pX4ErtLY5tVg==", + "optional": true + }, + "@eslint/eslintrc": { + "version": "1.4.1", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@fluent/bundle": { + "version": "0.17.1" + }, + "@fluent/react": { + "version": "0.14.1", + "requires": { + "@fluent/sequence": "^0.7.0", + "cached-iterable": "^0.3.0" + } + }, + "@fluent/sequence": { + "version": "0.7.0", + "requires": {} + }, + "@fontsource/poppins": { + "version": "4.5.10" + }, + "@formatjs/intl-localematcher": { + "version": "0.2.32", + "requires": { + "tslib": "^2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1" + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1" + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1" + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0" + }, + "@jridgewell/set-array": { + "version": "1.1.2" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "peer": 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" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@mgit-at/typescript-flatbuffers-codegen": { + "version": "0.1.3", + "dev": true, + "requires": { + "deep-equal": "^2.0.5", + "ebnf": "^1.9.0", + "ebnf-parser": "^0.1.10", + "execa": "^4.0.0", + "flatbuffers": "^1.12.0", + "pegjs": "^0.10.0", + "ts-node": "^9.1.1", + "typescript": "^4.1.5", + "yargs": "^16.2.0" + }, + "dependencies": { + "flatbuffers": { + "version": "1.12.0", + "dev": true + } + } + }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "requires": { + "eslint-scope": "5.1.1" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0" + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgr/utils": { + "version": "2.3.1", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "dev": true + } + } + }, + "@react-three/fiber": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.10.0.tgz", + "integrity": "sha512-veyvW9clPjS0oQ4g8e2E8yW3v8C2wcXhJp3VyTgjzhpKYAL0xq0+aiofHdpNjx/CiqlR25mYyFky6HskWP3B5w==", + "requires": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.0.8", + "zustand": "^3.7.1" + }, + "dependencies": { + "scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "requires": { + "loose-envify": "^1.1.0" + } + } + } + }, + "@remix-run/router": { + "version": "1.2.1" + }, + "@rushstack/eslint-patch": { + "version": "1.2.0" + }, + "@tailwindcss/forms": { + "version": "0.5.3", + "dev": true, + "requires": { + "mini-svg-data-uri": "^1.2.3" + } + }, + "@tauri-apps/api": { + "version": "1.2.0" + }, + "@tauri-apps/cli": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.2.2.tgz", + "integrity": "sha512-D8zib3A0vWCvPPSyYLxww/OdDlVcY7fpcDVBH6qUvheOjj2aCyU7H9AYMRBwpgCfz8zY5+vomee+laLeB0H13w==", + "dev": true, + "requires": { + "@tauri-apps/cli-darwin-arm64": "1.2.2", + "@tauri-apps/cli-darwin-x64": "1.2.2", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.2.2", + "@tauri-apps/cli-linux-arm64-gnu": "1.2.2", + "@tauri-apps/cli-linux-arm64-musl": "1.2.2", + "@tauri-apps/cli-linux-x64-gnu": "1.2.2", + "@tauri-apps/cli-linux-x64-musl": "1.2.2", + "@tauri-apps/cli-win32-ia32-msvc": "1.2.2", + "@tauri-apps/cli-win32-x64-msvc": "1.2.2" + } + }, + "@tauri-apps/cli-darwin-arm64": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.2.2.tgz", + "integrity": "sha512-W+Cp2weUMlvmGkRJeUjypbz9Lpl6o98xkgKAtobZSum5SNwpsBQfawJTESakNoD+FXyVg/snIk5sRdHge+tAaA==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-darwin-x64": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.2.2.tgz", + "integrity": "sha512-vmVAqt+ECH2d6cbcGJ7ddcCAZgmKe5xmxlL5r4xoaphu7OqU4gnv4VFURYkVltOfwzIFQVOPVSqwYyIDToCYNQ==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.2.2.tgz", + "integrity": "sha512-yYTdQurgi4QZR8z+fANjl522jdQz/VtesFpw+C/A0+zXg7tiRjicsywBDdPsvNzCqFeGKKkmTR+Lny5qxhGaeQ==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-arm64-gnu": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.2.2.tgz", + "integrity": "sha512-ZSOVT6Eq1ay2+27B8KfA0MnpO7KYzONU6TjenH7DNcQki6eWGG5JoNu8QQ9Mdn3dAzY0XBP9i1ZHQOFu4iPtEg==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-arm64-musl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.2.2.tgz", + "integrity": "sha512-/NHSkqNQ+Pr4PshvyD1CeNFaPCaCpe1OeuAQgVi0rboSecC9fXN96G5dQbSBoxOUcCo6f8aTVE7zkZ4WchFVog==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-x64-gnu": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.2.2.tgz", + "integrity": "sha512-4YTmfPuyvlHsvCkATDMwhklfuQm3HKxYXv/IOW9H0ra6pS9efVhrFYIC9Vfv6XaKN85Vnn/FYTEGMJLwCxZw2Q==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-linux-x64-musl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.2.2.tgz", + "integrity": "sha512-wr46tbscwFuCcA931R+ItOiUTT0djMmgKLd1HFCmFF82V9BKE2reIjr6O9l0NCXCo2WeD4pe3jA/Pt1dxDu+JA==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-win32-ia32-msvc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.2.2.tgz", + "integrity": "sha512-6VmbVJOWUZJK5/JKhb3mNFKrKGfq0KV7lJGumfN95WJgkHeyL61p8bZit+o6ZgUGUhrOabkAawhDkrRY+ZQhIw==", + "dev": true, + "optional": true + }, + "@tauri-apps/cli-win32-x64-msvc": { + "version": "1.2.2", + "dev": true, + "optional": true + }, + "@types/eslint": { + "version": "8.4.10", + "peer": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "peer": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "peer": true + }, + "@types/json-schema": { + "version": "7.0.11" + }, + "@types/json5": { + "version": "0.0.29" + }, + "@types/minimatch": { + "version": "3.0.5", + "dev": true + }, + "@types/node": { + "version": "18.11.18", + "peer": true + }, + "@types/parse-json": { + "version": "4.0.0" + }, + "@types/prop-types": { + "version": "15.7.5" + }, + "@types/react": { + "version": "18.0.25", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.0.10", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-modal": { + "version": "3.13.1", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2" + }, + "@types/semver": { + "version": "7.3.13" + }, + "@types/three": { + "version": "0.148.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.148.0.tgz", + "integrity": "sha512-1GiErjt1pJMadO8EhaxNrtULzdn+f3BbM3YTukiiXBVeRvvx4CXc2rpYdEuEBU/ouCX7Rc95j1HoVG9kFQXQJw==", + "dev": true, + "requires": { + "@types/webxr": "*" + } + }, + "@types/webxr": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.0.tgz", + "integrity": "sha512-IUMDPSXnYIbEO2IereEFcgcqfDREOgmbGqtrMpVPpACTU6pltYLwHgVkrnYv0XhWEcjio9sYEfIEzgn3c7nDqA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.48.0", + "requires": { + "@typescript-eslint/scope-manager": "5.48.0", + "@typescript-eslint/type-utils": "5.48.0", + "@typescript-eslint/utils": "5.48.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.48.0", + "requires": { + "@typescript-eslint/utils": "5.48.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.48.0", + "requires": { + "@typescript-eslint/scope-manager": "5.48.0", + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/typescript-estree": "5.48.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.48.0", + "requires": { + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/visitor-keys": "5.48.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.48.0", + "requires": { + "@typescript-eslint/typescript-estree": "5.48.0", + "@typescript-eslint/utils": "5.48.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.48.0" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.48.0", + "requires": { + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/visitor-keys": "5.48.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.48.0", + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.48.0", + "@typescript-eslint/types": "5.48.0", + "@typescript-eslint/typescript-estree": "5.48.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0" + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.48.0", + "requires": { + "@typescript-eslint/types": "5.48.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "peer": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "peer": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "peer": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "peer": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "peer": 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", + "peer": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "peer": 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", + "peer": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "peer": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "peer": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "peer": 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", + "peer": 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", + "peer": 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", + "peer": 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", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "peer": true + }, + "@xtuc/long": { + "version": "4.2.2", + "peer": true + }, + "acorn": { + "version": "8.8.1" + }, + "acorn-import-assertions": { + "version": "1.8.0", + "peer": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "requires": {} + }, + "acorn-node": { + "version": "1.8.2", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "dev": true + }, + "address": { + "version": "1.2.2" + }, + "ajv": { + "version": "6.12.6", + "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", + "requires": {} + }, + "ansi-regex": { + "version": "5.0.1" + }, + "ansi-styles": { + "version": "4.3.0", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "dev": true + }, + "argparse": { + "version": "2.0.1" + }, + "aria-query": { + "version": "4.2.2", + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "array-differ": { + "version": "3.0.0", + "dev": true + }, + "array-includes": { + "version": "3.1.6", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0" + }, + "array.prototype.flat": { + "version": "1.3.1", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "arrify": { + "version": "2.0.1", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7" + }, + "at-least-node": { + "version": "1.0.0" + }, + "autoprefixer": { + "version": "10.4.13", + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "dev": true + }, + "axe-core": { + "version": "4.6.1" + }, + "axobject-query": { + "version": "2.2.0" + }, + "babel-plugin-macros": { + "version": "3.1.0", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "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" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24" + }, + "babel-preset-react-app": { + "version": "10.0.1", + "requires": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "balanced-match": { + "version": "1.0.2" + }, + "big.js": { + "version": "5.2.2" + }, + "binary-extensions": { + "version": "2.2.0" + }, + "brace-expansion": { + "version": "1.1.11", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "buffer-from": { + "version": "1.1.2" + }, + "cached-iterable": { + "version": "0.3.0" + }, + "call-bind": { + "version": "1.0.2", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0" + }, + "camelcase": { + "version": "6.3.0" + }, + "camelcase-css": { + "version": "2.0.1", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001441" + }, + "chalk": { + "version": "4.1.2", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "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" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "peer": true + }, + "classnames": { + "version": "2.3.2" + }, + "cliui": { + "version": "7.0.4", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4" + }, + "commander": { + "version": "2.20.3", + "peer": true + }, + "concat-map": { + "version": "0.0.1" + }, + "confusing-browser-globals": { + "version": "1.0.11" + }, + "convert-source-map": { + "version": "1.9.0" + }, + "core-js-compat": { + "version": "3.27.1", + "requires": { + "browserslist": "^4.21.4" + } + }, + "core-js-pure": { + "version": "3.27.1" + }, + "cosmiconfig": { + "version": "7.1.0", + "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-require": { + "version": "1.1.1", + "dev": true + }, + "cross-env": { + "version": "7.0.3", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-blank-pseudo": { + "version": "3.0.3", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-has-pseudo": { + "version": "3.0.4", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-prefers-color-scheme": { + "version": "6.0.3", + "requires": {} + }, + "cssdb": { + "version": "7.2.0" + }, + "cssesc": { + "version": "3.0.0" + }, + "csstype": { + "version": "3.1.1" + }, + "damerau-levenshtein": { + "version": "1.0.8" + }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "debug": { + "version": "4.3.4", + "requires": { + "ms": "2.1.2" + } + }, + "deep-equal": { + "version": "2.1.0", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.8" + } + }, + "deep-is": { + "version": "0.1.4" + }, + "deepmerge": { + "version": "4.2.2" + }, + "define-lazy-prop": { + "version": "2.0.0" + }, + "define-properties": { + "version": "1.1.4", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "defined": { + "version": "1.0.1", + "dev": true + }, + "detect-port-alt": { + "version": "1.1.6", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0" + } + } + }, + "detective": { + "version": "5.2.1", + "dev": true, + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "didyoumean": { + "version": "1.2.2", + "dev": true + }, + "diff": { + "version": "4.0.2", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "requires": { + "esutils": "^2.0.2" + } + }, + "dotenv": { + "version": "10.0.0" + }, + "dotenv-expand": { + "version": "5.1.0" + }, + "duplexer": { + "version": "0.1.2" + }, + "ebnf": { + "version": "1.9.0", + "dev": true + }, + "ebnf-parser": { + "version": "0.1.10", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.284" + }, + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "emojis-list": { + "version": "3.0.0" + }, + "end-of-stream": { + "version": "1.4.4", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.12.0", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "error-ex": { + "version": "1.3.2", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.20.5", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "es-get-iterator": { + "version": "1.1.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.0", + "has-symbols": "^1.0.1", + "is-arguments": "^1.1.0", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-module-lexer": { + "version": "0.9.3", + "peer": true + }, + "es-shim-unscopables": { + "version": "1.0.0", + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1" + }, + "escape-string-regexp": { + "version": "4.0.0" + }, + "eslint": { + "version": "8.31.0", + "requires": { + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + } + }, + "eslint-config-airbnb": { + "version": "19.0.4", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.6.0", + "dev": true, + "requires": {} + }, + "eslint-config-react-app": { + "version": "7.0.1", + "requires": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-import-resolver-typescript": { + "version": "3.5.2", + "dev": true, + "requires": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.10.0", + "get-tsconfig": "^4.2.0", + "globby": "^13.1.2", + "is-core-module": "^2.10.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.4" + }, + "dependencies": { + "globby": { + "version": "13.1.3", + "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" + } + }, + "slash": { + "version": "4.0.0", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.7.4", + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "8.0.3", + "requires": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.26.0", + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0" + } + } + }, + "eslint-plugin-jest": { + "version": "25.7.0", + "requires": { + "@typescript-eslint/experimental-utils": "^5.0.0" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.6.1", + "requires": { + "@babel/runtime": "^7.18.9", + "aria-query": "^4.2.2", + "array-includes": "^3.1.5", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.4.3", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.2", + "language-tags": "^1.0.5", + "minimatch": "^3.1.2", + "semver": "^6.3.0" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2" + }, + "semver": { + "version": "6.3.0" + } + } + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.31.11", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.0" + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "requires": {} + }, + "eslint-plugin-testing-library": { + "version": "5.9.1", + "requires": { + "@typescript-eslint/utils": "^5.13.0" + } + }, + "eslint-scope": { + "version": "7.1.1", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0" + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0" + }, + "espree": { + "version": "9.4.1", + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.4.0", + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0" + }, + "esutils": { + "version": "2.0.3" + }, + "events": { + "version": "3.3.0", + "peer": true + }, + "execa": { + "version": "4.1.0", + "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" + } + }, + "exenv": { + "version": "1.2.2" + }, + "fast-deep-equal": { + "version": "3.1.3" + }, + "fast-diff": { + "version": "1.2.0", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "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" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0" + }, + "fast-levenshtein": { + "version": "2.0.6" + }, + "fastq": { + "version": "1.15.0", + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.2.0", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "filesize": { + "version": "8.0.7" + }, + "fill-range": { + "version": "7.0.1", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatbuffers": { + "version": "22.12.06" + }, + "flatted": { + "version": "3.2.7" + }, + "for-each": { + "version": "0.3.3", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "schema-utils": { + "version": "2.7.0", + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "tapable": { + "version": "1.1.3" + } + } + }, + "fraction.js": { + "version": "4.2.0" + }, + "fs-extra": { + "version": "10.1.0", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3" + }, + "fs.realpath": { + "version": "1.0.0" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1" + }, + "function.prototype.name": { + "version": "1.1.5", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3" + }, + "gensync": { + "version": "1.0.0-beta.2" + }, + "get-caller-file": { + "version": "2.0.5", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.3", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "5.2.0", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-tsconfig": { + "version": "4.3.0", + "dev": true + }, + "glob": { + "version": "7.2.3", + "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" + } + }, + "glob-parent": { + "version": "6.0.2", + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "peer": true + }, + "global-modules": { + "version": "2.0.0", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "13.19.0", + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalyzer": { + "version": "0.1.0", + "dev": true + }, + "globby": { + "version": "11.1.0", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globrex": { + "version": "0.1.2", + "dev": true + }, + "gopd": { + "version": "1.0.1", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.10" + }, + "grapheme-splitter": { + "version": "1.0.4" + }, + "gzip-size": { + "version": "6.0.0", + "requires": { + "duplexer": "^0.1.2" + } + }, + "harmony-reflect": { + "version": "1.6.2" + }, + "has": { + "version": "1.0.3", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2" + }, + "has-flag": { + "version": "4.0.0" + }, + "has-property-descriptors": { + "version": "1.0.0", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3" + }, + "has-tostringtag": { + "version": "1.0.0", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "human-signals": { + "version": "1.1.1", + "dev": true + }, + "husky": { + "version": "8.0.3", + "dev": true + }, + "identity-obj-proxy": { + "version": "3.0.0", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ignore": { + "version": "5.2.4" + }, + "immer": { + "version": "9.0.17" + }, + "import-fresh": { + "version": "3.3.0", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4" + }, + "inflight": { + "version": "1.0.6", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4" + }, + "ini": { + "version": "1.3.8" + }, + "internal-slot": { + "version": "1.0.4", + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "intl-pluralrules": { + "version": "1.3.1" + }, + "ip-num": { + "version": "1.5.0" + }, + "is-arguments": { + "version": "1.1.1", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1" + }, + "is-bigint": { + "version": "1.0.4", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7" + }, + "is-core-module": { + "version": "2.11.0", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1" + }, + "is-extglob": { + "version": "2.1.1" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-map": { + "version": "2.0.2", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2" + }, + "is-number": { + "version": "7.0.0" + }, + "is-number-object": { + "version": "1.0.7", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3" + }, + "is-regex": { + "version": "1.1.4", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-root": { + "version": "2.1.0" + }, + "is-set": { + "version": "2.0.2", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakmap": { + "version": "2.0.1", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "is-wsl": { + "version": "2.2.0", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "2.0.5", + "dev": true + }, + "isexe": { + "version": "2.0.0" + }, + "its-fine": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.0.8.tgz", + "integrity": "sha512-MagTA9/J6kN3aEQsQu6by3nyrttCm0whCOYo4SfiNzOfYgcr1cb29mJ3zgluaJboaWOL/lHzJeMXi/QGSCfX1Q==", + "requires": { + "@types/react-reconciler": "^0.28.0" + }, + "dependencies": { + "@types/react-reconciler": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.1.tgz", + "integrity": "sha512-ExBHUBykCcDh0HqqlJb6BA1yNpvW2iluIThK9tr1CX2tRMe3HeLt5/ow/bTpKGWoRBE5v/ISXFyjbnHRSKT6ng==", + "requires": { + "@types/react": "*" + } + } + } + }, + "jest-worker": { + "version": "27.5.1", + "peer": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-sdsl": { + "version": "4.2.0" + }, + "js-tokens": { + "version": "4.0.0" + }, + "js-yaml": { + "version": "4.1.0", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2" + }, + "json-parse-even-better-errors": { + "version": "2.3.1" + }, + "json-schema-traverse": { + "version": "0.4.1" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1" + }, + "json5": { + "version": "2.2.3" + }, + "jsonfile": { + "version": "6.1.0", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.3", + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "kind-of": { + "version": "6.0.3" + }, + "kleur": { + "version": "3.0.3" + }, + "language-subtag-registry": { + "version": "0.3.22" + }, + "language-tags": { + "version": "1.0.7", + "requires": { + "language-subtag-registry": "^0.3.20" + } + }, + "levn": { + "version": "0.4.1", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.0.6", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4" + }, + "loader-runner": { + "version": "4.3.0", + "peer": true + }, + "loader-utils": { + "version": "2.0.4", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "6.0.0", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21" + }, + "lodash.debounce": { + "version": "4.0.8" + }, + "lodash.merge": { + "version": "4.6.2" + }, + "loose-envify": { + "version": "1.4.0", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "dev": true + }, + "memfs": { + "version": "3.4.12", + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "merge-stream": { + "version": "2.0.0" + }, + "merge2": { + "version": "1.4.1" + }, + "micromatch": { + "version": "4.0.5", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "peer": true + }, + "mime-types": { + "version": "2.1.35", + "peer": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "dev": true + }, + "mini-svg-data-uri": { + "version": "1.4.4", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7" + }, + "mri": { + "version": "1.2.0", + "dev": true + }, + "ms": { + "version": "2.1.2" + }, + "multimatch": { + "version": "4.0.0", + "dev": 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" + } + }, + "nanoid": { + "version": "3.3.4" + }, + "natural-compare": { + "version": "1.4.0" + }, + "natural-compare-lite": { + "version": "1.4.0" + }, + "neo-async": { + "version": "2.6.2", + "peer": true + }, + "node-releases": { + "version": "2.0.8" + }, + "normalize-path": { + "version": "3.0.0" + }, + "normalize-range": { + "version": "0.1.2" + }, + "npm-run-path": { + "version": "4.0.1", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-assign": { + "version": "4.1.1" + }, + "object-hash": { + "version": "3.0.0", + "dev": true + }, + "object-inspect": { + "version": "1.12.2" + }, + "object-is": { + "version": "1.1.5", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1" + }, + "object.assign": { + "version": "4.1.4", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.hasown": { + "version": "1.1.2", + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "once": { + "version": "1.4.0", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.1", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0" + }, + "parent-module": { + "version": "1.0.1", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "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" + } + }, + "path-exists": { + "version": "4.0.0" + }, + "path-is-absolute": { + "version": "1.0.1" + }, + "path-key": { + "version": "3.1.1" + }, + "path-parse": { + "version": "1.0.7" + }, + "path-type": { + "version": "4.0.0" + }, + "pegjs": { + "version": "0.10.0", + "dev": true + }, + "picocolors": { + "version": "1.0.0" + }, + "picomatch": { + "version": "2.3.1" + }, + "pify": { + "version": "2.3.0", + "dev": true + }, + "pkg-up": { + "version": "3.1.0", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0" + } + } + }, + "postcss": { + "version": "8.4.20", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-attribute-case-insensitive": { + "version": "5.0.2", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-browser-comments": { + "version": "4.0.0", + "requires": {} + }, + "postcss-clamp": { + "version": "4.1.0", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-functional-notation": { + "version": "4.2.4", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-hex-alpha": { + "version": "8.0.4", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.1.1", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "8.0.2", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-properties": { + "version": "12.1.11", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "6.0.3", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-dir-pseudo-class": { + "version": "6.0.5", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-double-position-gradients": { + "version": "3.1.2", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-env-function": { + "version": "4.0.6", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "5.0.2", + "requires": {} + }, + "postcss-focus-visible": { + "version": "6.0.4", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-focus-within": { + "version": "5.0.4", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "requires": {} + }, + "postcss-gap-properties": { + "version": "3.0.5", + "requires": {} + }, + "postcss-image-set-function": { + "version": "4.0.7", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "14.1.0", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "4.0.1", + "requires": {} + }, + "postcss-js": { + "version": "4.0.0", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-lab-function": { + "version": "4.2.1", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-logical": { + "version": "5.0.4", + "requires": {} + }, + "postcss-media-minmax": { + "version": "5.0.0", + "requires": {} + }, + "postcss-nested": { + "version": "6.0.0", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-nesting": { + "version": "10.2.0", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-normalize": { + "version": "10.0.1", + "requires": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + } + }, + "postcss-opacity-percentage": { + "version": "1.1.3", + "requires": {} + }, + "postcss-overflow-shorthand": { + "version": "3.0.4", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-page-break": { + "version": "3.0.4", + "requires": {} + }, + "postcss-place": { + "version": "7.0.5", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "7.8.3", + "requires": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "7.1.6", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "requires": {} + }, + "postcss-selector-not": { + "version": "6.0.1", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0" + }, + "prelude-ls": { + "version": "1.2.1" + }, + "prettier": { + "version": "2.8.1", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-quick": { + "version": "3.1.3", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "execa": "^4.0.0", + "find-up": "^4.1.0", + "ignore": "^5.1.4", + "mri": "^1.1.5", + "multimatch": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "prompts": { + "version": "2.4.2", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "pump": { + "version": "3.0.0", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1" + }, + "queue-microtask": { + "version": "1.2.3" + }, + "quick-lru": { + "version": "5.1.1", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "peer": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "react": { + "version": "18.2.0", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dev-utils": { + "version": "12.0.1", + "requires": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "loader-utils": { + "version": "3.2.1" + } + } + }, + "react-dom": { + "version": "18.2.0", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-error-overlay": { + "version": "6.0.11" + }, + "react-hook-form": { + "version": "7.41.3", + "requires": {} + }, + "react-is": { + "version": "16.13.1" + }, + "react-lifecycles-compat": { + "version": "3.0.4" + }, + "react-modal": { + "version": "3.15.1", + "requires": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + } + }, + "react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "dependencies": { + "scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "requires": { + "loose-envify": "^1.1.0" + } + } + } + }, + "react-refresh": { + "version": "0.14.0" + }, + "react-router": { + "version": "6.6.1", + "requires": { + "@remix-run/router": "1.2.1" + } + }, + "react-router-dom": { + "version": "6.6.1", + "requires": { + "@remix-run/router": "1.2.1", + "react-router": "6.6.1" + } + }, + "react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "requires": { + "debounce": "^1.2.1" + } + }, + "read-cache": { + "version": "1.0.0", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "requires": { + "picomatch": "^2.2.1" + } + }, + "recursive-readdir": { + "version": "2.2.3", + "requires": { + "minimatch": "^3.0.5" + } + }, + "regenerate": { + "version": "1.4.2" + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.11" + }, + "regenerator-transform": { + "version": "0.15.1", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0" + }, + "regexpu-core": { + "version": "5.2.2", + "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.1.0" + } + }, + "regjsgen": { + "version": "0.7.1" + }, + "regjsparser": { + "version": "0.9.1", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0" + } + } + }, + "require-directory": { + "version": "2.1.1", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0" + }, + "reusify": { + "version": "1.0.4" + }, + "rimraf": { + "version": "3.0.2", + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "peer": true + }, + "safe-regex-test": { + "version": "1.0.0", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "sanitize.css": { + "version": "13.0.0" + }, + "scheduler": { + "version": "0.23.0", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.8", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "peer": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0" + }, + "shell-quote": { + "version": "1.7.4" + }, + "side-channel": { + "version": "1.0.4", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "dev": true + }, + "sisteransi": { + "version": "1.0.5" + }, + "slash": { + "version": "3.0.0" + }, + "slimevr-ui": { + "version": "file:gui", + "requires": { + "@fluent/bundle": "^0.17.1", + "@fluent/react": "^0.14.1", + "@fontsource/poppins": "^4.5.8", + "@formatjs/intl-localematcher": "^0.2.32", + "@react-three/fiber": "^8.10.0", + "@tailwindcss/forms": "^0.5.0", + "@tauri-apps/api": "^1.2.0", + "@tauri-apps/cli": "^1.2.2", + "@types/react": "18.0.25", + "@types/react-dom": "^18.0.5", + "@types/react-modal": "3.13.1", + "@types/three": "^0.148.0", + "@typescript-eslint/eslint-plugin": "^5.43.0", + "@typescript-eslint/parser": "^5.43.0", + "@vitejs/plugin-react": "^3.0.0", + "autoprefixer": "^10.4.4", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "classnames": "^2.3.1", + "cross-env": "^7.0.3", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.18.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-prettier": "^8.5.0", + "eslint-config-react-app": "^7.0.0", + "eslint-import-resolver-typescript": "^3.1.1", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.6.0", + "eslint-plugin-prettier": "^4.1.0", + "eslint-plugin-react": "^7.30.1", + "eslint-plugin-react-hooks": "^4.6.0", + "file-loader": "^6.2.0", + "flatbuffers": "^22.10.26", + "fs-extra": "^10.0.0", + "identity-obj-proxy": "^3.0.0", + "intl-pluralrules": "^1.3.1", + "ip-num": "^1.4.1", + "postcss": "^8.4.12", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prettier": "^2.7.1", + "pretty-quick": "^3.1.3", + "prompts": "^2.4.2", + "react": "^18.0.0", + "react-dev-utils": "^12.0.0", + "react-dom": "^18.0.0", + "react-hook-form": "^7.29.0", + "react-modal": "3.15.1", + "react-router-dom": "^6.2.2", + "semver": "^7.3.5", + "solarxr-protocol": "file:../solarxr-protocol", + "tailwindcss": "^3.0.23", + "three": "^0.148.0", + "typescript": "^4.6.3", + "vite": "^4.0.3" + }, + "dependencies": { + "@vitejs/plugin-react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.0.tgz", + "integrity": "sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ==", + "requires": { + "@babel/core": "^7.20.5", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + } + }, + "esbuild": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.13.tgz", + "integrity": "sha512-oYwFdSEIoKM1oYzyem1osgKJAvg5447XF+05ava21fOtilyb2HeQQh26/74K4WeAk5dZmj/Mx10zUqUnI14jhA==", + "requires": { + "@esbuild/android-arm": "0.16.13", + "@esbuild/android-arm64": "0.16.13", + "@esbuild/android-x64": "0.16.13", + "@esbuild/darwin-arm64": "0.16.13", + "@esbuild/darwin-x64": "0.16.13", + "@esbuild/freebsd-arm64": "0.16.13", + "@esbuild/freebsd-x64": "0.16.13", + "@esbuild/linux-arm": "0.16.13", + "@esbuild/linux-arm64": "0.16.13", + "@esbuild/linux-ia32": "0.16.13", + "@esbuild/linux-loong64": "0.16.13", + "@esbuild/linux-mips64el": "0.16.13", + "@esbuild/linux-ppc64": "0.16.13", + "@esbuild/linux-riscv64": "0.16.13", + "@esbuild/linux-s390x": "0.16.13", + "@esbuild/linux-x64": "0.16.13", + "@esbuild/netbsd-x64": "0.16.13", + "@esbuild/openbsd-x64": "0.16.13", + "@esbuild/sunos-x64": "0.16.13", + "@esbuild/win32-arm64": "0.16.13", + "@esbuild/win32-ia32": "0.16.13", + "@esbuild/win32-x64": "0.16.13" + } + }, + "magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "rollup": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.9.1.tgz", + "integrity": "sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "vite": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "requires": { + "esbuild": "^0.16.3", + "fsevents": "~2.3.2", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + } + } + } + }, + "solarxr-protocol": { + "version": "file:solarxr-protocol", + "requires": { + "@mgit-at/typescript-flatbuffers-codegen": "^0.1.3", + "flatbuffers": "^22.10.26", + "typescript": "4.8.4" + }, + "dependencies": { + "typescript": { + "version": "4.8.4", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1" + }, + "source-map-js": { + "version": "1.0.2" + }, + "source-map-support": { + "version": "0.5.21", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-natural-compare": { + "version": "3.0.1" + }, + "string-width": { + "version": "4.2.3", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.matchall": { + "version": "4.0.8", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-ansi": { + "version": "6.0.1", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0" + }, + "strip-final-newline": { + "version": "2.0.0", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1" + }, + "supports-color": { + "version": "7.2.0", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0" + }, + "suspend-react": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.0.8.tgz", + "integrity": "sha512-ZC3r8Hu1y0dIThzsGw0RLZplnX9yXwfItcvaIzJc2VQVi8TGyGDlu92syMB5ulybfvGLHAI5Ghzlk23UBPF8xg==", + "requires": {} + }, + "synckit": { + "version": "0.8.4", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "dev": true + } + } + }, + "tailwindcss": { + "version": "3.2.4", + "dev": true, + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "arg": { + "version": "5.0.2", + "dev": true + } + } + }, + "tapable": { + "version": "2.2.1" + }, + "terser": { + "version": "5.16.1", + "peer": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "peer": 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" + } + }, + "text-table": { + "version": "0.2.0" + }, + "three": { + "version": "0.148.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.148.0.tgz", + "integrity": "sha512-8uzVV+qhTPi0bOFs/3te3RW6hb3urL8jYEl6irjCWo/l6sr8MPNMcClFev/MMYeIxr0gmDcoXTy/8LXh/LXkfw==" + }, + "tiny-glob": { + "version": "0.2.9", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "to-fast-properties": { + "version": "2.0.0" + }, + "to-regex-range": { + "version": "5.0.1", + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-node": { + "version": "9.1.1", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "tsconfig-paths": { + "version": "3.14.1", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "tslib": { + "version": "1.14.1" + }, + "tsutils": { + "version": "3.21.0", + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2" + }, + "typescript": { + "version": "4.9.4" + }, + "unbox-primitive": { + "version": "1.0.2", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0" + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0" + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0" + }, + "universalify": { + "version": "2.0.0" + }, + "update-browserslist-db": { + "version": "1.0.10", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2" + }, + "warning": { + "version": "4.0.3", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "2.4.0", + "peer": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.75.0", + "peer": 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": { + "eslint-scope": { + "version": "5.1.1", + "peer": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "peer": true + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "peer": true + }, + "which": { + "version": "2.0.2", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-collection": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.9", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "word-wrap": { + "version": "1.2.3" + }, + "wrap-ansi": { + "version": "7.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2" + }, + "xtend": { + "version": "4.0.2", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "dev": true + }, + "yallist": { + "version": "4.0.0" + }, + "yaml": { + "version": "1.10.2" + }, + "yargs": { + "version": "16.2.0", + "dev": 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.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "dev": true + }, + "yn": { + "version": "3.1.1", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0" + }, + "zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "requires": {} + } } }