From 5d39a05a0f351ef95859240345fc20a5e120280b Mon Sep 17 00:00:00 2001 From: Aamir Shah Date: Tue, 1 Aug 2023 14:56:10 +0500 Subject: [PATCH 01/35] feat: v2 --- package.json | 2 +- v2/.eslintrc.js | 22 + v2/.gitignore | 30 + v2/.markdownlint.json | 11 + v2/.prettierignore | 19 + v2/.prettierrc.json | 3 + v2/README.md | 41 + v2/babel.config.js | 3 + v2/demo-snippets/index.ts | 3 + v2/demo-snippets/misc.ts | 64 + v2/demo-snippets/tsconfig.json | 63 + v2/demo-snippets/tutorials/cameras/index.ts | 47 + v2/demo-snippets/tutorials/cameras/module.ts | 16 + v2/demo-snippets/tutorials/cameras/orhto.ts | 16 + v2/demo-snippets/tutorials/cameras/pinhole.ts | 8 + .../tutorials/clipping_volumes/box.ts | 80 + .../tutorials/clipping_volumes/dual.ts | 76 + .../tutorials/clipping_volumes/flipped.ts | 75 + .../tutorials/clipping_volumes/index.ts | 20 + .../tutorials/clipping_volumes/offset.ts | 75 + .../tutorials/clipping_volumes/rotated.ts | 84 + .../tutorials/clipping_volumes/single.ts | 73 + .../tutorials/clipping_volumes/slab.ts | 76 + .../tutorials/clipping_volumes/slab_inv.ts | 76 + .../tutorials/drawing2D/drawing_2d.ts | 423 + v2/demo-snippets/tutorials/drawing2D/index.ts | 6 + .../dynamic_objects/dynamic_object.ts | 70 + .../tutorials/dynamic_objects/index.ts | 6 + .../tutorials/getting_started/basic_condos.ts | 92 + .../getting_started/basic_condos_1.ts | 61 + .../tutorials/getting_started/basic_cube.ts | 61 + .../tutorials/getting_started/index.ts | 11 + v2/demo-snippets/tutorials/index.ts | 12 + .../tutorials/loading_scenes/index.ts | 8 + .../tutorials/loading_scenes/private_scene.ts | 141 + .../tutorials/loading_scenes/public_scene.ts | 103 + v2/demo-snippets/tutorials/measure/index.ts | 6 + .../tutorials/measure/parametric_measure.ts | 105 + .../tutorials/minimap/basic_minimap.ts | 722 + v2/demo-snippets/tutorials/minimap/index.ts | 6 + .../tutorials/object_groups/floors.ts | 198 + .../tutorials/object_groups/index.ts | 6 + .../tutorials/object_metadata/fly_to.ts | 213 + .../tutorials/object_metadata/index.ts | 10 + .../object_metadata/metadata_from_pick.ts | 152 + .../object_metadata/metadata_from_search.ts | 160 + .../tutorials/object_selection/index.ts | 6 + .../tutorials/object_selection/pick.ts | 107 + .../tutorials/pdf_placement/index.ts | 7 + .../tutorials/pdf_placement/pdf_placement.ts | 419 + .../tutorials/searching/exact_search.ts | 134 + .../exact_search_excluding_result.ts | 134 + .../tutorials/searching/fluffy_search.ts | 133 + v2/demo-snippets/tutorials/searching/index.ts | 13 + .../tutorials/searching/search_by_path.ts | 136 + v2/demo-snippets/typings.d.ts | 17 + v2/docs/test.ts | 36 + v2/docs/tutorials/clipping_volumes.mdx | 106 + v2/docs/tutorials/drawing2D.mdx | 102 + v2/docs/tutorials/dynamic_objects.mdx | 85 + v2/docs/tutorials/getting_started.mdx | 223 + v2/docs/tutorials/loading_scenes.mdx | 50 + v2/docs/tutorials/minimap.mdx | 773 + v2/docs/tutorials/object_groups.mdx | 120 + v2/docs/tutorials/object_metadata.mdx | 36 + v2/docs/tutorials/object_selection.mdx | 72 + v2/docs/tutorials/parametric_measure.mdx | 71 + v2/docs/tutorials/placing_pdf.mdx | 163 + v2/docs/tutorials/searching.mdx | 39 + v2/docusaurus.config.js | 264 + v2/package-lock.json | 17654 ++++++++++++++++ v2/package.json | 95 + v2/sidebars.js | 71 + .../components/MonacoWrapper/index.styles.css | 89 + v2/src/components/MonacoWrapper/index.tsx | 687 + .../PlaygroundComponent/index.styles.css | 58 + .../components/PlaygroundComponent/index.tsx | 88 + v2/src/components/Renderer/index.tsx | 223 + v2/src/components/misc/spinner/index.tsx | 6 + .../components/misc/spinner/styles.module.css | 28 + v2/src/css/custom.css | 212 + v2/src/pages/about/about.module.css | 10 + v2/src/pages/about/index.tsx | 16 + v2/src/pages/data-rest-api/index.css | 10670 ++++++++++ v2/src/pages/data-rest-api/index.tsx | 147 + v2/src/pages/index.module.css | 168 + v2/src/pages/index.tsx | 167 + v2/src/pages/playground/index.tsx | 118 + v2/src/pages/playground/run/index.tsx | 53 + v2/src/plugins.js | 74 + v2/src/theme/CustomCodeblock/index.tsx | 41 + v2/src/theme/MDXComponents.js | 12 + v2/src/theme/Root.tsx | 83 + v2/src/theme/context.ts | 6 + v2/src/theme/prism-include-languages.d.ts | 2 + v2/src/theme/prism-include-languages.js | 20 + v2/static/.nojekyll | 0 .../5cff54de-5133-4369-8680-52d2723eb756.jpg | Bin 0 -> 62559 bytes .../assets/demo-screenshots/basic_condos.png | Bin 0 -> 14811 bytes .../demo-screenshots/basic_condos_1.png | Bin 0 -> 55784 bytes .../assets/demo-screenshots/basic_cube.png | Bin 0 -> 8071 bytes .../assets/demo-screenshots/basic_minimap.png | Bin 0 -> 442732 bytes v2/static/assets/demo-screenshots/box.png | Bin 0 -> 12722 bytes .../assets/demo-screenshots/drawing_2d.png | Bin 0 -> 23645 bytes v2/static/assets/demo-screenshots/dual.png | Bin 0 -> 12304 bytes .../demo-screenshots/dynamic_object.png | Bin 0 -> 30254 bytes .../assets/demo-screenshots/exactSearch.png | Bin 0 -> 12609 bytes .../exactSearchExcludingResult.png | Bin 0 -> 34050 bytes v2/static/assets/demo-screenshots/flipped.png | Bin 0 -> 17889 bytes v2/static/assets/demo-screenshots/floors.png | Bin 0 -> 33499 bytes .../assets/demo-screenshots/fluffySearch.png | Bin 0 -> 12609 bytes v2/static/assets/demo-screenshots/fly_to.png | Bin 0 -> 52547 bytes .../demo-screenshots/metadata_from_pick.png | Bin 0 -> 34061 bytes .../demo-screenshots/metadata_from_search.png | Bin 0 -> 33966 bytes v2/static/assets/demo-screenshots/offset.png | Bin 0 -> 19674 bytes .../demo-screenshots/parametric_measure.png | Bin 0 -> 23645 bytes .../assets/demo-screenshots/pdf_placement.png | Bin 0 -> 97904 bytes v2/static/assets/demo-screenshots/pick.png | Bin 0 -> 55047 bytes .../assets/demo-screenshots/private_scene.png | Bin 0 -> 34474 bytes .../assets/demo-screenshots/public_scene.png | Bin 0 -> 34061 bytes v2/static/assets/demo-screenshots/rotated.png | Bin 0 -> 17574 bytes .../assets/demo-screenshots/searchByPath.png | Bin 0 -> 22648 bytes v2/static/assets/demo-screenshots/single.png | Bin 0 -> 18835 bytes v2/static/assets/demo-screenshots/slab.png | Bin 0 -> 18140 bytes .../assets/demo-screenshots/slab_inv.png | Bin 0 -> 23034 bytes .../playground-demo-placeholder-dark.jpg | Bin 0 -> 25939 bytes .../assets/playground-placeholder-dark.png | Bin 0 -> 85477 bytes .../assets/playground-placeholder-light.png | Bin 0 -> 85530 bytes v2/static/img/albums-outline.svg | 1 + v2/static/img/card_waves.svg | 1 + v2/static/img/code-slash-outline.svg | 1 + v2/static/img/favicon.ico | Bin 0 -> 7802 bytes v2/static/img/globe-outline.svg | 1 + v2/static/img/hardware-chip-outline.svg | 1 + v2/static/img/landscape-portrait.svg | 11 + v2/static/img/local_esm.png | Bin 0 -> 7680 bytes v2/static/img/novorender_logo_RGB_2021.png | Bin 0 -> 5182 bytes .../img/novorender_logo_RGB_2021_white.png | Bin 0 -> 4885 bytes v2/static/img/share-social-outline.svg | 1 + v2/static/img/vite.png | Bin 0 -> 7982 bytes v2/static/img/waves.svg | 1 + v2/static/img/waves_inverted.svg | 1 + v2/static/img/webpack.png | Bin 0 -> 15900 bytes v2/static/img/webpack_typescript.png | Bin 0 -> 8235 bytes v2/tsconfig.json | 7 + v2/type-definitions/data-js-api.ts | 1 + v2/type-definitions/measure-api.ts | 1 + v2/type-definitions/tsconfig.json | 7 + v2/type-definitions/webgl-api.ts | 1 + v2/typings.d.ts | 1 + 150 files changed, 37635 insertions(+), 1 deletion(-) create mode 100644 v2/.eslintrc.js create mode 100644 v2/.gitignore create mode 100644 v2/.markdownlint.json create mode 100644 v2/.prettierignore create mode 100644 v2/.prettierrc.json create mode 100644 v2/README.md create mode 100644 v2/babel.config.js create mode 100644 v2/demo-snippets/index.ts create mode 100644 v2/demo-snippets/misc.ts create mode 100644 v2/demo-snippets/tsconfig.json create mode 100644 v2/demo-snippets/tutorials/cameras/index.ts create mode 100644 v2/demo-snippets/tutorials/cameras/module.ts create mode 100644 v2/demo-snippets/tutorials/cameras/orhto.ts create mode 100644 v2/demo-snippets/tutorials/cameras/pinhole.ts create mode 100644 v2/demo-snippets/tutorials/clipping_volumes/box.ts create mode 100644 v2/demo-snippets/tutorials/clipping_volumes/dual.ts create mode 100644 v2/demo-snippets/tutorials/clipping_volumes/flipped.ts create mode 100644 v2/demo-snippets/tutorials/clipping_volumes/index.ts create mode 100644 v2/demo-snippets/tutorials/clipping_volumes/offset.ts create mode 100644 v2/demo-snippets/tutorials/clipping_volumes/rotated.ts create mode 100644 v2/demo-snippets/tutorials/clipping_volumes/single.ts create mode 100644 v2/demo-snippets/tutorials/clipping_volumes/slab.ts create mode 100644 v2/demo-snippets/tutorials/clipping_volumes/slab_inv.ts create mode 100644 v2/demo-snippets/tutorials/drawing2D/drawing_2d.ts create mode 100644 v2/demo-snippets/tutorials/drawing2D/index.ts create mode 100644 v2/demo-snippets/tutorials/dynamic_objects/dynamic_object.ts create mode 100644 v2/demo-snippets/tutorials/dynamic_objects/index.ts create mode 100644 v2/demo-snippets/tutorials/getting_started/basic_condos.ts create mode 100644 v2/demo-snippets/tutorials/getting_started/basic_condos_1.ts create mode 100644 v2/demo-snippets/tutorials/getting_started/basic_cube.ts create mode 100644 v2/demo-snippets/tutorials/getting_started/index.ts create mode 100644 v2/demo-snippets/tutorials/index.ts create mode 100644 v2/demo-snippets/tutorials/loading_scenes/index.ts create mode 100644 v2/demo-snippets/tutorials/loading_scenes/private_scene.ts create mode 100644 v2/demo-snippets/tutorials/loading_scenes/public_scene.ts create mode 100644 v2/demo-snippets/tutorials/measure/index.ts create mode 100644 v2/demo-snippets/tutorials/measure/parametric_measure.ts create mode 100644 v2/demo-snippets/tutorials/minimap/basic_minimap.ts create mode 100644 v2/demo-snippets/tutorials/minimap/index.ts create mode 100644 v2/demo-snippets/tutorials/object_groups/floors.ts create mode 100644 v2/demo-snippets/tutorials/object_groups/index.ts create mode 100644 v2/demo-snippets/tutorials/object_metadata/fly_to.ts create mode 100644 v2/demo-snippets/tutorials/object_metadata/index.ts create mode 100644 v2/demo-snippets/tutorials/object_metadata/metadata_from_pick.ts create mode 100644 v2/demo-snippets/tutorials/object_metadata/metadata_from_search.ts create mode 100644 v2/demo-snippets/tutorials/object_selection/index.ts create mode 100644 v2/demo-snippets/tutorials/object_selection/pick.ts create mode 100644 v2/demo-snippets/tutorials/pdf_placement/index.ts create mode 100644 v2/demo-snippets/tutorials/pdf_placement/pdf_placement.ts create mode 100644 v2/demo-snippets/tutorials/searching/exact_search.ts create mode 100644 v2/demo-snippets/tutorials/searching/exact_search_excluding_result.ts create mode 100644 v2/demo-snippets/tutorials/searching/fluffy_search.ts create mode 100644 v2/demo-snippets/tutorials/searching/index.ts create mode 100644 v2/demo-snippets/tutorials/searching/search_by_path.ts create mode 100644 v2/demo-snippets/typings.d.ts create mode 100644 v2/docs/test.ts create mode 100644 v2/docs/tutorials/clipping_volumes.mdx create mode 100644 v2/docs/tutorials/drawing2D.mdx create mode 100644 v2/docs/tutorials/dynamic_objects.mdx create mode 100644 v2/docs/tutorials/getting_started.mdx create mode 100644 v2/docs/tutorials/loading_scenes.mdx create mode 100644 v2/docs/tutorials/minimap.mdx create mode 100644 v2/docs/tutorials/object_groups.mdx create mode 100644 v2/docs/tutorials/object_metadata.mdx create mode 100644 v2/docs/tutorials/object_selection.mdx create mode 100644 v2/docs/tutorials/parametric_measure.mdx create mode 100644 v2/docs/tutorials/placing_pdf.mdx create mode 100644 v2/docs/tutorials/searching.mdx create mode 100644 v2/docusaurus.config.js create mode 100644 v2/package-lock.json create mode 100644 v2/package.json create mode 100644 v2/sidebars.js create mode 100644 v2/src/components/MonacoWrapper/index.styles.css create mode 100644 v2/src/components/MonacoWrapper/index.tsx create mode 100644 v2/src/components/PlaygroundComponent/index.styles.css create mode 100644 v2/src/components/PlaygroundComponent/index.tsx create mode 100644 v2/src/components/Renderer/index.tsx create mode 100644 v2/src/components/misc/spinner/index.tsx create mode 100644 v2/src/components/misc/spinner/styles.module.css create mode 100644 v2/src/css/custom.css create mode 100644 v2/src/pages/about/about.module.css create mode 100644 v2/src/pages/about/index.tsx create mode 100644 v2/src/pages/data-rest-api/index.css create mode 100644 v2/src/pages/data-rest-api/index.tsx create mode 100644 v2/src/pages/index.module.css create mode 100644 v2/src/pages/index.tsx create mode 100644 v2/src/pages/playground/index.tsx create mode 100644 v2/src/pages/playground/run/index.tsx create mode 100644 v2/src/plugins.js create mode 100644 v2/src/theme/CustomCodeblock/index.tsx create mode 100644 v2/src/theme/MDXComponents.js create mode 100644 v2/src/theme/Root.tsx create mode 100644 v2/src/theme/context.ts create mode 100644 v2/src/theme/prism-include-languages.d.ts create mode 100644 v2/src/theme/prism-include-languages.js create mode 100644 v2/static/.nojekyll create mode 100644 v2/static/assets/5cff54de-5133-4369-8680-52d2723eb756.jpg create mode 100644 v2/static/assets/demo-screenshots/basic_condos.png create mode 100644 v2/static/assets/demo-screenshots/basic_condos_1.png create mode 100644 v2/static/assets/demo-screenshots/basic_cube.png create mode 100644 v2/static/assets/demo-screenshots/basic_minimap.png create mode 100644 v2/static/assets/demo-screenshots/box.png create mode 100644 v2/static/assets/demo-screenshots/drawing_2d.png create mode 100644 v2/static/assets/demo-screenshots/dual.png create mode 100644 v2/static/assets/demo-screenshots/dynamic_object.png create mode 100644 v2/static/assets/demo-screenshots/exactSearch.png create mode 100644 v2/static/assets/demo-screenshots/exactSearchExcludingResult.png create mode 100644 v2/static/assets/demo-screenshots/flipped.png create mode 100644 v2/static/assets/demo-screenshots/floors.png create mode 100644 v2/static/assets/demo-screenshots/fluffySearch.png create mode 100644 v2/static/assets/demo-screenshots/fly_to.png create mode 100644 v2/static/assets/demo-screenshots/metadata_from_pick.png create mode 100644 v2/static/assets/demo-screenshots/metadata_from_search.png create mode 100644 v2/static/assets/demo-screenshots/offset.png create mode 100644 v2/static/assets/demo-screenshots/parametric_measure.png create mode 100644 v2/static/assets/demo-screenshots/pdf_placement.png create mode 100644 v2/static/assets/demo-screenshots/pick.png create mode 100644 v2/static/assets/demo-screenshots/private_scene.png create mode 100644 v2/static/assets/demo-screenshots/public_scene.png create mode 100644 v2/static/assets/demo-screenshots/rotated.png create mode 100644 v2/static/assets/demo-screenshots/searchByPath.png create mode 100644 v2/static/assets/demo-screenshots/single.png create mode 100644 v2/static/assets/demo-screenshots/slab.png create mode 100644 v2/static/assets/demo-screenshots/slab_inv.png create mode 100644 v2/static/assets/playground-demo-placeholder-dark.jpg create mode 100644 v2/static/assets/playground-placeholder-dark.png create mode 100644 v2/static/assets/playground-placeholder-light.png create mode 100644 v2/static/img/albums-outline.svg create mode 100644 v2/static/img/card_waves.svg create mode 100644 v2/static/img/code-slash-outline.svg create mode 100644 v2/static/img/favicon.ico create mode 100644 v2/static/img/globe-outline.svg create mode 100644 v2/static/img/hardware-chip-outline.svg create mode 100644 v2/static/img/landscape-portrait.svg create mode 100644 v2/static/img/local_esm.png create mode 100644 v2/static/img/novorender_logo_RGB_2021.png create mode 100644 v2/static/img/novorender_logo_RGB_2021_white.png create mode 100644 v2/static/img/share-social-outline.svg create mode 100644 v2/static/img/vite.png create mode 100644 v2/static/img/waves.svg create mode 100644 v2/static/img/waves_inverted.svg create mode 100644 v2/static/img/webpack.png create mode 100644 v2/static/img/webpack_typescript.png create mode 100644 v2/tsconfig.json create mode 100644 v2/type-definitions/data-js-api.ts create mode 100644 v2/type-definitions/measure-api.ts create mode 100644 v2/type-definitions/tsconfig.json create mode 100644 v2/type-definitions/webgl-api.ts create mode 100644 v2/typings.d.ts diff --git a/package.json b/package.json index ce53769..7f00ca0 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "scripts": { "docusaurus": "docusaurus", "start": "docusaurus start", - "build": "npm run validate-snippets && docusaurus build", + "build": "npm run validate-snippets && docusaurus build && cd v2/ && npm run build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", diff --git a/v2/.eslintrc.js b/v2/.eslintrc.js new file mode 100644 index 0000000..5a13e8a --- /dev/null +++ b/v2/.eslintrc.js @@ -0,0 +1,22 @@ +module.exports = { + env: { + browser: true, + es2021: true, + }, + extends: ["eslint:recommended", "plugin:react/recommended", "plugin:@typescript-eslint/recommended", "plugin:@docusaurus/recommended", "prettier"], + overrides: [], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + }, + plugins: ["react", "@typescript-eslint"], + rules: {}, + settings: { + react: { + version: "detect", // React version. "detect" automatically picks the version you have installed. + // You can also use `16.0`, `16.3`, etc, if you want to override the detected value. + // It will default to "latest" and warn if missing, and to "detect" in the future + }, + }, +}; diff --git a/v2/.gitignore b/v2/.gitignore new file mode 100644 index 0000000..b92fe71 --- /dev/null +++ b/v2/.gitignore @@ -0,0 +1,30 @@ +# Dependencies +/node_modules + +# Production +/build +/docs/api +/docs/webgl-api +/docs/data-js-api +/docs/measure-api + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +docusaurus-theme-github-codeblock-main + +scene-screenshot-gen/index.js +demo-snippets/**/*.js +src/shared/*.js \ No newline at end of file diff --git a/v2/.markdownlint.json b/v2/.markdownlint.json new file mode 100644 index 0000000..47bf4ca --- /dev/null +++ b/v2/.markdownlint.json @@ -0,0 +1,11 @@ +{ + "MD013": { + "line_length": 100000 + }, + "MD033": { + "allowed_elements": [ + "img", + "br" + ] + } +} \ No newline at end of file diff --git a/v2/.prettierignore b/v2/.prettierignore new file mode 100644 index 0000000..7a59092 --- /dev/null +++ b/v2/.prettierignore @@ -0,0 +1,19 @@ +# Ignore artifacts: +.docusaurus/* +.git +.github +.husky +.vscode +.markdownlint.json +build +coverage +blog +scene-screenshot-gen +static +type-definitions +LICENSE +typings.d.ts +tsconfig.json +docs/data-js-api +docs/measure-api +docs/webgl-api \ No newline at end of file diff --git a/v2/.prettierrc.json b/v2/.prettierrc.json new file mode 100644 index 0000000..e22ca52 --- /dev/null +++ b/v2/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "printWidth": 280 +} diff --git a/v2/README.md b/v2/README.md new file mode 100644 index 0000000..aaba2fa --- /dev/null +++ b/v2/README.md @@ -0,0 +1,41 @@ +# Website + +This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +Using SSH: + +``` +$ USE_SSH=true yarn deploy +``` + +Not using SSH: + +``` +$ GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/v2/babel.config.js b/v2/babel.config.js new file mode 100644 index 0000000..bfd75db --- /dev/null +++ b/v2/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve("@docusaurus/core/lib/babel/preset")], +}; diff --git a/v2/demo-snippets/index.ts b/v2/demo-snippets/index.ts new file mode 100644 index 0000000..509b9d3 --- /dev/null +++ b/v2/demo-snippets/index.ts @@ -0,0 +1,3 @@ +import * as tutorials from "./tutorials"; + +export { tutorials }; diff --git a/v2/demo-snippets/misc.ts b/v2/demo-snippets/misc.ts new file mode 100644 index 0000000..ed3eab7 --- /dev/null +++ b/v2/demo-snippets/misc.ts @@ -0,0 +1,64 @@ +import type { IPosition } from "monaco-editor"; + +export type IDemo = Record; + +export interface IEditorConfig { + /** should playground start automatically? defaults to `true` */ + clickToRun?: boolean; + /** whether to enable a secondary canvas for 2D or not, defaults to `true` */ + canvas2D?: boolean; + /** whether to enable a third canvas for 2D image preview or not, defaults to `false` */ + enablePreviewCanvas?: boolean; + /** using `fill` will make the playground to take entire viewport's width and height, `inline` is default */ + mode?: "inline" | "fill"; + /** Set the primary position of the cursor (https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IEditor.html#setPosition)*/ + cursorPosition?: IPosition; + /** Scroll vertically as necessary and reveal a line close to the top of the viewport (https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IEditor.html#revealLineNearTop) */ + revealLine?: number; + /** Lines to hide in the editor + * @deprecated use `// HiddenRangeStarted` and `// HiddenRangeEnded` within snippets. + * see usage example below: + * ``` + * // HiddenRangeStarted + * some code that needs to be hidden + * another line of code that will also be hidden.... + * // HiddenRangeEnded + * ``` + */ + hiddenAreas?: Array<{ startLineNumber: number; endLineNumber: number }>; +} +export interface IDempProps { + /** Directory that contains this demo, e.g. `getting_started/condos.ts`, `getting_started` is the dirName here */ + dirName: string; + /** A friendly name for the demo (must be unique) */ + demoName: string; + /** editor config */ + editorConfig: IEditorConfig; + /** Github edit URL, should be relative path e.g. `demo-snippets/tutorials/clipping_volumes/box.ts` */ + editUrl: string; + code: string; + /** preview image URL for the playground, sample: `assets/demo-screenshots/imageName.png` */ + previewImageUrl?: string; + /** short description for this demo */ + description: string; +} + +export function demo(dirName: string, demoName: T, code: string, config: IEditorConfig = {}, desc?: string): IDemo { + return { + [demoName]: { + dirName, + demoName, + editorConfig: { + clickToRun: true, + mode: "inline", + canvas2D: true, + enablePreviewCanvas: false, + ...config, + }, + code, + editUrl: `demo-snippets/tutorials/${dirName}/${demoName}.ts`, + previewImageUrl: `/assets/demo-screenshots/${demoName}.png`, + description: desc || "No Description Available", + } as const, + } as const; +} diff --git a/v2/demo-snippets/tsconfig.json b/v2/demo-snippets/tsconfig.json new file mode 100644 index 0000000..8dcac21 --- /dev/null +++ b/v2/demo-snippets/tsconfig.json @@ -0,0 +1,63 @@ +{ + // "include": ["./**/*"], + "compilerOptions": { + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ESNext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "../", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "../", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": ["../"], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + /* Advanced Options */ + "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ + "skipLibCheck": true, + // "noResolve": true + }, +} \ No newline at end of file diff --git a/v2/demo-snippets/tutorials/cameras/index.ts b/v2/demo-snippets/tutorials/cameras/index.ts new file mode 100644 index 0000000..db55d47 --- /dev/null +++ b/v2/demo-snippets/tutorials/cameras/index.ts @@ -0,0 +1,47 @@ +import moduleInterface from "!!./snippet.ts?raw"; +import pinhole from "!!./pick.ts?raw"; +import ortho from "!!./pick.ts?raw"; +import { demo } from "../../misc"; +import * as NovoRender from "@novorender/webgl-api"; +import type { SnippetModule } from "./module"; + +export const objectSelection = { + ...demo("cameras", "pinhole", pinhole), + ...demo("cameras", "ortho", ortho), +}; + +// this function will run entire demo and call into playground snippet for editable code. +async function run(canvas: HTMLCanvasElement, snippet: SnippetModule, state: { readonly exit: boolean }) { + const ctx = canvas.getContext("bitmaprenderer"); + const noOffscreenCanvas = !("OffscreenCanvas" in self); + const webglAPI = NovoRender.createAPI({ noOffscreenCanvas }); + const view = await webglAPI.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // we interact with snippet module here, but could also interact elsewhere with other function, e.g. in render loop or on mouse clicks etc. + view.camera.controller = snippet.init(canvas, webglAPI); + + view.scene = await webglAPI.loadScene(NovoRender.WellKnownSceneUrls.empty); + for (;;) { + if (state.exit) break; + function cb() { + if (state.exit) view.invalidateCamera(); // force a re-render to exit the render() function (TODO: make it a return value instead?) + } + + // handle canvas resizes + const { clientWidth, clientHeight } = canvas; + view.applySettings({ + display: { width: clientWidth, height: clientHeight }, + }); + const output = await view.render(cb); + { + const image = await output.getImage(); + if (image) { + ctx?.transferFromImageBitmap(image); + } + image?.close(); + } + } + + // clean up here + webglAPI.dispose(); +} diff --git a/v2/demo-snippets/tutorials/cameras/module.ts b/v2/demo-snippets/tutorials/cameras/module.ts new file mode 100644 index 0000000..c32dbb5 --- /dev/null +++ b/v2/demo-snippets/tutorials/cameras/module.ts @@ -0,0 +1,16 @@ +// This file should be imported into the playground +import * as NovoRender from "@novorender/webgl-api"; + +export interface InitInput { + readonly canvas: HTMLCanvasElement; + readonly webglAPI: NovoRender.API; + readonly view: NovoRender.View; +} + +export interface InitOutput { + readonly controller: NovoRender.CameraController; +} + +export interface SnippetModule { + init(canvas: HTMLCanvasElement, webglAPI: NovoRender.API): NovoRender.CameraController; +} diff --git a/v2/demo-snippets/tutorials/cameras/orhto.ts b/v2/demo-snippets/tutorials/cameras/orhto.ts new file mode 100644 index 0000000..264c34e --- /dev/null +++ b/v2/demo-snippets/tutorials/cameras/orhto.ts @@ -0,0 +1,16 @@ +// ideally a snippet looks like this, while still being type checked against the module interface. +import type * as NovoRender from "@novorender/webgl-api"; // should we only use type imports here and pass everything else as params? +export function init(canvas: HTMLCanvasElement, webglAPI: NovoRender.API) { + return webglAPI.createCameraController({ kind: "ortho" }, canvas); +} + +// Below is an alternative syntax that could be used to enforce module interface, which might be easier to do. +// The import and export const statements should be omitted, leaving only the "inner" parts of the objects to be edited. +// Quite possibly, we could drag in all imports from the snippet.ts file itself, so that everything is already in scope and no import statements needed in the snippet itself. + +// import type { SnippetModule } from "./snippet"; +// export const snippet: SnippetModule = { +// init(canvas: HTMLCanvasElement, webglAPI: NovoRender.API) { +// return webglAPI.createCameraController({ kind: "ortho" }, canvas); +// } +// }; diff --git a/v2/demo-snippets/tutorials/cameras/pinhole.ts b/v2/demo-snippets/tutorials/cameras/pinhole.ts new file mode 100644 index 0000000..a1ad99f --- /dev/null +++ b/v2/demo-snippets/tutorials/cameras/pinhole.ts @@ -0,0 +1,8 @@ +// should we only use type imports here and pass everything else as params? +import type * as NovoRender from "@novorender/webgl-api"; + +export async function init(canvas: HTMLCanvasElement, webglAPI: NovoRender.API) { + // provide a camera controller + const controller = webglAPI.createCameraController({ kind: "orbit" }, canvas); + return { controller } as const; +} diff --git a/v2/demo-snippets/tutorials/clipping_volumes/box.ts b/v2/demo-snippets/tutorials/clipping_volumes/box.ts new file mode 100644 index 0000000..71e7357 --- /dev/null +++ b/v2/demo-snippets/tutorials/clipping_volumes/box.ts @@ -0,0 +1,80 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + const scene = (view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos)); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // get center of scene + const [cx, cy, cz] = scene.boundingSphere.center; + + // apply clipping volume + view.applySettings({ + clippingVolume: { + enabled: true, + mode: "union", + planes: [ + [-1, 0, 0, cx - 5], // left plane + [1, 0, 0, -(cx + 5)], // right plane + [0, -1, 0, cy + 4], // bottom plane + [0, 1, 0, -(cy + 8)], // top plane + [0, 0, -1, cz - 5], // front plane + [0, 0, 1, -(cz + 5)], // back plane + ], + }, + }); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/clipping_volumes/dual.ts b/v2/demo-snippets/tutorials/clipping_volumes/dual.ts new file mode 100644 index 0000000..ba18d46 --- /dev/null +++ b/v2/demo-snippets/tutorials/clipping_volumes/dual.ts @@ -0,0 +1,76 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + const scene = (view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos)); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // get center of scene + const [cx, cy, cz] = scene.boundingSphere.center; + + // apply clipping volume + view.applySettings({ + clippingVolume: { + enabled: true, + mode: "union", + planes: [ + [1, 0, 0, -cx], + [0, 1, 0, -cy], + ], + }, + }); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/clipping_volumes/flipped.ts b/v2/demo-snippets/tutorials/clipping_volumes/flipped.ts new file mode 100644 index 0000000..aede7ed --- /dev/null +++ b/v2/demo-snippets/tutorials/clipping_volumes/flipped.ts @@ -0,0 +1,75 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + const scene = (view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos)); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // get center of scene + const [cx, cy, cz] = scene.boundingSphere.center; + + // apply clipping volume + view.applySettings({ + clippingVolume: { + enabled: true, + mode: "union", + planes: [ + [-1, -0, -0, +cx], // flip plane + ], + }, + }); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/clipping_volumes/index.ts b/v2/demo-snippets/tutorials/clipping_volumes/index.ts new file mode 100644 index 0000000..80853c8 --- /dev/null +++ b/v2/demo-snippets/tutorials/clipping_volumes/index.ts @@ -0,0 +1,20 @@ +import single from "!!./single.ts?raw"; +import offset from "!!./offset.ts?raw"; +import flipped from "!!./flipped.ts?raw"; +import rotated from "!!./rotated.ts?raw"; +import dual from "!!./dual.ts?raw"; +import slab from "!!./slab.ts?raw"; +import slab_inv from "!!./slab_inv.ts?raw"; +import box from "!!./box.ts?raw"; +import { demo } from "../../misc"; + +export const clippingVolumes = { + ...demo("clipping_volumes", "single", single, {}, "Simple clipping volume with a single plane along the yz axes, effectively clipping everything to the right of center."), + ...demo("clipping_volumes", "offset", offset, {}, "We used the center of the scene (which is far from origo) to position the plane."), + ...demo("clipping_volumes", "flipped", flipped, {}, "Flipping the plane by flipping the direction of the normal."), + ...demo("clipping_volumes", "rotated", rotated, {}, "Single plane, rotated."), + ...demo("clipping_volumes", "dual", dual, {}, "More complex clipping volume with an additional plane along the xz axes, effectively clipping everything to the right and above center."), + ...demo("clipping_volumes", "slab", slab, {}, "A perhaps more useful volume is a slab, consisting of a top and bottom plane, but otherwise extending into infinity."), + ...demo("clipping_volumes", "slab_inv", slab_inv, {}, "Clip everything inside of the volume, rather than outside, simply flip the planes (negate all elements) and change the combination mode."), + ...demo("clipping_volumes", "box", box, {}, "Axis aligned clipping box."), +}; diff --git a/v2/demo-snippets/tutorials/clipping_volumes/offset.ts b/v2/demo-snippets/tutorials/clipping_volumes/offset.ts new file mode 100644 index 0000000..8dbf136 --- /dev/null +++ b/v2/demo-snippets/tutorials/clipping_volumes/offset.ts @@ -0,0 +1,75 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + const scene = (view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos)); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // get center of scene + const [cx, cy, cz] = scene.boundingSphere.center; + + // apply clipping volume + view.applySettings({ + clippingVolume: { + enabled: true, + mode: "union", + planes: [ + [1, 0, 0, -(cx + 5)], // offset plane + ], + }, + }); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/clipping_volumes/rotated.ts b/v2/demo-snippets/tutorials/clipping_volumes/rotated.ts new file mode 100644 index 0000000..7fcf90d --- /dev/null +++ b/v2/demo-snippets/tutorials/clipping_volumes/rotated.ts @@ -0,0 +1,84 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + const scene = (view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos)); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // get center of scene + const [cx, cy, cz] = scene.boundingSphere.center; + + // compute plane normal + const angle = (45 / 180) * Math.PI; // 45 deg rotation angle as radians + const nx = Math.cos(angle); + const ny = Math.sin(angle); + const nz = 0; + + // compute plane offset + const o = -(cx * nx + cy * ny + cz * nz); + + // apply clipping volume + view.applySettings({ + clippingVolume: { + enabled: true, + mode: "union", + planes: [ + [nx, ny, nz, o], // rotate plane around z-axis + ], + }, + }); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/clipping_volumes/single.ts b/v2/demo-snippets/tutorials/clipping_volumes/single.ts new file mode 100644 index 0000000..3378919 --- /dev/null +++ b/v2/demo-snippets/tutorials/clipping_volumes/single.ts @@ -0,0 +1,73 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + const scene = (view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos)); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // get center of scene + const [cx, cy, cz] = scene.boundingSphere.center; + + // apply clipping volume + view.applySettings({ + clippingVolume: { + enabled: true, + mode: "union", + planes: [[1, 0, 0, -cx]], + }, + }); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + while (true) { + // render loop + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/clipping_volumes/slab.ts b/v2/demo-snippets/tutorials/clipping_volumes/slab.ts new file mode 100644 index 0000000..294678a --- /dev/null +++ b/v2/demo-snippets/tutorials/clipping_volumes/slab.ts @@ -0,0 +1,76 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + const scene = (view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos)); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // get center of scene + const [cx, cy, cz] = scene.boundingSphere.center; + + // apply clipping volume + view.applySettings({ + clippingVolume: { + enabled: true, + mode: "union", + planes: [ + [0, -1, 0, cy + 4], // bottom plane + [0, 1, 0, -(cy + 8)], // top plane + ], + }, + }); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/clipping_volumes/slab_inv.ts b/v2/demo-snippets/tutorials/clipping_volumes/slab_inv.ts new file mode 100644 index 0000000..ddf266b --- /dev/null +++ b/v2/demo-snippets/tutorials/clipping_volumes/slab_inv.ts @@ -0,0 +1,76 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + const scene = (view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos)); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // get center of scene + const [cx, cy, cz] = scene.boundingSphere.center; + + // apply clipping volume + view.applySettings({ + clippingVolume: { + enabled: true, + mode: "intersection", + planes: [ + [0, 1, 0, -(cy + 4)], // bottom plane + [0, -1, 0, cy + 8], // top plane + ], + }, + }); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/drawing2D/drawing_2d.ts b/v2/demo-snippets/tutorials/drawing2D/drawing_2d.ts new file mode 100644 index 0000000..e2849d4 --- /dev/null +++ b/v2/demo-snippets/tutorials/drawing2D/drawing_2d.ts @@ -0,0 +1,423 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; +import type { DrawPart, DrawProduct } from "@novorender/measure-api"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +async function draw2d( + _measureApi: MeasureApi.MeasureAPI, + view: WebglApi.View, + measureScene: MeasureApi.MeasureScene, + measureEntity1: MeasureApi.MeasureEntity | undefined, + measureEntity2: MeasureApi.MeasureEntity | undefined, + context2D: CanvasRenderingContext2D | null, + canvas2D: HTMLCanvasElement, + result: MeasureApi.DuoMeasurementValues | undefined, + glMatrix: typeof GlMatrix +) { + //Await all draw objects first to avoid flickering + const [drawResult, drawProduct1, drawProduct2] = await Promise.all([ + result && _measureApi.getDrawMeasureEntity(view, measureScene, result), + measureEntity1 && _measureApi.getDrawMeasureEntity(view, measureScene, measureEntity1), + measureEntity2 && _measureApi.getDrawMeasureEntity(view, measureScene, measureEntity2), + ]); + + //Extract needed camera settings + const { camera } = view; + const cameraDirection = glMatrix.vec3.transformQuat(glMatrix.vec3.create(), glMatrix.vec3.fromValues(0, 0, -1), camera.rotation); + const camSettings = { pos: camera.position, dir: cameraDirection }; + + if (context2D) { + context2D.clearRect(0, 0, canvas2D.width, canvas2D.height); + + //Draw result in green, all lines use 3 pixel width + if (drawResult) { + drawProduct(context2D as CanvasRenderingContext2D, camSettings, drawResult, { lineColor: "green" }, 3, glMatrix); + } + + //Draw first object with yellow line and blue fill + if (drawProduct1) { + drawProduct(context2D as CanvasRenderingContext2D, camSettings, drawProduct1, { lineColor: "yellow", fillColor: "blue" }, 3, glMatrix); + } + + //Draw second object with blue lines and yellow fill + if (drawProduct2) { + drawProduct(context2D as CanvasRenderingContext2D, camSettings, drawProduct2, { lineColor: "blue", fillColor: "yellow" }, 3, glMatrix); + } + } +} + +// HiddenRangeStarted +// Below are utility functions copied from our frontend (https://github.com/novorender/novoweb/blob/develop/src/features/engine2D/utils.ts) +export interface ColorSettings { + lineColor?: string | CanvasGradient; + fillColor?: string; + pointColor?: string | { start: string; middle: string; end: string }; + outlineColor?: string; + complexCylinder?: boolean; +} + +export interface TextSettings { + type: "distance" | "center"; + unit?: string; + customText?: string[]; +} + +export interface CameraSettings { + pos: GlMatrix.ReadonlyVec3; + dir: GlMatrix.ReadonlyVec3; +} + +export function drawProduct(ctx: CanvasRenderingContext2D, camera: CameraSettings, product: DrawProduct, colorSettings: ColorSettings, pixelWidth: number, glMatrix: typeof GlMatrix) { + for (const obj of product.objects) { + if (colorSettings.complexCylinder && obj.kind === "cylinder" && obj.parts.length === 3) { + let startCol = "red"; + let endCol = "lime"; + const cylinderLine = obj.parts[0]; + if (cylinderLine.elevation && cylinderLine.vertices2D) { + if (cylinderLine.elevation.from > cylinderLine.elevation.to) { + const tmp = startCol; + startCol = endCol; + endCol = tmp; + } + const gradX = glMatrix.vec2.fromValues(cylinderLine.vertices2D[0][0], cylinderLine.vertices2D[1][0]); + const gradY = glMatrix.vec2.fromValues(cylinderLine.vertices2D[0][1], cylinderLine.vertices2D[1][1]); + const gradient = ctx.createLinearGradient(gradX[0], gradY[0], gradX[1], gradY[1]); + gradient.addColorStop(0, startCol); + gradient.addColorStop(1, endCol); + drawPart(ctx, camera, cylinderLine, { lineColor: gradient, outlineColor: "rgba(80, 80, 80, .8)" }, pixelWidth, glMatrix); + } + + for (let i = 1; i < 3; ++i) { + const col = i === 1 ? startCol : endCol; + drawPart(ctx, camera, obj.parts[i], { lineColor: col, outlineColor: "rgba(80, 80, 80, .8)" }, pixelWidth, glMatrix); + } + } else { + obj.parts.forEach((part) => { + drawPart(ctx, camera, part, colorSettings, pixelWidth, glMatrix); + }); + } + } +} + +export function drawPart(ctx: CanvasRenderingContext2D, camera: CameraSettings, part: DrawPart, colorSettings: ColorSettings, pixelWidth: number, glMatrix: typeof GlMatrix, textSettings?: TextSettings): boolean { + if (part.vertices2D) { + ctx.lineWidth = pixelWidth; + ctx.strokeStyle = colorSettings.lineColor ?? "black"; + ctx.fillStyle = colorSettings.fillColor ?? "transparent"; + if (part.drawType === "angle" && part.vertices2D.length === 3 && part.text) { + return drawAngle(ctx, camera, part, glMatrix); + } else if (part.drawType === "lines" || part.drawType === "filled") { + return drawLinesOrPolygon(ctx, part, colorSettings, glMatrix, textSettings); + } else if (part.drawType === "vertex") { + return drawPoints(ctx, part, colorSettings); + } + } + return false; +} + +function drawAngle(ctx: CanvasRenderingContext2D, camera: CameraSettings, part: DrawPart, glMatrix: typeof GlMatrix) { + const { vec2, vec3 } = glMatrix; + + if (part.vertices2D) { + ctx.fillStyle = "transparent"; + const anglePoint = part.vertices2D[0]; + const fromP = part.vertices2D[1]; + const toP = part.vertices2D[2]; + const d0 = vec2.sub(vec2.create(), fromP, anglePoint); + const d1 = vec2.sub(vec2.create(), toP, anglePoint); + const l0 = vec2.len(d0); + const l1 = vec2.len(d1); + const camDist = vec3.distance(camera.pos, part.vertices3D[0]); + + const dirA = vec3.sub(vec3.create(), part.vertices3D[1], part.vertices3D[0]); + vec3.normalize(dirA, dirA); + const dirB = vec3.sub(vec3.create(), part.vertices3D[2], part.vertices3D[0]); + vec3.normalize(dirB, dirB); + const dirCamA = vec3.sub(vec3.create(), part.vertices3D[1], camera.pos); + const dirCamB = vec3.sub(vec3.create(), part.vertices3D[2], camera.pos); + const dirCamP = vec3.sub(vec3.create(), part.vertices3D[0], camera.pos); + const norm = vec3.cross(vec3.create(), dirA, dirB); + vec3.normalize(dirCamA, dirCamA); + vec3.normalize(dirCamB, dirCamB); + vec3.normalize(dirCamP, dirCamP); + + if (Math.abs(vec3.dot(dirCamP, norm)) < 0.15) { + return false; + } + + if (camDist > (l0 + l1) / 10) { + return false; + } + if (l0 < 40 || l1 < 40) { + return false; + } + vec2.scale(d0, d0, 1 / l0); + vec2.scale(d1, d1, 1 / l1); + const dir = vec2.add(vec2.create(), d1, d0); + const dirLen = vec2.len(dir); + if (dirLen < 0.001) { + vec2.set(dir, 0, 1); + } else { + vec2.scale(dir, dir, 1 / dirLen); + } + + let angleA = Math.atan2(d0[1], d0[0]); + let angleB = Math.atan2(d1[1], d1[0]); + + const sw = d0[0] * d1[1] - d0[1] * d1[0]; + + if (sw < 0) { + const tmp = angleA; + angleA = angleB; + angleB = tmp; + } + + ctx.beginPath(); + + ctx.arc(anglePoint[0], anglePoint[1], 50, angleA, angleB); + ctx.stroke(); + + if (part.text) { + ctx.fillStyle = "white"; + ctx.strokeStyle = "black"; + ctx.lineWidth = 2; + ctx.font = `bold ${16}px "Open Sans", sans-serif`; + + const textX = anglePoint[0] + dir[0] * 25; + const textY = anglePoint[1] + dir[1] * 25; + ctx.translate(textX, textY); + ctx.strokeText(part.text as string, 0, 0); + ctx.fillText(part.text as string, 0, 0); + ctx.resetTransform(); + } + return true; + } + return false; +} + +function drawLinesOrPolygon(ctx: CanvasRenderingContext2D, part: DrawPart, colorSettings: ColorSettings, glMatrix: typeof GlMatrix, text?: TextSettings) { + const { vec2 } = glMatrix; + + if (part.vertices2D) { + ctx.beginPath(); + ctx.moveTo(part.vertices2D[0][0], part.vertices2D[0][1]); + for (let i = 1; i < part.vertices2D.length; ++i) { + ctx.lineTo(part.vertices2D[i][0], part.vertices2D[i][1]); + } + + if (part.voids) { + ctx.closePath(); + part.voids.forEach((drawVoid) => { + if (drawVoid.vertices2D) { + ctx.moveTo(drawVoid.vertices2D[0][0], drawVoid.vertices2D[0][1]); + for (let i = 1; i < drawVoid.vertices2D.length; ++i) { + ctx.lineTo(drawVoid.vertices2D[i][0], drawVoid.vertices2D[i][1]); + } + ctx.closePath(); + } + }); + } + + if (part.drawType === "filled") { + ctx.closePath(); + ctx.fill(); + } + + if (colorSettings.outlineColor && colorSettings.lineColor) { + const tmpWidth = ctx.lineWidth; + ctx.lineWidth *= 2; + ctx.strokeStyle = colorSettings.outlineColor; + ctx.lineCap = "round"; + ctx.stroke(); + ctx.lineWidth = tmpWidth; + ctx.strokeStyle = colorSettings.lineColor; + ctx.lineCap = "butt"; + } + + ctx.stroke(); + + if (colorSettings.pointColor) { + for (let i = 0; i < part.vertices2D.length; ++i) { + ctx.fillStyle = getPointColor(colorSettings.pointColor, i, part.vertices2D.length); + ctx.lineWidth = 2; + ctx.strokeStyle = "black"; + ctx.beginPath(); + ctx.arc(part.vertices2D[i][0], part.vertices2D[i][1], 5, 0, 2 * Math.PI); + ctx.fill(); + ctx.stroke(); + } + } + + if (text && (text.customText?.length || part.text)) { + ctx.strokeStyle = "black"; + ctx.fillStyle = "white"; + ctx.lineWidth = 2; + ctx.font = `bold ${16}px "Open Sans", sans-serif`; + ctx.textBaseline = "bottom"; + ctx.textAlign = "center"; + + if (text.type === "distance") { + const points = part.vertices2D; + for (let i = 0; i < points.length - 1; ++i) { + const textStr = `${text.customText && i < text.customText.length ? text.customText[i] : part.text} ${text.unit ? text.unit : "m"}`; + let dir = points[i][0] > points[i + 1][0] ? vec2.sub(vec2.create(), points[i], points[i + 1]) : vec2.sub(vec2.create(), points[i + 1], points[i]); + const pixLen = ctx.measureText(textStr).width + 20; + if (vec2.sqrLen(dir) > pixLen * pixLen) { + const center = vec2.create(); + vec2.lerp(center, points[i], points[i + 1], 0.5); + const x = center[0]; + const y = center[1]; + vec2.normalize(dir, dir); + const angle = Math.atan2(dir[1], dir[0]); + ctx.translate(x, y); + ctx.rotate(angle); + ctx.strokeText(textStr, 0, 0); + ctx.fillText(textStr, 0, 0); + ctx.resetTransform(); + } + } + } else if (text.type === "center" && part.vertices2D.length > 2) { + const center = vec2.create(); + for (const p of part.vertices2D) { + vec2.add(center, center, p); + } + const textStr = `${text.customText && text.customText.length > 0 ? text.customText : part.text ? part.text : ""} ${text.unit ? text.unit : "m"}`; + ctx.strokeText(textStr, center[0] / part.vertices2D.length, center[1] / part.vertices2D.length); + ctx.fillText(textStr, center[0] / part.vertices2D.length, center[1] / part.vertices2D.length); + } + } + return true; + } + return false; +} + +function getPointColor(pointColor: string | { start: string; middle: string; end: string }, idx: number, length: number) { + if (typeof pointColor === "string") { + return pointColor; + } + if (idx === 0) { + return pointColor.start; + } else if (idx === length - 1) { + return pointColor.end; + } + return pointColor.middle; +} + +function drawPoints(ctx: CanvasRenderingContext2D, part: DrawPart, colorSettings: ColorSettings) { + if (part.vertices2D) { + for (let i = 0; i < part.vertices2D.length; ++i) { + ctx.fillStyle = colorSettings.pointColor ? getPointColor(colorSettings.pointColor, i, part.vertices2D.length) : colorSettings.fillColor ?? "black"; + ctx.lineWidth = 2; + ctx.strokeStyle = "black"; + ctx.beginPath(); + ctx.arc(part.vertices2D[i][0], part.vertices2D[i][1], 5, 0, 2 * Math.PI); + ctx.fill(); + ctx.stroke(); + } + return true; + } + return false; +} + +export async function main({ webglApi, measureApi, glMatrix, canvas, canvas2D }: IParams) { + // initialize the webgl api + const api = await webglApi.createAPI(); + + // initialize the measure api + const _measureApi = await measureApi.createMeasureAPI(); + + // load a predefined scene into measureapi, available scenes are cube, oilrig, condos + const measureScene = await _measureApi.loadScene(webglApi.WellKnownSceneUrls.condos); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // create 2d context for drawing + const context2D = canvas2D.getContext("2d"); + + let output: WebglApi.RenderOutput; + + //Parametric entities used to measure between + let measureEntity1: MeasureApi.MeasureEntity | undefined = undefined; + let measureEntity2: MeasureApi.MeasureEntity | undefined = undefined; + //number to alternate between selected entities. + let selectEntity: 1 | 2 = 1; + + //Save the measure result so it can be drawn in the draw loop + let result: MeasureApi.MeasurementValues | undefined = undefined; + + canvas.addEventListener("click", async (e) => { + if (output) { + let result1 = await output.pick(e.offsetX, e.offsetY); + if (result1) { + if (selectEntity === 1) { + //Find measure entity at pick location + measureEntity1 = (await measureScene.pickMeasureEntity(result1.objectId, result1.position)).entity; + selectEntity = 2; + } else { + //Find measure entity at pick location + measureEntity2 = (await measureScene.pickMeasureEntity(result1.objectId, result1.position)).entity; + selectEntity = 1; + } + //As long as one object is selected log out the values + //Note that if measureEntity2 is undefined then the result will be the parametric values of measureEntity1 + if (measureEntity1) { + result = await measureScene.measure(measureEntity1, measureEntity2); + } + await draw2d(_measureApi, view, measureScene, measureEntity1, measureEntity2, context2D, canvas2D, result as any, glMatrix); + } + } + }); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + await draw2d(_measureApi, view, measureScene, measureEntity1, measureEntity2, context2D, canvas2D, result, glMatrix); + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/drawing2D/index.ts b/v2/demo-snippets/tutorials/drawing2D/index.ts new file mode 100644 index 0000000..63888a3 --- /dev/null +++ b/v2/demo-snippets/tutorials/drawing2D/index.ts @@ -0,0 +1,6 @@ +import drawing2d from "!!./drawing_2d.ts?raw"; +import { demo } from "../../misc"; + +export const drawing2D = { + ...demo("drawing2D", "drawing_2d", drawing2d, {}, "Measure API can be used to draw measure entity or results into a 2D canvas."), +}; diff --git a/v2/demo-snippets/tutorials/dynamic_objects/dynamic_object.ts b/v2/demo-snippets/tutorials/dynamic_objects/dynamic_object.ts new file mode 100644 index 0000000..0ee57ee --- /dev/null +++ b/v2/demo-snippets/tutorials/dynamic_objects/dynamic_object.ts @@ -0,0 +1,70 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // create an empty scene, available scenes are cube, oilrig, condos + const scene = (view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.empty)); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // load dynamic object asset + const asset = await api.loadAsset(new URL("https://api.novorender.com/assets/gltf/shaderball.glb")); + + // Add instance into scene + const instance = scene.createDynamicObject(asset); // we can make multiple instances from same asset. + + // render the object + instance.visible = true; + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/dynamic_objects/index.ts b/v2/demo-snippets/tutorials/dynamic_objects/index.ts new file mode 100644 index 0000000..f496fd7 --- /dev/null +++ b/v2/demo-snippets/tutorials/dynamic_objects/index.ts @@ -0,0 +1,6 @@ +import dynamicObject from "!!./dynamic_object.ts?raw"; +import { demo } from "../../misc"; + +export const dynamicObjects = { + ...demo("dynamic_objects", "dynamic_object", dynamicObject, {}, "Adding dynamic 3D objects into the view."), +}; diff --git a/v2/demo-snippets/tutorials/getting_started/basic_condos.ts b/v2/demo-snippets/tutorials/getting_started/basic_condos.ts new file mode 100644 index 0000000..7e5c277 --- /dev/null +++ b/v2/demo-snippets/tutorials/getting_started/basic_condos.ts @@ -0,0 +1,92 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; +import * as WebApp from "@novorender/web_app"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; + web_app: typeof WebApp; +} + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, canvas, web_app }: IParams) { + console.log("web_app ", web_app); + // initialize the webgl api + const api = webglApi.createAPI(); + + // Create a view + const view = new (web_app.View as any)(canvas, web_app.getDeviceProfile(0)); + + const dataApi = dataJsApi.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + try { + const [{ url, db, ...sceneData }, camera] = await loadScene(dataApi, "95a89d20dd084d9486e383e131242c4c"); + const webgl2Bin = new URL(url); + webgl2Bin.pathname += "webgl2_bin/"; + await view.loadSceneFromURL(webgl2Bin); + view.run(); + } catch (error) { + console.log("errrrrr ", error); + } + + // // load a predefined scene into the view, available scenes are cube, oilrig, condos + // view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos); + + // // provide a camera controller, available controller types are static, orbit, flight and turntable + // view.camera.controller = api.createCameraController({ kind: "turntable" }); + + // // Create a bitmap context to display render output + // const ctx = canvas.getContext("bitmaprenderer"); + + // // Handle canvas resizes + // new ResizeObserver((entries) => { + // for (const entry of entries) { + // canvas.width = entry.contentRect.width; + // canvas.height = entry.contentRect.height; + // view.applySettings({ + // display: { width: canvas.width, height: canvas.height }, + // }); + // } + // }).observe(canvas); + + // // render-loop https://dens.website/tutorials/webgl/render-loop + // while (true) { + // // Render frame + // const output = await view.render(); + // { + // // Finalize output image + // const image = await output.getImage(); + // if (image) { + // // Display the given ImageBitmap in the canvas associated with this rendering context. + // ctx?.transferFromImageBitmap(image); + // // release bitmap data + // image.close(); + // } + // } + // (output as any).dispose(); + // } +} + +export async function loadScene(dataApi: DataJsApi.API, id: string): Promise { + const res = await dataApi.loadScene(id); + const camera = undefined; + + if ("error" in res) { + throw res; + } + + const { ..._cfg } = res; + const cfg = _cfg; + + return [cfg, camera]; +} diff --git a/v2/demo-snippets/tutorials/getting_started/basic_condos_1.ts b/v2/demo-snippets/tutorials/getting_started/basic_condos_1.ts new file mode 100644 index 0000000..86d7485 --- /dev/null +++ b/v2/demo-snippets/tutorials/getting_started/basic_condos_1.ts @@ -0,0 +1,61 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // Create a view + const view = await api.createView({ background: { color: [0, 0, 0, 0] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "turntable" }); + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop: https://dens.website/tutorials/webgl/render-loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/getting_started/basic_cube.ts b/v2/demo-snippets/tutorials/getting_started/basic_cube.ts new file mode 100644 index 0000000..de6e244 --- /dev/null +++ b/v2/demo-snippets/tutorials/getting_started/basic_cube.ts @@ -0,0 +1,61 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // Create a view + const view = await api.createView({ background: { color: [0, 0, 0.25, 1] } }, canvas); + + // load a predefined scene into the view, available scenes are cube, oilrig, condos + view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.cube); + + // provide a controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "turntable" }); + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render-loop https://dens.website/tutorials/webgl/render-loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/getting_started/index.ts b/v2/demo-snippets/tutorials/getting_started/index.ts new file mode 100644 index 0000000..afa433c --- /dev/null +++ b/v2/demo-snippets/tutorials/getting_started/index.ts @@ -0,0 +1,11 @@ +import basicCube from "!!./basic_cube.ts?raw"; +import basicCondos from "!!./basic_condos.ts?raw"; +import basicCondos1 from "!!./basic_condos_1.ts?raw"; + +import { demo } from "../../misc"; + +export const gettingStarted = { + ...demo("getting_started", "basic_cube", basicCube, {}, "A basic demonstration of the WebGL API using a predefined `cube` scene."), + ...demo("getting_started", "basic_condos", basicCondos, {}, "A basic demonstration of the WebGL API."), + ...demo("getting_started", "basic_condos_1", basicCondos1, {}, "A basic demonstration of the WebGL API using `ResizeObserver`."), +}; diff --git a/v2/demo-snippets/tutorials/index.ts b/v2/demo-snippets/tutorials/index.ts new file mode 100644 index 0000000..10016f3 --- /dev/null +++ b/v2/demo-snippets/tutorials/index.ts @@ -0,0 +1,12 @@ +export * from "./clipping_volumes"; +export * from "./dynamic_objects"; +export * from "./object_selection"; +export * from "./measure"; +export * from "./getting_started"; +export * from "./loading_scenes"; +export * from "./searching"; +export * from "./object_groups"; +export * from "./drawing2D"; +export * from "./object_metadata"; +export * from "./pdf_placement"; +export * from "./minimap"; diff --git a/v2/demo-snippets/tutorials/loading_scenes/index.ts b/v2/demo-snippets/tutorials/loading_scenes/index.ts new file mode 100644 index 0000000..3c4856b --- /dev/null +++ b/v2/demo-snippets/tutorials/loading_scenes/index.ts @@ -0,0 +1,8 @@ +import publicScene from "!!./public_scene.ts?raw"; +import privateScene from "!!./private_scene.ts?raw"; +import { demo } from "../../misc"; + +export const loadingScenes = { + ...demo("loading_scenes", "public_scene", publicScene, {}, "Loading public scenes."), + ...demo("loading_scenes", "private_scene", privateScene, {}, "Loading private scenes."), +}; diff --git a/v2/demo-snippets/tutorials/loading_scenes/private_scene.ts b/v2/demo-snippets/tutorials/loading_scenes/private_scene.ts new file mode 100644 index 0000000..847d4f5 --- /dev/null +++ b/v2/demo-snippets/tutorials/loading_scenes/private_scene.ts @@ -0,0 +1,141 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +const DATA_API_SERVICE_URL = "https://data.novorender.com/api"; + +export async function main({ webglApi, dataJsApi, canvas }: IParams) { + // For the demo we have simplified the login flow to always run the login call + const accessToken = await login(); + + // Initialize the data API with the Novorender data server service + // and a callback which returns the auth header with the access token + const dataApi = dataJsApi.createAPI({ + serviceUrl: DATA_API_SERVICE_URL, + authHeader: async () => ({ + header: "Authorization", + value: `Bearer ${accessToken}`, + }), + }); + + // From here on everything except the scene ID is the same as for loading public scenes + + try { + // Load scene metadata + const sceneData = await dataApi + // Condos scene ID, but this one requires authentication + .loadScene("7a0a302fe9b24ddeb3c496fb36e932b0") + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // The code above is all you need to load the scene, + // however there is more scene data loaded that you can apply + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + // available controller types are static, orbit, flight and turntable + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + // Run render loop and the resizeObserver + run(view, canvas); + } catch (e) { + // Handle errors however you like + console.warn(e); + } +} + +async function login(): Promise { + // Hardcoded values for demo purposes + const username = "demouser"; + const password = "demopassword"; + + // POST to the dataserver service's /user/login endpoint + const res: { token: string } = await fetch( + DATA_API_SERVICE_URL + "/user/login", + { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: `username=${username}&password=${password}`, + } + ) + .then((res) => res.json()) + .catch(() => { + // Handle however you like + return { token: "" }; + }); + + return res.token; +} + +// HiddenRangeStarted +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/loading_scenes/public_scene.ts b/v2/demo-snippets/tutorials/loading_scenes/public_scene.ts new file mode 100644 index 0000000..04cdaf1 --- /dev/null +++ b/v2/demo-snippets/tutorials/loading_scenes/public_scene.ts @@ -0,0 +1,103 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, canvas }: IParams) { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsApi.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + try { + // Load scene metadata + const sceneData = await dataApi + // Condos scene ID, but can be changed to any public scene ID + .loadScene("3b5e65560dc4422da5c7c3f827b6a77c") + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // The code above is all you need to load the scene, + // however there is more scene data loaded that you can apply + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + // available controller types are static, orbit, flight and turntable + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + // Run render loop and the resizeObserver + run(view, canvas); + } catch (e) { + // Handle errors however you like + console.warn(e); + } +} +// HiddenRangeStarted +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.clientWidth, height: canvas.clientHeight }, + }); + } + }).observe(canvas); + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/measure/index.ts b/v2/demo-snippets/tutorials/measure/index.ts new file mode 100644 index 0000000..4cce396 --- /dev/null +++ b/v2/demo-snippets/tutorials/measure/index.ts @@ -0,0 +1,6 @@ +import parametricMeasure from "!!./parametric_measure.ts?raw"; +import { demo } from "../../misc"; + +export const measure = { + ...demo("measure", "parametric_measure", parametricMeasure, {}, "Measure API can be used to fetch parametric data based on real world position, and calculate measurements between 2 objects."), +}; diff --git a/v2/demo-snippets/tutorials/measure/parametric_measure.ts b/v2/demo-snippets/tutorials/measure/parametric_measure.ts new file mode 100644 index 0000000..8fec60d --- /dev/null +++ b/v2/demo-snippets/tutorials/measure/parametric_measure.ts @@ -0,0 +1,105 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// we export this function to our react component which will then execute it once the demo started running. +export function showTip() { + return openAlert( + "Click to select parametric object, parametric data will be shown in an alert dialog. Select another object and the measurement data between the objects will be shown in the alert dialog. Clicking further objects will alternate between first and second selected and show measure values within an alert dialog." + ); +} + +// HiddenRangeEnded +export async function main({ webglApi, measureApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // initialize the measure api instance + const _measureApi = await measureApi.createMeasureAPI(); + + // load a predefined scene into the measure api, available scenes are cube, oilrig, condos + const measureScene = await _measureApi.loadScene(webglApi.WellKnownSceneUrls.condos); + + // create a view + const view = await api.createView({ background: { color: [0, 0, 0.1, 1] } }, canvas); + + // provide a camera controller, available controller types are static, orbit, flight and turntable + view.camera.controller = api.createCameraController({ kind: "orbit" }, canvas); + + // create an empty scene, other available scenes are cube, oilrig, condos + view.scene = await api.loadScene(webglApi.WellKnownSceneUrls.condos); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + let output: WebglApi.RenderOutput | undefined = undefined; + + // Parametric entities used to measure between + let measureEntity1: MeasureApi.MeasureEntity | undefined = undefined; + let measureEntity2: MeasureApi.MeasureEntity | undefined = undefined; + // number to alternate between selected entities. + let selectEntity: 1 | 2 = 1; + + canvas.addEventListener("click", async (e) => { + if (output) { + const result = await output.pick(e.offsetX, e.offsetY); + if (result) { + if (selectEntity === 1) { + // Find measure entity at pick location + measureEntity1 = (await measureScene.pickMeasureEntity(result.objectId, result.position)).entity; + selectEntity = 2; + } else { + // Find measure entity at pick location + measureEntity2 = (await measureScene.pickMeasureEntity(result.objectId, result.position)).entity; + selectEntity = 1; + } + // As long as one object is selected log out the values + // Note that if measureEntity2 is undefined then the result will be the parametric values of measureEntity1 + if (measureEntity1) { + const _log = await measureScene.measure(measureEntity1, measureEntity2); + openInfoPane(_log); + } + } + } + }); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} diff --git a/v2/demo-snippets/tutorials/minimap/basic_minimap.ts b/v2/demo-snippets/tutorials/minimap/basic_minimap.ts new file mode 100644 index 0000000..81f31b5 --- /dev/null +++ b/v2/demo-snippets/tutorials/minimap/basic_minimap.ts @@ -0,0 +1,722 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; +import type { RecursivePartial, RenderSettings, RenderOutput, View } from "@novorender/webgl-api"; +import type { SceneData } from "@novorender/data-js-api"; +import type { vec2, vec3, quat } from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// we export this function to our react component which will then execute it once the demo started running. +export function showTip() { + return openAlert("Clicking any position on the minimap (right-side) will navigate the camera to the same position on the 3D view (left-side), you can also zoom in/out on the minimap using mouse wheel or touchpad."); +} +const DATA_API_SERVICE_URL = "https://data.novorender.com/api"; + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, glMatrix, canvas, previewCanvas }: IParams) { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsApi.createAPI({ + // we're loading a public scene so it doesn't require any auth header, + // see `https://docs.novorender.com/docs/tutorials/loading_scenes#private-scenes` if you want to load private scenes. + serviceUrl: DATA_API_SERVICE_URL, + }); + + // load a public scene + const sceneData = (await dataApi.loadScene("fa20cb75e20e42b789c8e0f18ef5cc6f")) as SceneData; + + // render config, adjust however you want + const renderSettings: RecursivePartial = { + quality: { + resolution: { value: 1 }, // Set resolution scale to 1 + }, + clippingVolume: { + enabled: true, + mode: "union", + planes: [[0, 1, 0, -5.5]], + }, + }; + + // create webgl api, view and load scene and set cameraController. + const view = await initView(webglApi, canvas, sceneData, renderSettings); + + const previewCanvasContext2D = previewCanvas.getContext("2d"); + let preview: string | undefined; + let minimap: MinimapHelper; + if (sceneData && !(sceneData as any).error) { + minimap = await downloadMinimap(previewCanvas.width, previewCanvas.height, sceneData, glMatrix); + + preview = minimap.getMinimapImage(); + minimap.pixelWidth = previewCanvas.width; // Set canvas width + minimap.pixelHeight = previewCanvas.height; // Set canvas height in minimap helper + } + + let currentOutput: RenderOutput; + + // PDF view click listener + previewCanvas.onclick = (e: MouseEvent) => { + // Get the position of the click relative to the canvas + const rect = previewCanvas.getBoundingClientRect(); + let x = e.clientX - rect.left; + let y = e.clientY - rect.top; + + if (currentArea) { + x = currentArea.x + x / currentLevel; + y = currentArea.y + y / currentLevel; + } + + view.camera.controller.moveTo(minimap.toWorld(glMatrix.vec2.fromValues(x, y)), view.camera.rotation); + }; + + let wheelDelta = 1, + level: number, + currentLevel = 1, + currentArea: NodeGeometry | undefined, + elements: QuadNode[] | undefined, + zoomedImage: string | undefined; + + // PDF view wheel event + previewCanvas.onwheel = async (e) => { + e.preventDefault(); + + wheelDelta += e.deltaY * -0.01; + wheelDelta = Math.min(Math.max(1, wheelDelta), 5); + currentLevel = Math.ceil(wheelDelta); + + if (currentLevel === 1) { + // reset the zoom + level = currentLevel; + try { + const initialImage = await loadImage(preview as string); + if (previewCanvasContext2D) { + previewCanvasContext2D.clearRect(0, 0, previewCanvas.width, previewCanvas.height); + previewCanvasContext2D.drawImage(initialImage, 0, 0, previewCanvas.width, previewCanvas.height); + } + } catch (error) { + console.error("Failed to load the preview image ", error); + } + currentArea = undefined; + elements = undefined; + zoomedImage = undefined; + return; + } + if (level === currentLevel) { + return; + } + if (level === 2) { + level++; + } + level = currentLevel; + + // Get the position of the click relative to the canvas + const rect = previewCanvas.getBoundingClientRect(); + let centerX = e.clientX - rect.left; + let centerY = e.clientY - rect.top; + + const width = previewCanvas.width / currentLevel; + const height = previewCanvas.height / currentLevel; + if (currentArea) { + const previousAreaMinX = currentArea.x; + const previousAreaMinY = currentArea.y; + centerX = previousAreaMinX + centerX / currentLevel; + centerY = previousAreaMinY + centerY / currentLevel; + } + + const right = previewCanvas.width - (centerX + width / 2); + const bot = previewCanvas.height - (centerY + height / 2); + let x = centerX - width / 2; + if (right < 0) { + x += right; + } + let y = centerY - height / 2; + if (bot < 0) { + y += bot; + } + const area: NodeGeometry = { + x: Math.max(0, x), + y: Math.max(0, y), + width: width, + height: height, + }; + + currentArea = area; + elements = minimap.retrieve(currentArea, currentLevel); + await drawAndStitchOnCanvas(elements, currentArea); + }; + + // draws one or more image tiles on canvas + const drawAndStitchOnCanvas = async (elements: QuadNode[], area: NodeGeometry) => { + // clear the canvas + previewCanvasContext2D?.clearRect(0, 0, previewCanvas.width, previewCanvas.height); + + // Loop through the found nodes and draw images based on node on the canvas + for (let i = 0; i < elements.length; i++) { + const node = elements[i]; + + const nodeBoundsWidth = node.bounds.width; + const nodeBoundsHeight = node.bounds.height; + + try { + const loadedImage = await loadImage(preview as string, node.Id); + + const boundsWRatio = loadedImage.naturalWidth / nodeBoundsWidth; + const boundsHRatio = loadedImage.naturalHeight / nodeBoundsHeight; + + const cutLeft = Math.max(0, area.x - node.bounds.x); + const cutRight = Math.max(0, node.bounds.x + node.bounds.width - (area.x + area.width)); + const cutX = cutLeft + cutRight; + + const cutTop = Math.max(0, area.y - node.bounds.y); + const cutBot = Math.max(0, node.bounds.y + node.bounds.height - (area.y + area.height)); + const cutY = cutTop + cutBot; + + const zoom = currentLevel; + const x = (Math.max(node.bounds.x, area.x) - area.x) * zoom; + const y = (Math.max(node.bounds.y, area.y) - area.y) * zoom; + const sx = cutLeft * boundsWRatio; + const sy = cutTop * boundsHRatio; + + const sWidth = loadedImage.naturalWidth - sx - cutRight * boundsWRatio; + const sHeight = loadedImage.naturalHeight - sy - cutBot * boundsHRatio; + const dWidth = (node.bounds.width - cutX) * zoom; + const dHeight = (node.bounds.height - cutY) * zoom; + + previewCanvasContext2D?.drawImage(loadedImage, sx, sy, sWidth, sHeight, x, y, dWidth + 1, dHeight + 1); // +1 for pixel overlap to avoid grid like lines + } catch (err) { + console.error("Something went wrong", err); + } + } + + zoomedImage = previewCanvas.toDataURL(); + }; + + let prevCamPos: vec3; + let prevCamRot: quat; + + function animate() { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const ctx = previewCanvas.getContext("2d")!; + + // Run every frame to check if the camera has changed + if (!prevCamRot || !glMatrix.quat.equals(prevCamRot, view.camera.rotation) || !prevCamPos || !glMatrix.vec3.equals(prevCamPos, view.camera.position)) { + prevCamRot = glMatrix.quat.clone(view.camera.rotation); + prevCamPos = glMatrix.vec3.clone(view.camera.position); + if (minimap) { + // Update minimap info based on camera position. Returns true if it changed the pdf to another floor + minimap.update(view.camera.position as vec3); + + let imgUrl: string; + + if (elements?.length && currentLevel !== 1 && zoomedImage) { + imgUrl = zoomedImage; + } else { + imgUrl = minimap.getMinimapImage(); + } + + loadImage(imgUrl).then((img) => { + // Redraw the image for te minimap + ctx.clearRect(0, 0, previewCanvas.width, previewCanvas.height); + // ctx.drawImage(img, 300, 0, img.width, img.height, 0, 0, img.width * 1.5, img.height * 1.5); + ctx.drawImage(img, 0, 0, previewCanvas.width, previewCanvas.height); + drawLine(ctx); + }); + } + } + } + + const drawLine = (ctx: CanvasRenderingContext2D) => { + // Gets the camera position in minimap space + const minimapPos = minimap.toMinimap(view.camera.position as vec3); + + // Gets a cone of the camera direction in minimap space, point[0] is the camera position + const dirPath = minimap.directionPoints(view.camera.position as vec3, view.camera.rotation as quat, 5 / currentLevel); + if (currentArea) { + minimapPos[0] = (minimapPos[0] - currentArea.x) * currentLevel; + minimapPos[1] = (minimapPos[1] - currentArea.y) * currentLevel; + for (let i = 0; i < 3; ++i) { + dirPath[i][0] = (dirPath[i][0] - currentArea.x) * currentLevel; + dirPath[i][1] = (dirPath[i][1] - currentArea.y) * currentLevel; + } + } + ctx.strokeStyle = "green"; + for (let i = 1; i < dirPath.length; ++i) { + ctx.beginPath(); + ctx.lineWidth = 3; + ctx.moveTo(dirPath[0][0], dirPath[0][1]); + ctx.lineTo(dirPath[i][0], dirPath[i][1]); + ctx.stroke(); + } + ctx.fillStyle = "green"; + ctx.beginPath(); + ctx.ellipse(minimapPos[0], minimapPos[1], 5, 5, 0, 0, Math.PI * 2); + ctx.fill(); + }; + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // runs resizeObserver for main canvas (3D view), just to update width/height. + runResizeObserver(view, canvas); + + // render loop + // eslint-disable-next-line no-constant-condition + while (true) { + // Render frame + currentOutput = await view.render(); + { + // Finalize output image + const image = await currentOutput.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + + animate(); + + (currentOutput as any).dispose(); + } +} + +async function initView(webglApi: typeof WebglApi, canvas: HTMLCanvasElement, sceneData: SceneData, renderSettings: RecursivePartial): Promise { + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + view.applySettings(renderSettings); + + // Create a camera controller with the saved parameters with ortho as fallback + let camera: WebglApi.CameraControllerParams = cameraParams ?? { + kind: "flight", + }; + camera = { ...camera, ...{ yaw: 0, pitch: -90 } }; + view.camera.controller = api.createCameraController(camera as WebglApi.FlightControllerParams, canvas); + + // Assign the scene to the view + view.scene = scene; + + return view; +} + +async function runResizeObserver(view: View, canvas: HTMLCanvasElement): Promise { + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const { target, contentRect } of entries) { + canvas.width = contentRect.width; + canvas.height = contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); +} + +// Function to load an image +function loadImage(url: string, id?: string): Promise { + return new Promise((resolve, reject) => { + const image = new Image(); + image.crossOrigin = "anonymous"; + image.onload = () => resolve(image); + image.onerror = reject; + image.src = id ? url.replace(/(\.jpeg)/, `_${id}$1`) : url; + }); +} + +/** + * ***************************************************************************************************** + * ***************************************************************************************************** + * MINIMAP CLASS & HELPERS + * ***************************************************************************************************** + * ***************************************************************************************************** + */ + +/** + * Interface for geometry of a Quadtree node + */ +export interface NodeGeometry { + /** + * X position of the node + */ + x: number; + + /** + * Y position of the node + */ + y: number; + + /** + * Width of the node + */ + width: number; + + /** + * Height of the node + */ + height: number; +} + +interface MinimapInfo { + aspect: number; + elevation: number; + image: string; + corner: vec3; + dx: number; + dy: number; + dirX: vec3; + dirY: vec3; +} + +class QuadNode { + /** + * The numeric boundaries of this node. + * @readonly + */ + bounds: NodeGeometry; + + /** + * The level of this node. + * @defaultValue `0` + * @readonly + */ + level: number; + + Id: string; + + empty = false; + + nodes: QuadNode[]; + + constructor(bounds: { x: number; y: number; width: number; height: number; Id: string }, level: number) { + this.bounds = { + x: bounds.x || 0, + y: bounds.y || 0, + width: bounds.width, + height: bounds.height, + }; + this.level = level || 0; + this.nodes = []; + this.Id = bounds.Id; + } + + /** + * Split the node into 4 subnodes. + */ + split(splitWidth: number, splitHeight: number): void { + const level = this.level + 1; + const { bounds } = this; + + const width = splitWidth / 2, + height = splitHeight / 2, + x = bounds.x, + y = bounds.y; + + // max 5 levels + if (level > 6) { + return; + } + + const coords = [ + { x: x, y: y }, + { x: x + width, y: y }, + { x: x, y: y + height }, + { x: x + width, y: y + height }, + ]; + let _id; + { + for (let i = 0; i < coords.length; i++) { + if (level === 0) { + _id = "root"; + } + if (level === 1) { + _id = i.toString(); + } else { + _id = this.Id + i.toString(); + } + const childWidth = Math.min(width, bounds.width - (coords[i].x - bounds.x)); + const childHeight = Math.min(height, bounds.height - (coords[i].y - bounds.y)); + this.nodes[i] = new QuadNode( + { + x: coords[i].x, + y: coords[i].y, + height: childHeight, + width: childWidth, + Id: _id, + }, + level + ); + + if (childWidth <= 0 || childHeight <= 0) { + this.nodes[i].empty = true; + } else { + this.nodes[i].split(width, height); + } + } + } + } + + overlaps(obj: NodeGeometry): boolean { + const { bounds } = this; + const maxBoundX = bounds.x + bounds.width; + const maxBoundY = bounds.y + bounds.height; + const maxObjX = obj.x + obj.width; + const maxObjY = obj.y + obj.height; + const insideX = (obj.x >= bounds.x && obj.x <= maxBoundX) || (maxObjX >= maxBoundX && obj.x <= maxBoundX) || (maxObjX >= bounds.x && maxObjX < maxBoundX); + const insideY = (obj.y >= bounds.y && obj.y <= maxBoundY) || (maxObjY >= maxBoundY && obj.y <= maxBoundY) || (maxObjY >= bounds.y && maxObjY < maxBoundY); + if (insideX && insideY) { + return true; + } + return false; + } + + /** + * Return all objects that could collide with the given geometry. + * @param obj - geometry to be checked + * @param testLevel - level to be checked + * @returns Array containing all detected objects. + */ + retrieve(obj: NodeGeometry, testLevel: number): QuadNode[] { + let returnObjects: QuadNode[] = []; + //if we have subnodes, retrieve their objects + if (this.nodes.length && this.level < testLevel) { + for (let i = 0; i < this.nodes.length; i++) { + const node = this.nodes[i]; + if (!node.empty && node.overlaps(obj)) { + returnObjects = returnObjects.concat(node.retrieve(obj, testLevel)); + } + } + } else { + returnObjects.push(this); + } + return returnObjects; + } +} + +/** + * Class representing a MinimapHelper that also contains an instance of `QuadNode` class. + */ +export class MinimapHelper { + /** + * Subnodes of this node + * @defaultValue `[]` + * @readonly + */ + quadTree: QuadNode; + + pixelWidth = 0; + pixelHeight = 0; + currentIndex = 0; + + glMatrix!: typeof GlMatrix; + + /** + * Minimap Constructor + * @param minimaps - minimap info + * @param glMatrix - glMatrix dependency + * @param quadTreeProps - bounds and properties of the node + * @param level - depth level (internal use only, required for subnodes) + */ + constructor(width: number, height: number, readonly minimaps: MinimapInfo[], glMatrix: typeof GlMatrix) { + this.pixelWidth = width; + this.pixelHeight = height; + this.glMatrix = glMatrix; + this.quadTree = new QuadNode({ x: 0, y: 0, width, height, Id: "" }, 1); + } + + async split(topLevelWidth: number, topLevelHeight: number) { + const numImagesWidth = topLevelWidth / 256; + const cw = Math.ceil(Math.log(numImagesWidth) / Math.log(2)); + const widthSplitBy = Math.pow(2, cw) / 2; + const widthSplit = widthSplitBy / numImagesWidth; + + const numImagesHeight = topLevelHeight / 256; + const ch = Math.ceil(Math.log(numImagesHeight) / Math.log(2)); + const heightSplitBy = Math.pow(2, ch) / 2; + const heightSplit = heightSplitBy / numImagesHeight; + this.quadTree.split(this.pixelWidth * widthSplit * 2, this.pixelHeight * heightSplit * 2); + } + + retrieve(obj: NodeGeometry, testLevel: number): QuadNode[] { + return this.quadTree.retrieve(obj, testLevel); + } + + toMinimap(worldPos: vec3): vec2 { + const curInfo = this.getCurrentInfo(); + const diff = this.glMatrix.vec3.sub(this.glMatrix.vec3.create(), worldPos, curInfo.corner); + const diffX = this.glMatrix.vec3.dot(diff, curInfo.dirX); + const diffY = this.glMatrix.vec3.dot(diff, curInfo.dirY); + + const x = (diffX / curInfo.dx) * this.pixelWidth; + const y = this.pixelHeight - (diffY / curInfo.dy) * this.pixelHeight; + return this.glMatrix.vec2.fromValues(x, y); + } + + toWorld(minimapPos: vec2): vec3 { + const curInfo = this.getCurrentInfo(); + const diffX = minimapPos[0] / this.pixelWidth; + const diffY = 1 - minimapPos[1] / this.pixelHeight; + const pos = this.glMatrix.vec3.clone(curInfo.corner); + pos[1] += 10; + this.glMatrix.vec3.scaleAndAdd(pos, pos, curInfo.dirX, curInfo.dx * diffX); + this.glMatrix.vec3.scaleAndAdd(pos, pos, curInfo.dirY, curInfo.dy * diffY); + return pos; + } + + directionPoints(worldPos: vec3, rot: quat, length: number): vec2[] { + const path: vec2[] = []; + path.push(this.toMinimap(worldPos)); + const rotA = this.glMatrix.quat.rotateY(this.glMatrix.quat.create(), rot, Math.PI / 8); + const dirZ = this.glMatrix.vec3.fromValues(0, 0, -1); + const dirA = this.glMatrix.vec3.transformQuat(this.glMatrix.vec3.create(), dirZ, rotA); + const posA = this.glMatrix.vec3.scaleAndAdd(this.glMatrix.vec3.create(), worldPos, dirA, length); + path.push(this.toMinimap(posA)); + + const rotB = this.glMatrix.quat.rotateY(this.glMatrix.quat.create(), rot, -Math.PI / 8); + const dirB = this.glMatrix.vec3.transformQuat(this.glMatrix.vec3.create(), dirZ, rotB); + const posB = this.glMatrix.vec3.scaleAndAdd(this.glMatrix.vec3.create(), worldPos, dirB, length); + path.push(this.toMinimap(posB)); + + return path; + } + + getCurrentInfo() { + return this.minimaps[this.currentIndex]; + } + + getMinimapImage() { + return this.getCurrentInfo().image; + } + + getAspect() { + return this.getCurrentInfo().aspect; + } + + update(camPos: vec3): boolean { + for (let i = 1; i < this.minimaps.length; ++i) { + if (camPos[1] - 0.5 < this.minimaps[i].elevation) { + if (i !== this.currentIndex) { + this.currentIndex = i - 1; + return true; + } + return false; + } + } + if (this.currentIndex !== this.minimaps.length - 1) { + this.currentIndex = this.minimaps.length - 1; + return true; + } + return false; + } +} + +async function downloadMinimap(width: number, height: number, scene: SceneData, glMatrix: typeof GlMatrix): Promise { + const minimaps: MinimapInfo[] = []; + + // perform a db search to get the metadata + const iterator = scene?.db?.search( + { + searchPattern: [{ property: "Novorender/Document/Preview", exact: true }], + }, + undefined + ); + const iteratorResult = await iterator?.next(); + const data = await iteratorResult?.value.loadMetaData(); + + let corner = glMatrix.vec3.create(); + const dirX = glMatrix.vec3.create(); + const dirY = glMatrix.vec3.create(); + let dx = 0; + let dy = 0; + let aspect = 0; + let elevation = 0; + let image = ""; + let topLevelWidth = 0; + let topLevelHeight = 0; + for (const prop of data.properties) { + switch (prop[0]) { + // get the corners + case "Novorender/Document/Corners": { + const points = prop[1].split("]"); + const c1 = points[0].replaceAll("[", "").split(","); + const c2 = points[1].replaceAll("[", "").split(","); + const c3 = points[2].replaceAll("[", "").split(","); + const a = glMatrix.vec3.fromValues(Number(c1[0]), Number(c1[1]), Number(c1[2])); + const b = glMatrix.vec3.fromValues(Number(c2[1]), Number(c2[2]), Number(c2[3])); + const c = glMatrix.vec3.fromValues(Number(c3[1]), Number(c3[2]), Number(c3[3])); + glMatrix.vec3.sub(dirX, b, a); + dx = glMatrix.vec3.len(dirX); + glMatrix.vec3.normalize(dirX, dirX); + glMatrix.vec3.sub(dirY, c, b); + dy = glMatrix.vec3.len(dirY); + glMatrix.vec3.normalize(dirY, dirY); + corner = glMatrix.vec3.clone(a); + elevation = a[1]; + aspect = dx / dy; + break; + } + + // get the image preview + case "Novorender/Document/Preview": { + const url = new URL((scene as SceneData).url); + url.pathname += prop[1]; + // This is the PDF image URL + image = url.toString(); + break; + } + + // get the top-level dimensions of quadtree + case "Novorender/Document/Size": { + const sizes = prop[1].split(","); + topLevelWidth = Number(sizes[0]); + topLevelHeight = Number(sizes[1]); + break; + } + } + } + minimaps.push({ + aspect, + image, + dx, + dy, + corner, + dirX, + dirY, + elevation, + }); + + minimaps.sort((a, b) => a.elevation - b.elevation); + + const minimap = new MinimapHelper(width, height, minimaps, glMatrix); + + // split the quadtree + await minimap.split(topLevelWidth, topLevelHeight); + + return minimap; +} + +/** + * ***************************************************************************************************** + * ***************************************************************************************************** + * END OF MINIMAP CLASS & HELPERS + * ***************************************************************************************************** + * ***************************************************************************************************** + */ diff --git a/v2/demo-snippets/tutorials/minimap/index.ts b/v2/demo-snippets/tutorials/minimap/index.ts new file mode 100644 index 0000000..a52493f --- /dev/null +++ b/v2/demo-snippets/tutorials/minimap/index.ts @@ -0,0 +1,6 @@ +import basicMinimap from "!!./basic_minimap.ts?raw"; +import { demo } from "../../misc"; + +export const minimap = { + ...demo("minimap", "basic_minimap", basicMinimap, { enablePreviewCanvas: true }, "Using tiled images as minimap."), +}; diff --git a/v2/demo-snippets/tutorials/object_groups/floors.ts b/v2/demo-snippets/tutorials/object_groups/floors.ts new file mode 100644 index 0000000..fd4aca0 --- /dev/null +++ b/v2/demo-snippets/tutorials/object_groups/floors.ts @@ -0,0 +1,198 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// we export this function to our react component which will then execute it once the demo started running. +export function showTip() { + return openAlert("Choose and click on any floor from the top-left to isolate the objectGroups in the selected floor's group."); +} + +// Condos demo scene +const SCENE_ID = "c132d3eecf4f4247ace112410f4219aa"; + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, canvas }: IParams) { + try { + // load scene into data api, create webgl api, view and load scene. + const [view, dataApi, objectGroups] = await initView(webglApi, dataJsApi, canvas); + + const scene = view.scene!; + + // run render loop and canvas resizeObserver + run(view, canvas); + + // Find floor groups + const floors = objectGroups.filter((group) => group.grouping?.toLowerCase() === "floors"); + + // Create buttons + createFloorButtons(canvas.parentElement!, floors, (floor: DataJsApi.ObjectGroup | undefined) => { + if (floor) { + // Hide all floors + floors.forEach((floor) => (floor.hidden = true)); + + // Show clicked + floor.hidden = false; + } else { + // Show all floors + floors.forEach((floor) => (floor.hidden = false)); + } + + // Handle visibility changes + handleVisibilityChanges(dataApi, scene, objectGroups); + }); + } catch (e) { + // Handle errors however you like + console.warn(e); + } +} + +// ID to track if handleVisibilityChanges has been called again before IDs have finished loading +let refillId = 0; +// Hide check groups' .hidden property and toggle their objects' visibility +async function handleVisibilityChanges(dataApi: DataJsApi.API, scene: WebglApi.Scene, groups: DataJsApi.ObjectGroup[]) { + // Reset highlights + scene.objectHighlighter.objectHighlightIndices.fill(0); + + // For groups that have large .ids lists we have to explicitly load the IDs + // when needed as to not bloat the .loadScene() response + const groupIdRequests: Promise[] = groups.map(async (group) => { + if ((group.selected || group.hidden) && !group.ids) { + group.ids = await dataApi.getGroupIds(SCENE_ID, group.id).catch(() => { + console.warn("failed to load ids for group - ", group.id); + return []; + }); + } + }); + + // Increment current refillId and assign local copy + const id = ++refillId; + + // Wait for IDs to be loaded if necessary + await Promise.all(groupIdRequests); + + // Abort changes if they are stale + if (id !== refillId) { + return; + } + + // Hide groups that have .hidden == true + groups.filter((group) => group.hidden).forEach((group) => group.ids?.forEach((id) => (scene.objectHighlighter.objectHighlightIndices[id] = 255))); + + scene.objectHighlighter.commit(); +} + +// HiddenRangeStarted +// UI setup +function createFloorButtons(container: HTMLElement, floors: DataJsApi.ObjectGroup[], onClick: (floor?: DataJsApi.ObjectGroup) => void): void { + const wrapper = document.createElement("div"); + wrapper.style.position = "absolute"; + wrapper.style.top = "0"; + + floors.forEach((floor) => { + const btn = document.createElement("button"); + btn.innerText = floor.name; + btn.onclick = () => { + onClick(floor); + }; + + wrapper.append(btn); + }); + + const btn = document.createElement("button"); + btn.innerText = "All"; + btn.onclick = () => { + onClick(); + }; + + wrapper.append(btn); + container.append(wrapper); +} + +async function initView(webglApi: typeof WebglApi, dataJsAPI: typeof DataJsApi, canvas: HTMLCanvasElement): Promise<[WebglApi.View, DataJsApi.API, DataJsApi.ObjectGroup[]]> { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsAPI.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + // Load scene metadata + const sceneData = await dataApi + // Condos scene ID, but can be changed to any public scene ID + .loadScene(SCENE_ID) + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams, objectGroups } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + return [view, dataApi, objectGroups]; +} + +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/object_groups/index.ts b/v2/demo-snippets/tutorials/object_groups/index.ts new file mode 100644 index 0000000..f4c908f --- /dev/null +++ b/v2/demo-snippets/tutorials/object_groups/index.ts @@ -0,0 +1,6 @@ +import floors from "!!./floors.ts?raw"; +import { demo } from "../../misc"; + +export const objectGroups = { + ...demo("object_groups", "floors", floors, {}, "Predefined groups that are set up for each floor and buttons that isolate objectGroups in the group of the clicked level."), +}; diff --git a/v2/demo-snippets/tutorials/object_metadata/fly_to.ts b/v2/demo-snippets/tutorials/object_metadata/fly_to.ts new file mode 100644 index 0000000..e395e94 --- /dev/null +++ b/v2/demo-snippets/tutorials/object_metadata/fly_to.ts @@ -0,0 +1,213 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, glMatrix, canvas }: IParams) { + try { + // load scene into data api, create webgl api, view and load scene. + const view = await initView(webglApi, dataJsApi, canvas); + + const scene = view.scene!; + + // run render loop and canvas resizeObserver + run(view, canvas); + + // Run search and fly to on load + // We set up a click listener below + { + const iterator = scene.search({ + searchPattern: [ + { + property: "GUID", + value: ["06yaxhMh5CwutD_i1oN9HO", "06yaxhMh5CwutD_i1oN9HR", "0aq88u2xXFvBCrfVLun4gr", "0aq88u2xXFvBCrfVLun4gH"], + }, + ], + // false/undefined because we don't need full metadata as the object bounds + // are included in the lightweight HierarcicalObjectReference. + full: false, + }); + + const searchResult: WebglApi.HierarcicalObjectReference[] = []; + for await (const object of iterator) { + searchResult.push(object); + } + + // Highlight results + highlightObjects( + scene, + searchResult.map((object) => object.id) + ); + + // Calculate bounds of multiple objects and fly to them + const bounds = getTotalBoundingSphere(searchResult, glMatrix); + if (bounds) { + view.camera.controller.zoomTo(bounds); + } + } + + // Listen to click events on the canvas + canvas.onclick = async (event) => { + // Pick object at clicked position + const result = await view.lastRenderOutput?.pick(event.offsetX, event.offsetY); + + // If picked position does not have any objects result will be undefined + if (!result) { + return; + } + + // Highlight picked object + highlightObjects(scene, [result.objectId]); + + // Load metadata as object bounds are not included in the pick result + const objectData = await scene.getObjectReference(result.objectId).loadMetaData(); + + // No calculation needed for single object + if (objectData.bounds?.sphere) { + view.camera.controller.zoomTo(objectData.bounds.sphere); + } + }; + } catch (e) { + // Handle however you like + console.warn(e); + } +} + +function getTotalBoundingSphere(nodes: WebglApi.HierarcicalObjectReference[], glMatrix: typeof GlMatrix): WebglApi.BoundingSphere | undefined { + const vec3 = glMatrix.vec3; + + const spheres: WebglApi.BoundingSphere[] = []; + for (const node of nodes) { + const sphere = node.bounds?.sphere; + + if (sphere) { + spheres.push(sphere); + } + } + + if (spheres.length < 1) { + return; + } + + const center = vec3.clone(spheres[0].center); + let radius = spheres[0].radius; + + for (let sphere of spheres) { + const delta = vec3.sub(vec3.create(), sphere.center, center); + const dist = vec3.len(delta) + sphere.radius; + + if (dist > radius) { + radius = (radius + dist) * 0.5; + vec3.add(center, center, vec3.scale(delta, delta, 1 - radius / dist)); + } + } + + return { center, radius }; +} + +function highlightObjects(scene: WebglApi.Scene, ids: number[]) { + // Reset highlights + scene.objectHighlighter.objectHighlightIndices.fill(0); + + // Set highlight to 1 for the selected objects + // In this case the highlight is green, set in initView() + ids.forEach((id) => (scene.objectHighlighter.objectHighlightIndices[id] = 1)); + + scene.objectHighlighter.commit(); +} +// HiddenRangeStarted +async function initView(webglApi: typeof WebglApi, dataJsAPI: typeof DataJsApi, canvas: HTMLCanvasElement) { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsAPI.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + // Load scene metadata + const sceneData = await dataApi + // Condos scene ID, but can be changed to any public scene ID + .loadScene("3b5e65560dc4422da5c7c3f827b6a77c") + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + // make object highlights + const highlightGroup0 = api.createHighlight({ kind: "neutral" }); + const highlightGroup1 = api.createHighlight({ + kind: "color", + color: [0, 1, 0], + }); + view.settings.objectHighlights = [highlightGroup0, highlightGroup1]; + + return view; +} + +async function run(view: WebglApi.View, canvas: HTMLCanvasElement) { + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/object_metadata/index.ts b/v2/demo-snippets/tutorials/object_metadata/index.ts new file mode 100644 index 0000000..2eb3334 --- /dev/null +++ b/v2/demo-snippets/tutorials/object_metadata/index.ts @@ -0,0 +1,10 @@ +import fromPick from "!!./metadata_from_pick.ts?raw"; +import fromSearch from "!!./metadata_from_search.ts?raw"; +import flyTo from "!!./fly_to.ts?raw"; +import { demo } from "../../misc"; + +export const objectMetadata = { + ...demo("object_metadata", "metadata_from_pick", fromPick, {}, "Metadata from picking objects."), + ...demo("object_metadata", "metadata_from_search", fromSearch, {}, "Metadata from search."), + ...demo("object_metadata", "fly_to", flyTo, {}, "How to fly to objects using CameraController.zoomTo(), When the example is run it will first do a quick search for 4 objects and fly to them. After that it will fly to any object you click."), +}; diff --git a/v2/demo-snippets/tutorials/object_metadata/metadata_from_pick.ts b/v2/demo-snippets/tutorials/object_metadata/metadata_from_pick.ts new file mode 100644 index 0000000..c9cc98f --- /dev/null +++ b/v2/demo-snippets/tutorials/object_metadata/metadata_from_pick.ts @@ -0,0 +1,152 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// we export this function to our react component which will then execute it once the demo started running. +export function showTip() { + return openAlert("Select any object to display its metadata"); +} + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, canvas }: IParams) { + try { + // load scene into data api, create webgl api, view and load scene. + const view = await initView(webglApi, dataJsApi, canvas); + + const scene = view.scene!; + + // run render loop and canvas resizeObserver + run(view, canvas); + + // Listen to click events on the canvas + canvas.onclick = async (event) => { + // Pick object at clicked position + const result = await view.lastRenderOutput?.pick(event.offsetX, event.offsetY); + + // If picked position does not have any objects result will be undefined + if (!result) { + return; + } + + // Highlight object that the metadata belong to + highlightObject(scene, result.objectId); + + // Load metadata + const objectData = await scene.getObjectReference(result.objectId).loadMetaData(); + + // Display metadata + openInfoPane(objectData); + }; + } catch (e) { + // Handle however you like + console.warn(e); + } +} + +function highlightObject(scene: WebglApi.Scene, id: number): void { + // Reset highlights + scene.objectHighlighter.objectHighlightIndices.fill(0); + + // Set highlight to 1 for the selected object + // In this case the highlight is green, set in initView() + scene.objectHighlighter.objectHighlightIndices[id] = 1; + + scene.objectHighlighter.commit(); +} + +// HiddenRangeStarted +async function initView(webglApi: typeof WebglApi, dataJsAPI: typeof DataJsApi, canvas: HTMLCanvasElement): Promise { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsAPI.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + // Load scene metadata + const sceneData = await dataApi + .loadScene("3b5e65560dc4422da5c7c3f827b6a77c") // Condos scene ID, but can be changed to any public scene ID + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + // make object highlights + const highlightGroup0 = api.createHighlight({ kind: "neutral" }); + const highlightGroup1 = api.createHighlight({ + kind: "color", + color: [0, 1, 0], + }); + view.settings.objectHighlights = [highlightGroup0, highlightGroup1]; + + return view; +} + +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/object_metadata/metadata_from_search.ts b/v2/demo-snippets/tutorials/object_metadata/metadata_from_search.ts new file mode 100644 index 0000000..3257c01 --- /dev/null +++ b/v2/demo-snippets/tutorials/object_metadata/metadata_from_search.ts @@ -0,0 +1,160 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, canvas }: IParams) { + try { + // load scene into data api, create webgl api, view and load scene. + const view = await initView(webglApi, dataJsApi, canvas); + + const scene = view.scene!; + + // run render loop and canvas resizeObserver + run(view, canvas); + + const iterator = scene.search({ + searchPattern: "Roof", + // True so that metadata is preloaded + full: true, + }); + + const searchResult: WebglApi.ObjectData[] = []; + + // Use the first 5 results to keep the properties in the property box + // relatively short + for (let i = 0; i < 5; i++) { + const iteratorResult = await iterator.next(); + + if (iteratorResult.done) { + break; + } + + // Because we have set the search option "full: true" + // .loadMetadata() will not result in any more requests being made + // Try flipping it to false and see the difference in the network request log + const objectWithMetadata = await iteratorResult.value.loadMetaData(); + searchResult.push(objectWithMetadata); + } + + // Highlight results + highlightObjects( + scene, + searchResult.map((object) => object.id) + ); + // Display metadata + openInfoPane(searchResult); + } catch (e) { + // Handle however you like + console.warn(e); + } +} + +function highlightObjects(scene: WebglApi.Scene, ids: number[]): void { + // Reset highlights + scene.objectHighlighter.objectHighlightIndices.fill(0); + + // Set highlight to 1 for the selected objects + // In this case the highlight is green, set in initView() + ids.forEach((id) => (scene.objectHighlighter.objectHighlightIndices[id] = 1)); + + scene.objectHighlighter.commit(); +} + +// HiddenRangeStarted +async function initView(webglApi: typeof WebglApi, dataJsAPI: typeof DataJsApi, canvas: HTMLCanvasElement): Promise { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsAPI.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + // Load scene metadataa + const sceneData = await dataApi + // Condos scene ID, but can be changed to any public scene ID + .loadScene("3b5e65560dc4422da5c7c3f827b6a77c") + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + // make object highlights + const highlightGroup0 = api.createHighlight({ kind: "neutral" }); + const highlightGroup1 = api.createHighlight({ + kind: "color", + color: [0, 1, 0], + }); + view.settings.objectHighlights = [highlightGroup0, highlightGroup1]; + + return view; +} + +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/object_selection/index.ts b/v2/demo-snippets/tutorials/object_selection/index.ts new file mode 100644 index 0000000..447b751 --- /dev/null +++ b/v2/demo-snippets/tutorials/object_selection/index.ts @@ -0,0 +1,6 @@ +import pick from "!!./pick.ts?raw"; +import { demo } from "../../misc"; + +export const objectSelection = { + ...demo("object_selection", "pick", pick, {}, "Highlighting sets/groups of objects."), +}; diff --git a/v2/demo-snippets/tutorials/object_selection/pick.ts b/v2/demo-snippets/tutorials/object_selection/pick.ts new file mode 100644 index 0000000..aaef9e2 --- /dev/null +++ b/v2/demo-snippets/tutorials/object_selection/pick.ts @@ -0,0 +1,107 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, canvas }: IParams) { + // initialize the webgl api + const api = webglApi.createAPI(); + + // Create View, camera controller and load scene + const view = await initView(api, canvas); + + const scene = view.scene!; + + // run render loop and canvas resizeObserver + run(view, canvas); + + // Set up highlight groups + const deSaturated = api.createHighlight({ + kind: "hsla", + saturation: 0.5, + }); + const limeGreen = api.createHighlight({ + kind: "color", + color: [0, 1, 0], + }); + + view.settings.objectHighlights = [deSaturated, limeGreen]; + + // Listen to click events to pick objects + canvas.onclick = async (e: MouseEvent) => { + const result = await view.lastRenderOutput?.pick(e.offsetX, e.offsetY); + if (result) { + // Reset highlights + // Here we set all objects to use the highlight found at view.settings.objectHighlights[0] + // In this case "deSaturated" + scene.objectHighlighter.objectHighlightIndices.fill(0); + + // Set selected object to use highlight found at view.settings.objectHighlights[1] + // In this case "limeGreen" + scene.objectHighlighter.objectHighlightIndices[result.objectId] = 1; + + scene.objectHighlighter.commit(); + } + }; +} +// HiddenRangeStarted +async function initView(api: WebglApi.API, canvas: HTMLCanvasElement): Promise { + // Create a view + const view = await api.createView( + { background: { color: [0, 0, 0, 0] } }, // Transparent + canvas + ); + + // Provide a camera controller + view.camera.controller = api.createCameraController({ kind: "flight" }, canvas); + + // Load the Condos demo scene + view.scene = await api.loadScene(WebglApi.WellKnownSceneUrls.condos); + + return view; +} +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/pdf_placement/index.ts b/v2/demo-snippets/tutorials/pdf_placement/index.ts new file mode 100644 index 0000000..b025687 --- /dev/null +++ b/v2/demo-snippets/tutorials/pdf_placement/index.ts @@ -0,0 +1,7 @@ +import pdfPlacement from "!!./pdf_placement.ts?raw"; + +import { demo } from "../../misc"; + +export const PDFPlacement = { + ...demo("pdf_placement", "pdf_placement", pdfPlacement, { enablePreviewCanvas: true }, "Use two reference points on both the model and the PDF to place and scale the PDF in 3D space."), +}; diff --git a/v2/demo-snippets/tutorials/pdf_placement/pdf_placement.ts b/v2/demo-snippets/tutorials/pdf_placement/pdf_placement.ts new file mode 100644 index 0000000..89b9433 --- /dev/null +++ b/v2/demo-snippets/tutorials/pdf_placement/pdf_placement.ts @@ -0,0 +1,419 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; +import type { API, RecursivePartial, RenderSettings, RenderOutput, View, OrthoControllerParams, Scene } from "@novorender/webgl-api"; +import type { SceneData } from "@novorender/data-js-api"; +import type { DrawPart, DrawProduct } from "@novorender/measure-api"; +import type { vec2, ReadonlyVec3 } from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// we export this function to our react component which will then execute it once the demo started running. +export function showTip() { + return openAlert("Choose 2 points from the 3D view (on the left) and 2 points from the PDF view (on the right), both in the identical locations, to show the computations."); +} +const DATA_API_SERVICE_URL = "https://data.novorender.com/api"; + +// HiddenRangeEnded +export async function main({ webglApi, measureApi, dataJsApi, glMatrix, canvas, canvas2D, previewCanvas }: IParams) { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsApi.createAPI({ + // we're loading a public scene so it doesn't require any auth header, + // see `https://docs.novorender.com/docs/tutorials/loading_scenes#private-scenes` if you want to load private scenes. + serviceUrl: DATA_API_SERVICE_URL, + }); + + // Initialize measureApi instance + const _measureApi = await measureApi.createMeasureAPI(); + + // load a public scene + const pdfScene = (await dataApi.loadScene("4f50d89ea8cd493ea3bc16f504ad5a1f")) as SceneData; + + // render config, adjust however you want + const renderSettings: RecursivePartial = { + quality: { + resolution: { value: 1 }, // Set resolution scale to 1 + }, + clippingVolume: { + enabled: true, + mode: "union", + planes: [[0, 1, 0, -5.5]], + }, + }; + + // create webgl api, view and load scene and set cameraController. + const view = await initView(webglApi, canvas, pdfScene, renderSettings); + + // @todo - re-enable + // const elevation = await getElevation(view.scene as Scene); + + let preview: string | undefined; + + if (pdfScene && !(pdfScene as any).error) { + preview = await downloadPdfPreview(pdfScene as SceneData); + } + const previewCanvasContext2D = previewCanvas.getContext("2d"); + + if (preview) { + // image to draw on PDF view (right side). + const img = new Image(); + img.onload = () => { + if (previewCanvasContext2D) { + previewCanvasContext2D.drawImage( + img, + 0, + 0, + previewCanvas.width, + previewCanvas.height + // 0, + // 0, + // previewCanvas.width, + // previewCanvas.height + ); + } + }; + img.src = preview as string; + } else { + // just to show error details on previewCanvas, if preview failed to load + showErrorDetails(previewCanvas, previewCanvasContext2D, (pdfScene as any).error); + } + + /** vars for 3D view click listener */ + const context2D = canvas2D.getContext("2d"); + let currentOutput: RenderOutput; + let selectEntity: 1 | 2 = 1; + let posA: ReadonlyVec3 | undefined; + let posB: ReadonlyVec3 | undefined; + let draw: MeasureApi.DrawProduct | undefined; + /** END */ + + // 3D view click listener + canvas.onclick = async (e: MouseEvent) => { + if (currentOutput) { + const pickInfo = await currentOutput.pick(e.offsetX, e.offsetY); + if (pickInfo) { + if (selectEntity === 1) { + posA = pickInfo.position; + selectEntity = 2; + } else { + posB = pickInfo.position; + selectEntity = 1; + } + if (posA && posB) { + draw = _measureApi.getDrawObjectFromPoints(view, [posA, posB], false, false); + } else if (posA) { + draw = _measureApi.getDrawObjectFromPoints(view, [posA], false, false); + } + await drawProduct(context2D, draw, 3, canvas2D); + } + } + }; + + /** vars for PDF view (right-side) click listener */ + let pdfPosA: vec2 | undefined; + let pdfPosB: vec2 | undefined; + let imgHeight: number; + let imgWidth: number; + let previewCanvasWidth: number; + let previewCanvasHeight: number; + let updatedPdfPosA: vec2 | null; + let updatedPdfPosB: vec2 | null; + let selectingA = true; + /** END */ + + // Preview Canvas (right-side) click listener + previewCanvas.onclick = (e: MouseEvent) => { + // destructure necessary glMatrix functions + const { + vec2: { fromValues, dist, sub, create, normalize, dot }, + } = glMatrix; + + if (previewCanvas && preview && previewCanvasContext2D) { + // check if positions were updated via pane resizes + // not necessary if you don't resize pane/canvas + if (updatedPdfPosA) { + pdfPosA = updatedPdfPosA; + updatedPdfPosA = null; + } + if (updatedPdfPosB) { + pdfPosB = updatedPdfPosB; + updatedPdfPosB = null; + } + + previewCanvasWidth = previewCanvas.width; + previewCanvasHeight = previewCanvas.height; + + const x = e.offsetX; + const y = e.offsetY; + + if (selectingA) { + pdfPosA = fromValues(x, y); + } else { + pdfPosB = fromValues(x, y); + } + selectingA = !selectingA; + if (preview && previewCanvasContext2D) { + const img = new Image(); + img.onload = () => { + if (previewCanvasContext2D && preview) { + // Redraw the image to the preview canvas + previewCanvasContext2D.clearRect(0, 0, previewCanvasWidth, previewCanvasHeight); + previewCanvasContext2D.drawImage(img, 0, 0, previewCanvasWidth, previewCanvasHeight); + imgHeight = img.height; + imgWidth = img.width; + if (pdfPosA) { + drawArc(previewCanvasContext2D, pdfPosA[0], pdfPosA[1], "green"); + } + if (pdfPosB) { + drawArc(previewCanvasContext2D, pdfPosB[0], pdfPosB[1], "blue"); + } + } + }; + img.src = preview; + } + if (posA && posB && draw) { + if (pdfPosA && pdfPosB) { + const modelPosA = fromValues(posA[0], posA[2] * -1); + const modelPosB = fromValues(posB[0], posB[2] * -1); + const canvasToImageScaleX = imgWidth / previewCanvasWidth; + const canvasToImageScaleY = imgHeight / previewCanvasHeight; + //Invert Y axis on the pixel positions on the pdf image + const pixelPosA = fromValues(pdfPosA[0] * canvasToImageScaleX, imgHeight - pdfPosA[1] * canvasToImageScaleY); + const pixelPosB = fromValues(pdfPosB[0] * canvasToImageScaleX, imgHeight - pdfPosB[1] * canvasToImageScaleY); + const pixelLength = dist(pixelPosA, pixelPosB); + const modelLength = dist(modelPosA, modelPosB); + const modelDir = sub(create(), modelPosB, modelPosA); + normalize(modelDir, modelDir); + const pixDir = sub(create(), pixelPosA, pixelPosB); + normalize(pixDir, pixDir); + const scale = modelLength / pixelLength; + const radAroundZ = Math.acos(dot(modelDir, pixDir)) * -1; + const degreesAroundZ = (radAroundZ / Math.PI) * 180; + const pdfToWorldScale = imgHeight * scale; + const translation = sub(create(), modelPosA, fromValues(pixelPosA[0] * scale * Math.cos(radAroundZ), pixelPosA[1] * scale * Math.sin(radAroundZ))); + + // calculations to show/log in the info pane + const calculations = { radians: radAroundZ, degrees: degreesAroundZ, pdfToWorldScale, translation }; + openInfoPane(calculations, "PDF Transformation"); + } + } + } + }; + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // runs resizeObserver for main canvas (3D view), just to update width/height. + runResizeObserver(view, canvas); + + // resizeObserver for preview canvas (right-side) to re-draw images/arc or update size on pane resizes. + new ResizeObserver((entries) => { + for (const { contentRect } of entries) { + const scaledWidth = contentRect.width / previewCanvasWidth; + const scaledHeight = contentRect.height / previewCanvasHeight; + if (pdfPosA) { + updatedPdfPosA = glMatrix.vec2.fromValues(scaledWidth * pdfPosA[0], scaledHeight * pdfPosA[1]); + } + if (pdfPosB) { + updatedPdfPosB = glMatrix.vec2.fromValues(scaledWidth * pdfPosB[0], scaledHeight * pdfPosB[1]); + } + if (preview && previewCanvasContext2D) { + const img = new Image(); + img.onload = () => { + if (previewCanvasContext2D && preview) { + previewCanvasContext2D.clearRect(0, 0, contentRect.width, contentRect.height); + // Redraw the image to the preview canvas + previewCanvasContext2D.drawImage(img, 0, 0, contentRect.width, contentRect.height); + if (updatedPdfPosA) { + drawArc(previewCanvasContext2D, updatedPdfPosA[0], updatedPdfPosA[1], "green"); + } + if (updatedPdfPosB) { + drawArc(previewCanvasContext2D, updatedPdfPosB[0], updatedPdfPosB[1], "blue"); + } + } + }; + img.src = preview; + } + } + }).observe(previewCanvas); + + // render loop + while (true) { + // Render frame + currentOutput = await view.render(); + { + // Finalize output image + const image = await currentOutput.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + if (posA && posB) { + draw = _measureApi.getDrawObjectFromPoints(view, [posA, posB], false, false); + } else if (posA) { + draw = _measureApi.getDrawObjectFromPoints(view, [posA], false, false); + } + await drawProduct(context2D, draw, 3, canvas2D); + (currentOutput as any).dispose(); + } +} + +async function getElevation(scene: Scene): Promise { + try { + const iterator = scene.search( + { + searchPattern: [{ property: "IfcClass", value: "IfcBuildingStorey", exact: true }], + }, + undefined + ); + const iteratorResult = await iterator.next(); + const data = await iteratorResult.value.loadMetaData(); + for (const prop of data.properties) { + if (prop[0] === "Novorender/Elevation") { + return Number(prop[1]); + } + } + return undefined; + } catch (error) { + console.log(error); + } +} + +async function downloadPdfPreview(scene: SceneData): Promise { + if (scene.db) { + // perform a db search to get the metadata + const iterator = scene.db.search( + { + searchPattern: [{ property: "Novorender/Document/Preview", exact: true }], + }, + undefined + ); + const iteratorResult = await iterator.next(); + const data = await iteratorResult.value.loadMetaData(); + for (const prop of data.properties) { + if (prop[0] === "Novorender/Document/Preview") { + const url = new URL((scene as any).url); + url.pathname += prop[1]; + // This is the PDF image URL + return url.toString(); + } + } + } + return undefined; +} + +// HiddenRangeStarted +function showErrorDetails(canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D | null, error: string) { + ctx!.font = "18px Arial"; + ctx!.fillStyle = "red"; + ctx!.textAlign = "center"; + ctx!.fillText(`Failed to load the PDF Preview.`, canvas.width / 2, canvas.height / 2); + ctx!.fillText(`Error: ${error}`, canvas.width / 2, canvas.height / 1.8); +} + +async function initView(webglApi: typeof WebglApi, canvas: HTMLCanvasElement, pdfScene: SceneData, renderSettings: RecursivePartial): Promise { + // Destructure relevant properties into variables + const { settings } = pdfScene; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(WebglApi.WellKnownSceneUrls.condos); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + view.applySettings(renderSettings); + + //set up camera controller + const orthoController = api.createCameraController({ kind: "ortho" }, canvas); + (orthoController as any).init([750, 18, -180], [0, 0, 0], view.camera); + (orthoController.params as OrthoControllerParams).referenceCoordSys = [1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 728, 7, -230, 1]; + (orthoController.params as OrthoControllerParams).fieldOfView = 35; + view.camera.controller = orthoController; + + // Assign the scene to the view + view.scene = scene; + + return view; +} + +async function runResizeObserver(view: View, canvas: HTMLCanvasElement): Promise { + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const { target, contentRect } of entries) { + canvas.width = contentRect.width; + canvas.height = contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); +} + +// Below are utility functions copied from our frontend (https://github.com/novorender/novoweb/blob/develop/src/features/engine2D/utils.ts) +interface ColorSettings { + lineColor?: string | CanvasGradient; + fillColor?: string; + pointColor?: string | { start: string; middle: string; end: string }; + outlineColor?: string; + complexCylinder?: boolean; +} + +function drawProduct(context2D: CanvasRenderingContext2D | null, product: DrawProduct | undefined, pixelWidth: number, canvas2D: HTMLCanvasElement): void { + if (product) { + if (context2D) { + context2D.clearRect(0, 0, canvas2D.width, canvas2D.height); + for (const obj of (product as DrawProduct).objects) { + obj.parts.forEach((part) => { + drawPart(context2D, part, pixelWidth); + }); + } + } + } +} + +function drawPart(ctx: CanvasRenderingContext2D, part: DrawPart, pixelWidth: number): void { + if (part.vertices2D) { + ctx.lineWidth = pixelWidth; + drawPoints(ctx, part); + } +} + +function drawPoints(ctx: CanvasRenderingContext2D, part: DrawPart): void { + const colorSettings: Array = [ + { fillColor: "green", outlineColor: "green", lineColor: "green" }, + { fillColor: "blue", outlineColor: "blue", lineColor: "blue" }, + ]; + + if (part.vertices2D) { + for (let i = 0; i < part.vertices2D.length; ++i) { + drawArc(ctx, part.vertices2D[i][0], part.vertices2D[i][1], colorSettings[i].fillColor as string); + } + } +} + +function drawArc(ctx: CanvasRenderingContext2D, x: number, y: number, fillStyle: string): void { + ctx.fillStyle = fillStyle; + ctx.lineWidth = 2; + ctx.strokeStyle = "black"; + ctx.beginPath(); + ctx.arc(x, y, 5, 0, 2 * Math.PI); + ctx.fill(); + ctx.stroke(); +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/searching/exact_search.ts b/v2/demo-snippets/tutorials/searching/exact_search.ts new file mode 100644 index 0000000..f2722c6 --- /dev/null +++ b/v2/demo-snippets/tutorials/searching/exact_search.ts @@ -0,0 +1,134 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, canvas }: IParams) { + try { + // load scene into data api, create webgl api, view and load scene and set cameraController. + const view = await initView(webglApi, dataJsApi, canvas); + + const scene = view.scene!; + + // run render loop and canvas resizeObserver + run(view, canvas); + + // Run the searches + // Exact search only checking the property "ifcClass" and the exact value "ifcRoof" + const iterator = scene.search({ + searchPattern: [{ property: "ifcClass", value: "ifcRoof", exact: true }], + }); + + // In this example we just want to isolate the objects so all we need is the object ID + const result: number[] = []; + for await (const object of iterator) { + result.push(object.id); + } + + // Then we isolate the objects found + isolateObjects(scene, result); + } catch (e) { + console.warn(e); + } +} + +function isolateObjects(scene: WebglApi.Scene, ids: number[]): void { + // Set highlight 255 on all objects + // Highlight index 255 is reserved fully transparent + scene.objectHighlighter.objectHighlightIndices.fill(255); + + // Set highlight back to 0 for objects to be isolated + // Highlight 0 should be neutral as we haven't changed view.settings.objectHighlights + ids.forEach((id) => (scene.objectHighlighter.objectHighlightIndices[id] = 0)); + + scene.objectHighlighter.commit(); +} +// HiddenRangeStarted +async function initView(webglApi: typeof WebglApi, dataJsAPI: typeof DataJsApi, canvas: HTMLCanvasElement): Promise { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsAPI.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + // Load scene metadata + const sceneData = await dataApi + // Condos scene ID, but can be changed to any public scene ID + .loadScene("3b5e65560dc4422da5c7c3f827b6a77c") + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + return view; +} + +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/searching/exact_search_excluding_result.ts b/v2/demo-snippets/tutorials/searching/exact_search_excluding_result.ts new file mode 100644 index 0000000..fa7166a --- /dev/null +++ b/v2/demo-snippets/tutorials/searching/exact_search_excluding_result.ts @@ -0,0 +1,134 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, canvas }: IParams) { + try { + // load scene into data api, create webgl api, view and load scene and set cameraController. + const view = await initView(webglApi, dataJsApi, canvas); + + const scene = view.scene!; + + // run render loop and canvas resizeObserver + run(view, canvas); + + // Run the searches + // Same as the exact search, but with exclude. This will return all object except the ones found above. + const iterator = scene.search({ + searchPattern: [{ property: "ifcClass", value: "ifcRoof", exact: true, exclude: true }], + }); + + // In this example we just want to isolate the objects so all we need is the object ID + const result: number[] = []; + for await (const object of iterator) { + result.push(object.id); + } + + // Then we isolate the objects found + isolateObjects(scene, result); + } catch (e) { + console.warn(e); + } +} + +function isolateObjects(scene: WebglApi.Scene, ids: number[]): void { + // Set highlight 255 on all objects + // Highlight index 255 is reserved fully transparent + scene.objectHighlighter.objectHighlightIndices.fill(255); + + // Set highlight back to 0 for objects to be isolated + // Highlight 0 should be neutral as we haven't changed view.settings.objectHighlights + ids.forEach((id) => (scene.objectHighlighter.objectHighlightIndices[id] = 0)); + + scene.objectHighlighter.commit(); +} +// HiddenRangeStarted +async function initView(webglApi: typeof WebglApi, dataJsAPI: typeof DataJsApi, canvas: HTMLCanvasElement): Promise { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsAPI.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + // Load scene metadata + const sceneData = await dataApi + // Condos scene ID, but can be changed to any public scene ID + .loadScene("3b5e65560dc4422da5c7c3f827b6a77c") + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + return view; +} + +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/searching/fluffy_search.ts b/v2/demo-snippets/tutorials/searching/fluffy_search.ts new file mode 100644 index 0000000..01bf633 --- /dev/null +++ b/v2/demo-snippets/tutorials/searching/fluffy_search.ts @@ -0,0 +1,133 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, canvas }: IParams) { + try { + // load scene into data api, create webgl api, view and load scene and set cameraController. + const view = await initView(webglApi, dataJsApi, canvas); + + const scene = view.scene!; + + // run render loop and canvas resizeObserver + run(view, canvas); + + // Run the searches + // Fluffy search which will search all properties for words starting with "Roof" + // "Roo" will still find roofs, but "oof" will not + const iterator = scene.search({ searchPattern: "Roof" }); + + // In this example we just want to isolate the objects so all we need is the object ID + const result: number[] = []; + for await (const object of iterator) { + result.push(object.id); + } + + // Then we isolate the objects found + isolateObjects(scene, result); + } catch (e) { + console.warn(e); + } +} + +function isolateObjects(scene: WebglApi.Scene, ids: number[]): void { + // Set highlight 255 on all objects + // Highlight index 255 is reserved fully transparent + scene.objectHighlighter.objectHighlightIndices.fill(255); + + // Set highlight back to 0 for objects to be isolated + // Highlight 0 should be neutral as we haven't changed view.settings.objectHighlights + ids.forEach((id) => (scene.objectHighlighter.objectHighlightIndices[id] = 0)); + + scene.objectHighlighter.commit(); +} +// HiddenRangeStarted +async function initView(webglApi: typeof WebglApi, dataJsAPI: typeof DataJsApi, canvas: HTMLCanvasElement): Promise { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsAPI.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + // Load scene metadata + const sceneData = await dataApi + // Condos scene ID, but can be changed to any public scene ID + .loadScene("3b5e65560dc4422da5c7c3f827b6a77c") + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + return view; +} + +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/tutorials/searching/index.ts b/v2/demo-snippets/tutorials/searching/index.ts new file mode 100644 index 0000000..7d37a73 --- /dev/null +++ b/v2/demo-snippets/tutorials/searching/index.ts @@ -0,0 +1,13 @@ +import searchByPath from "!!./search_by_path.ts?raw"; +import fluffySearch from "!!./fluffy_search.ts?raw"; +import exactSearch from "!!./exact_search.ts?raw"; +import exactSearchExcludingResult from "!!./exact_search_excluding_result.ts?raw"; + +import { demo } from "../../misc"; + +export const searching = { + ...demo("searching", "searchByPath", searchByPath, {}, "Demonstration path search pattern where the resulting objects are isolated in the view."), + ...demo("searching", "fluffySearch", fluffySearch, {}, 'Fluffy search pattern which will search all properties for words starting with "Roof".'), + ...demo("searching", "exactSearch", exactSearch, {}, 'Exact search only checking the property "ifcClass" and the exact value "ifcRoof".'), + ...demo("searching", "exactSearchExcludingResult", exactSearchExcludingResult, {}, "Same as the Exact search pattern, but with exclude. This will return all objects except the ones found above."), +}; diff --git a/v2/demo-snippets/tutorials/searching/search_by_path.ts b/v2/demo-snippets/tutorials/searching/search_by_path.ts new file mode 100644 index 0000000..aea14cd --- /dev/null +++ b/v2/demo-snippets/tutorials/searching/search_by_path.ts @@ -0,0 +1,136 @@ +// HiddenRangeStarted +import * as WebglApi from "@novorender/webgl-api"; +import * as MeasureApi from "@novorender/measure-api"; +import * as DataJsApi from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +export interface IParams { + webglApi: typeof WebglApi; + measureApi: typeof MeasureApi; + dataJsApi: typeof DataJsApi; + glMatrix: typeof GlMatrix; + canvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; + previewCanvas: HTMLCanvasElement; +} + +// HiddenRangeEnded +export async function main({ webglApi, dataJsApi, canvas }: IParams) { + try { + // load scene into data api, create webgl api, view and load scene and set cameraController. + const view = await initView(webglApi, dataJsApi, canvas); + + const scene = view.scene!; + + // run render loop and canvas resizeObserver + run(view, canvas); + + // Run the searches + // Path is similar to filesystem file/folder hierarchical paths, e.g. my_folder/my_object + // Paths reflect original CAD model hierarchy (.ifc, .rvm, etc) + // This will find all objects on the 2nd floor + const iterator = scene.search({ + parentPath: "Condos.ifc/3/Surface:2481563/Apartment with 12 condos/2ND FLOOR", + }); + + // In this example we just want to isolate the objects so all we need is the object ID + const result: number[] = []; + for await (const object of iterator) { + result.push(object.id); + } + + // Then we isolate the objects found + isolateObjects(scene, result); + } catch (e) { + console.warn(e); + } +} + +function isolateObjects(scene: WebglApi.Scene, ids: number[]): void { + // Set highlight 255 on all objects + // Highlight index 255 is reserved fully transparent + scene.objectHighlighter.objectHighlightIndices.fill(255); + + // Set highlight back to 0 for objects to be isolated + // Highlight 0 should be neutral as we haven't changed view.settings.objectHighlights + ids.forEach((id) => (scene.objectHighlighter.objectHighlightIndices[id] = 0)); + + scene.objectHighlighter.commit(); +} +// HiddenRangeStarted +async function initView(webglApi: typeof WebglApi, dataJsAPI: typeof DataJsApi, canvas: HTMLCanvasElement): Promise { + // Initialize the data API with the Novorender data server service + const dataApi = dataJsAPI.createAPI({ + serviceUrl: "https://data.novorender.com/api", + }); + + // Load scene metadata + const sceneData = await dataApi + // Condos scene ID, but can be changed to any public scene ID + .loadScene("3b5e65560dc4422da5c7c3f827b6a77c") + .then((res) => { + if ("error" in res) { + throw res; + } else { + return res; + } + }); + + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + // Set resolution scale to 1 + view.applySettings({ quality: { resolution: { value: 1 } } }); + + // Create a camera controller with the saved parameters with turntable as fallback + const camera = cameraParams ?? ({ kind: "turntable" } as any); + view.camera.controller = api.createCameraController(camera, canvas); + + // Assign the scene to the view + view.scene = scene; + + return view; +} + +async function run(view: WebglApi.View, canvas: HTMLCanvasElement): Promise { + // Handle canvas resizes + new ResizeObserver((entries) => { + for (const entry of entries) { + canvas.width = entry.contentRect.width; + canvas.height = entry.contentRect.height; + view.applySettings({ + display: { width: canvas.width, height: canvas.height }, + }); + } + }).observe(canvas); + + // Create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // render loop + while (true) { + // Render frame + const output = await view.render(); + { + // Finalize output image + const image = await output.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + (output as any).dispose(); + } +} +// HiddenRangeEnded diff --git a/v2/demo-snippets/typings.d.ts b/v2/demo-snippets/typings.d.ts new file mode 100644 index 0000000..5fa4857 --- /dev/null +++ b/v2/demo-snippets/typings.d.ts @@ -0,0 +1,17 @@ +// whenever we import typescript files with the .ts extension, it's a demo code snippet that we want to treat as a url rather than actual code. +declare module "*.ts?raw" { + const content: string; + export default content; +} + +/** +* @description opens an alert that displays provided content +* @param content string to show in the alert +*/ +declare function openAlert(content: string, type: 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'danger' = 'info'): void; + +/** +* @description opens a pane in bottom left of renderer to show any text +* @param content string to show in the info pane +*/ +declare function openInfoPane(content: object | string | any, title?: string): void; \ No newline at end of file diff --git a/v2/docs/test.ts b/v2/docs/test.ts new file mode 100644 index 0000000..63abcaa --- /dev/null +++ b/v2/docs/test.ts @@ -0,0 +1,36 @@ +/** + * @description a simple greeting function + * @param name any name + * @returns a string that greets user + */ +function helloWorld(name: string): string { + // begin_code_block_1 + const greet = "Hello"; + // end_code_block_1 + + // begin_code_block_2 + return `${greet} ${name}`; + // end_code_block_2 +} + +/** + * @description a simple greeting function + * @param name any name + * @returns a string that greets user + */ +function foo(name: string): string { + // begin_code_block_3 + return `Hello foo`; + // end_code_block_3 +} + +/** + * @description a simple greeting function + * @param name any name + * @returns a string that greets user + */ +function bar(name: string): string { + // begin_code_block_4 + return `Hello bar`; + // end_code_block_4 +} diff --git a/v2/docs/tutorials/clipping_volumes.mdx b/v2/docs/tutorials/clipping_volumes.mdx new file mode 100644 index 0000000..99bdc45 --- /dev/null +++ b/v2/docs/tutorials/clipping_volumes.mdx @@ -0,0 +1,106 @@ +--- +title: "Clipping Volumes" +description: "Clipping allows you to render only part of a scene." +keywords: ["novorender api docs", "webgl api", "clipping volumes"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +Clipping allows you to render only part of a scene. +This can be useful to reveal internal structures that would otherwise be obscured by surrounding geometry, such as walls and outer shells. + +:::note +Clipping volumes does not currently apply to dynamic objects or the test cube scene! +::: + +Clipping volumes are formed by a set of planes, or halfspaces. +Each halfspace is defined by a plane normal vector `nx,ny,nz` and an offset (negative distance) along that vector `o`. +From this we can compute a signed distance to that plane for any given 3D coordinate (x,y,z). + +```typescript +signed_distance = (x, y, z) => x * nx + y * ny + z * nz + o; +``` + +This can be expressed as a 4D dot product where the w component of the input is 1. + +```typescript +signed_distance = dot_product([x, y, z, 1], [nx, ny, nz, o]); +``` + +The positive side of this plane, i.e. signed_distance > 0, is considered "outside" the halfspace, whereas the negative sinde "inside". +Points that lie outside will we clipped, while the negative ones will be rendered. + +### Single plane + +To illustrate this, let's create a simple clipping volume with a single plane along the yz axes, effectively clipping everything to the right of center. + + + +### Single plane with offset + +We used the center of the scene (which is far from origo) to position the plane. +Let's add a few meters extra to observe the effects + + + +### Single plane, flipped + +You may flip the plane by flipping the direction of the normal. +When doing so, also remember to negate the offset. +Or, to put another way, simply negate all the elements `[-nx,-ny,-nz,-o]`. + + + +### Single plane, rotated + +Of course, you may use any normal you like for the plane, as long as it's length = 1. + + + +### Dual plane + +Adding additional planes allows us to further shape the clipping volume. +Each plane forms a half space, which you may think of as the volume of everything that lies on the positive side of the plane to infinity. +When combining multiple such half spaces, we must determine whether to use the intersection or union of these halfspace volumes. +Put simply, intersection is the volume that lies on the positive side of all the planes, while union is the volume that lines on the positive side of any of the planes. + +```typescript +intersection = sd1 > 0 && sd2 > 0; +union = sd1 > 0 || sd2 > 0; +``` + +:::info +For those familiar with [CSG (constructive solid geometry)](https://en.wikipedia.org/wiki/Constructive_solid_geometry), the clipping volume is defined by a simple CSG expression. +::: + +Let's create a more complex clipping volume with an additional plane along the xz axes, effectively clipping everything to the right and above center. + + + +### Dual plane, slab + +A perhaps more useful volume is a slab, consisting of a top and bottom plane, but otherwise extending into infinity. + + + +### Inverted slab + +If you wish to clip everything inside of the volume, rather than outside, simply flip the planes (negate all elements) and change the combination mode. + + + +### Box + +We currently support up to 6 planes, allowing you to define simple polyhedra of any size, rotation and position. +Let's define an axis aligned clipping box. + + +
+ +:::info + +Using clipping volumes currently does not affect memory usage or significantly impact rendering performance. +They simply work by excluding pixels that lie outside the volume at the very last stage of the rendering pipeline. +Their intended use it as a visual aid, not as an optimization. + +::: diff --git a/v2/docs/tutorials/drawing2D.mdx b/v2/docs/tutorials/drawing2D.mdx new file mode 100644 index 0000000..d3a8955 --- /dev/null +++ b/v2/docs/tutorials/drawing2D.mdx @@ -0,0 +1,102 @@ +--- +title: "Draw measure objects and results" +description: "Draw measure entity or results into a 2D canvas using Measure API." +keywords: ["novorender api docs", "measure api", "2D drawing"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +NovoRender measure API can be used to draw measure entity or results into a 2D canvas. +It can be used with utility functions found in the open source Novoweb [github repository](https://github.com/novorender/novoweb/blob/develop/src/features/engine2D/utils.ts). +These functions are placed in the frontend code to make it easy for developers to change the style of 2d drawings to fit their own application. +These functions can also be found at the bottom of the demo + +### Draw entites + +Many objects returned from the measure API contains a [drawkind](/docs/measure-api/interfaces/Measure.DrawableEntity#drawkind), as long as the returned value contains this value then it can be drawn using [getDrawMeasureEntity()](/docs/measure-api/interfaces/Measure.MeasureAPI#getdrawmeasureentity). [getDrawMeasureEntity()](/docs/measure-api/interfaces/Measure.MeasureAPI#getdrawmeasureentity) found in the measure API will return a hierarchical set of objects that be used to draw to screen. + +The objects contains both 3d and 2d data and various information about drawing types, names, display text and more. +The function will require [view](/docs/webgl-api/interfaces/NovoRender.View) from the NovoRender webgl-API to transform the 3d data to 2d. +The [camera](/docs/webgl-api/interfaces/NovoRender.View#camera) from webgl-API view is also used in the draw utility function to remove certain drawing parts and text based on camera angle and distance + +:::note +Check the parametric measure tutorial on how to select measure entities. +::: + +```typescript +const entity = await measureScene.pickMeasureEntity(objectId, position); +const drawProd = await measureApi.getDrawMeasureEntity(view, measureScene, entity); +const { camera } = view; +const cameraDirection = vec3.transformQuat(vec3.create(), vec3.fromValues(0, 0, -1), camera.rotation); +const camSettings = { pos: camera.position, dir: cameraDirection }; +if (drawProd) { + //Function found in the utility ts file + drawProduct(context2D, camSettings, drawProd, { lineColor: "yellow", fillColor: "blue" }, 3); +} +``` + +### Draw measure result + +The measure result also contains [drawkind](/docs/measure-api/interfaces/Measure.DrawableEntity#drawkind) and can be drawn using [getDrawMeasureEntity()](/docs/measure-api/interfaces/Measure.MeasureAPI#getdrawmeasureentity). +The result will contain information on how to draw the measure line, x, y and z dimensions of the measurement as well as certain angles. +The result object can be drawn using the utility function [drawProduct()](https://github.com/novorender/novoweb/blob/develop/src/features/engine2D/utils.ts#L24) as above but we have chosen to handle each part of the result separately to give more flexibility on style and colour. + +Example shows distance line drawn in blue, the z-axis line and angle drawn in green + +```typescript +const measureResult = await measurescene.measure(entity1, entity2); +const drawProd = await measureApi.getDrawMeasureEntity(view, measureScene, measureResult); +for (const obj of drawProd.objects) { + for (const part of obj.parts) { + if (part.vertices2D === undefined) { + continue; + } + switch (part.name) { + case "result": + drawPart(context2D, camSettings, part, { lineColor: "blue" }, 3, { + type: "distance", + }); + break; + case "z-axis": + drawPart(context2D, camSettings, part, { lineColor: "green" }, 3, { + type: "distance", + }); + break; + case "z-angle": + drawPart(context2D, camSettings, part, { lineColor: "green" }, 2, { + type: "distance", + }); + break; + } + } +} +``` + +### Draw line strip or polygon + +The measure API allows for multiple 3d points to be transformed to an on screen-linestrip or polygon. +This is used in the Novoweb frontend to display area and measurement between multiple points. +To get draw objects from a list of points use [getDrawObjectFromPoints()](/docs/measure-api/interfaces/Measure.MeasureAPI#getdrawobjectfrompoints) on the measure API. +Like other draw function it takes the webgl API view as an input, there are also options to display angle between the lines and whether or not to close it to create a polygon. +The position from webgl API [pick()](/docs/webgl-api/interfaces/NovoRender.View#pick) function can be stored to create lines between multiple clicked points. + +```typescript +//Draw a point line with line names and angles +const drawProd = measureApi.getDrawObjectFromPoints(view, pointLinePoints, false, true); +if (drawProd) { + const textList = pointLineResult.segmentLengths.map((v) => v.toFixed(2)); + drawProd.objects.forEach((obj) => { + obj.parts.forEach((part) => { + drawPart(context2D, camSettings, part, { lineColor: "yellow", pointColor: { start: "green" } }, 2, { type: "distance", customText: textList }); + }); + }); +} +``` + +### Demo + +Click to select parametric object, the selected parametric object will be draw, do note that a point will be drawn if the selected object does not contain parametric info. +Click another object to measure against, the parametric object will be drawn as well as the measure result. +Continued clicks will alternate between objects and log out the measurement values. + + diff --git a/v2/docs/tutorials/dynamic_objects.mdx b/v2/docs/tutorials/dynamic_objects.mdx new file mode 100644 index 0000000..b7a9013 --- /dev/null +++ b/v2/docs/tutorials/dynamic_objects.mdx @@ -0,0 +1,85 @@ +--- +title: "Dynamic Objects" +description: "Adding dynamic 3D objects into the view." +keywords: ["novorender api docs", "webgl api", "dynamic objects"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +While NovoRender is mostly about streaming and rendering large, static 3D scenes, sometimes you may want to add smaller, dynamic 3D objects into the view. +Dynamic objects are meant for small and lightweight objects, such as 3D widgets or avatars. +Currently we support [glTF 2.0](https://www.khronos.org/gltf/) (.gltf/.glb). +You can download these from any url, but we do provide a few gltf models on our server: https://api.novorender.com/assets/gltf/ + +:::caution +Please note that we don't currently support any glTF extensions. Nor do we support animations or skinning, among other things. +We recommend verifying your files using https://github.khronos.org/glTF-Validator/ or similar before use. +::: + +### Creation + +To download and parse a gltf file, call the [api.loadAsset()](/docs/webgl-api/interfaces/NovoRender.API#loadasset) function with a valid url, where api is an instance of our [webgl-api](/docs/webgl-api/interfaces/NovoRender.API). + +```typescript +const asset = await api.loadAsset(new URL("https://api.novorender.com/assets/gltf/logo.glb")); +``` + +:::caution +Avoid using large gltf files on mobile devices as these have quite severe memory and triangle restrictions! +::: +Now you can create instances of this asset in your scenes. You may reuse the same asset in multiple scenes. + +```typescript +const instance = scene.createDynamicObject(asset); +``` + +By default, new objects will have position `[0,0,0]` and no rotation `[0,0,0,1]`. + +:::info +The size of the gltf files should match the size of your scene. +The camera will not auto-fit to dynamic objects, so make sure the units are in meters and that the coordinates are in the same space as your scene, which could be geo-referenced. +::: + +To change object orientation, assign new position and/or rotation. + +```typescript +instance.position = [x, y, z]; // 3D vector +instance.rotation = [0, 0, 0, 1]; // identity quaternion +``` + +While you can use raw arrays like above for trivial cases, it's likely that you will want to use a linear algebra library, like [gl-matrix](https://glmatrix.net/). + +```typescript +instance.position = vec3.fromValues(px, py, pz); // 3D vector +instance.rotation = quat.fromEuler(quat.create(), rx, ry, rz); // Quaternion from euler angles +``` + +New objects are invisible by default. To actually render your object, change the visible flag. + +```typescript +instance.visible = true; +``` + +### Demo + + + +### Disposing + +To delete/remove an instance, call [dispose()](/docs/webgl-api/interfaces/NovoRender.API#dispose). + +```typescript +instance.dispose(); +``` + +Once you've disposed all the instances of an asset, you may dispose the asset itself to free up all the associated memory. + +```typescript +asset.dispose(); +``` + +:::note +When disposing an asset, the render pipeline may still have a reference to the model for the next frame. +If so, you would get an error. +You may want to render a frame or two first, to flush out any such lingering references. +::: diff --git a/v2/docs/tutorials/getting_started.mdx b/v2/docs/tutorials/getting_started.mdx new file mode 100644 index 0000000..3cad4a5 --- /dev/null +++ b/v2/docs/tutorials/getting_started.mdx @@ -0,0 +1,223 @@ +--- +title: "Getting started" +sidebar_position: 1 +description: "Setting up instructions for the various Novorender packages." +keywords: ["novorender api docs", "webgl api", "measure api", "data js api", "getting started"] +--- + +import { tutorials } from "@site/demo-snippets/index"; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import Link from "@docusaurus/Link"; + +## Installation + +All our APIs are available on NPM and can be installed with your preferred JS package manager. +To get started with Novorender and load a demo scene you will only need our [webgl-api](https://www.npmjs.com/package/@novorender/webgl-api) package. + + + + +```bash +npm install @novorender/webgl-api@next @novorender/data-js-api @novorender/measure-api +``` + + + + +```bash +yarn add @novorender/webgl-api@next @novorender/data-js-api @novorender/measure-api +``` + + + + +--- + +## Bundlers + +The webgl and measure APIs depend on workers which are not bundled and should be hosted as static files on your server. +The recommended approach is to copy them over to a static folder (often called public) after installation, which can be done with the `dependencies` or `postinstall` lifecycle scripts depending on your package manager. + +```js title="scripts/copy-novorender-workers.js" +const fs = require("fs"); + +const options = { + force: true, // overwrite files + recursive: true, +}; + +fs.cpSync("node_modules/@novorender/webgl-api", "public/novorender/webgl-api", options); +fs.cpSync("node_modules/@novorender/measure-api", "public/novorender/measure-api", options); +``` + + + + +```json title="package.json" +{ + // ..., + "scripts": { + // ..., + "dependencies": "node ./scripts/copy-novorender-workers.js" + } +} +``` + + + + +```json title="package.json" +{ + // ..., + "scripts": { + // ..., + "postinstall": "node ./scripts/copy-novorender-workers.js" + } +} +``` + + + + +export const CodeExamplesTip = () => ( +
+
+
💡
+
+

Looking for more examples?

+

Check out these sample projects that utilise some of the common module bundlers.

+
+
+
+ {["vite", "webpack", "webpack_typescript", "local_esm"].map((i) => ( + + + + ))} +
+
+); + + + +--- + +## Basic usage + +```html title="index.html" + + + + + + Novorender demo + + + + + + + +``` + +```typescript title="src/main.ts" +import { API, createAPI, WellKnownSceneUrls } from "@novorender/webgl-api"; + +const api = createAPI({ + // Path to where the files previously copied from node_modules are hosted + scriptBaseUrl: `${window.location.origin}/novorender/webgl-api/`, +}); +const canvas = document.querySelector("#canvas")!; +main(api, canvas); + +async function main(api: API, canvas: HTMLCanvasElement) { + // create a view + const view = await api.createView( + { background: { color: [0, 0, 0, 0] } }, // transparent + canvas + ); + + // provide a camera controller + view.camera.controller = api.createCameraController({ kind: "turntable" }); + + // load the Condos demo scene + view.scene = await api.loadScene(WellKnownSceneUrls.condos); + + // create a bitmap context to display render output + const ctx = canvas.getContext("bitmaprenderer"); + + // main render loop + while (true) { + // handle canvas resizes + const { clientWidth, clientHeight } = canvas; + view.applySettings({ + display: { width: clientWidth, height: clientHeight }, + }); + + // render frame + const output = await view.render(); + { + // finalize output image + const image = await output.getImage(); + if (image) { + // display in canvas + ctx?.transferFromImageBitmap(image); + image.close(); + } + } + } +} +``` + +--- + +## Demo + +Only the function `main()` is included in the live editors. +Try changing the [background color](../webgl-api/interfaces/NovoRender.RenderSettings#background) on line 18 or the [camera controller](../webgl-api/interfaces/NovoRender.API#createcameracontroller) on line 23 in the example below. + + + +export const PlaygroundTip = () => ( +
+
+
💡
+
+

Need more demonstrations?

+

The Playground page contains 20+ demos covering various aspects of different Novorender packages.

+
+
+ + Go to Playground + +
+); + + diff --git a/v2/docs/tutorials/loading_scenes.mdx b/v2/docs/tutorials/loading_scenes.mdx new file mode 100644 index 0000000..22f64be --- /dev/null +++ b/v2/docs/tutorials/loading_scenes.mdx @@ -0,0 +1,50 @@ +--- +title: "Loading scenes" +sidebar_position: 2 +description: "Loading scenes via Data JS API or Data REST API." +keywords: ["novorender api docs", "webgl api", "data js api", "loading scenes"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +To load your own scenes we recommend that you use the [`@novorender/data-js-api`](../data-js-api) package, but you can also use the [Novorender data REST API](/data-rest-api) directly if you prefer. +We will be using the npm package in all our examples. + +## Public scenes + + + +## Private scenes + +Only scene related endpoints are covered by the NPM package, so for user / authentication endpoints you will have to use the REST API as well. + +### Username / Password + + +
+ +:::note + +Above demo retrieves access token using POST [/api/user/login](/data-rest-api/#/operations/Login) endpoint which is part of legacy authentication APIs, also known as the [V1 REST API](/data-rest-api). We advise transitioning to the new [V2 REST API](/data-rest-api?id=v2), which incorporates OAuth 2.0 for authorization. + +::: + +### Active Directory + +To get started authenticating with Active Directory we recommend you use [MSAL](https://learn.microsoft.com/en-us/azure/active-directory/develop/msal-overview) with the following config: + +```json +{ + "clientId": "074eb42a-f94a-4a97-b7ad-0a187eb57f96", + "authority": "https://login.microsoftonline.com/{YOUR_TENANT_ID}", + "scopes": ["api://074eb42a-f94a-4a97-b7ad-0a187eb57f96/resource.read", "api://074eb42a-f94a-4a97-b7ad-0a187eb57f96/scene.edit"] +} +``` + +Once you have authenticated and acquired an access token you can follow the [example for username/password flow](#username--password), just use the access token you got from AD instead of POST [/api/user/login](/data-rest-api/#/operations/Login). + +:::note + +The above documentation regarding Active Directory is only applicable when utilizing the legacy authentication APIs, also known as the [V1 REST API](/data-rest-api). + +::: \ No newline at end of file diff --git a/v2/docs/tutorials/minimap.mdx b/v2/docs/tutorials/minimap.mdx new file mode 100644 index 0000000..8297167 --- /dev/null +++ b/v2/docs/tutorials/minimap.mdx @@ -0,0 +1,773 @@ +--- +title: "Using tiled images as minimap" +description: "Tutorial for using image tiles as minimap" +keywords: ["novorender api docs", "webgl api", "quadtree", "minimap", "image tiles"] +--- + +import { tutorials } from "@site/demo-snippets/index"; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import Link from "@docusaurus/Link"; + +## Introduction + +In this tutorial, we will learn to create a minimap using tiled images. The code is written in TypeScript and will also demonstrate how to achieve zoom on minimap by loading and rendering image tiles at different zoom levels using quadtree data structure, we will also learn to sync the camera movements between minimap and 3D space using [novorender's webgl-api](./getting_started.mdx). + +:::note before we begin +This tutorial assumes that you have a basic understating of [HTML 5 Canvas API](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API), [novorender's webgl-api](./getting_started.mdx) (including [loading scenes](./loading_scenes.mdx) and [searching](./searching)), and finally, a basic knowledge of [Quadtree data structure](https://en.wikipedia.org/wiki/Quadtree).
It is recommend to get a quick grasp of these concepts before moving forward. +::: + +--- + +## Structure +We will use two HTML canvas elements: one for the 3D model, and the other will be used to show the minimap. In the demo code, they're referred to as `canvas` and `previewCanvas`. +:::info +In some places you'll notice that we use the gl-matrix library for linear algebra (vector and matrix math). 3D vectors are defined as vec3 types, which equates to a array of length=3. If all you wish to do is to pass in parameters or read values, you may treat these types a regular array of numbers, i.e. you don't need the gl-matrix library itself for this. If you do wish to perform some linear algebra yourself, however, we recommend you do add it to your own code as well. Just make sure you use same major version as us (^3.3.0). +::: + +--- + +## Loading and displaying the scene +Let's start by loading a public scene using [Data JS API](/docs/data-js-api) + +```typescript +// Initialize the data API with the Novorender data server service +const dataApi = dataJsApi.createAPI({ + // we're loading a public scene so it doesn't require any auth header, + // see `https://docs.novorender.com/docs/tutorials/loading_scenes#private-scenes` if you want to load private scenes. + serviceUrl: DATA_API_SERVICE_URL, + }); + +// load a public scene +const sceneData = await dataApi.loadScene("fa20cb75e20e42b789c8e0f18ef5cc6f"); + +// some necessary render config, that will be applied to the loaded scene +const renderSettings: RecursivePartial = { + quality: { + resolution: { value: 1 }, // Set resolution scale to 1 + }, + clippingVolume: { + enabled: true, + mode: "union", + planes: [[0, 1, 0, -5.5]], + }, +}; +``` + +Next, we'll create a function that will create the [view](/docs/webgl-api/interfaces/NovoRender.View) and a [camera controller](/docs/webgl-api/interfaces/NovoRender.CameraController) for the 3D space: +```typescript +async function initView(webglApi: typeof WebglApi, canvas: HTMLCanvasElement, sceneData: SceneData, renderSettings: RecursivePartial): Promise { + // Destructure relevant properties into variables + const { url, db, settings, camera: cameraParams } = sceneData; + + // initialize the webgl api + const api = webglApi.createAPI(); + + // Load scene + const scene = await api.loadScene(url, db); + + // Create a view with the scene's saved settings + const view = await api.createView(settings, canvas); + + view.applySettings(renderSettings); + + // Create a camera controller with the saved parameters with flight as fallback + let camera: WebglApi.CameraControllerParams = cameraParams ?? { kind: "flight" }; + camera = { ...camera, ...{ yaw: 0, pitch: -90 } }; + view.camera.controller = api.createCameraController(camera as WebglApi.FlightControllerParams, canvas); + + // Assign the scene to the view + view.scene = scene; + + return view; +} +``` +this function will be invoked after loading the scene. + +Finally, run the render loop to display the output: +```typescript +// Create a bitmap context to display render output +const ctx = canvas.getContext("bitmaprenderer"); + +// render loop +while (true) { + // Render frame + currentOutput = await view.render(); + { + // Finalize output image + const image = await currentOutput.getImage(); + if (image) { + // Display the given ImageBitmap in the canvas associated with this rendering context. + ctx?.transferFromImageBitmap(image); + // release bitmap data + image.close(); + } + } + currentOutput.dispose(); +} +``` +That is all the code that's necessary for loading a scene. + +--- + +## Loading and displaying the preview image +PDF documents uploaded to Novorender will have a preview property that can be used to display the PDF as an image. This image can be found by using database search and getting the metadata. + +Below is the code that we will be using the fetch the image: +```typescript +// perform a db search to get the metadata +const iterator = scene?.db?.search( + { + searchPattern: [{ property: "Novorender/Document/Preview", exact: true }], + }, + undefined +); +const iteratorResult = await iterator?.next(); +const data = await iteratorResult?.value.loadMetaData(); +let image = ""; +for (const prop of data.properties) { + if (prop[0] === "Novorender/Document/Preview") { + const url = new URL((scene as any).url); + url.pathname += prop[1]; + // This is the PDF image URL + image = url.toString(); + } +} +``` +Now the image can be drawn on the `previewCanvas`: +```typescript +// get the 2D context +const context = previewCanvas.getContext("2d"); + +const img = new Image(); +img.onload = function () { + context.drawImage(img, 0, 0, img.width, img.height, 0, 0, img.width, img.height); +}; +img.src = image; +``` +Now that we have completed the initial steps, we will now proceed to implementing the core logic of the minimap. + +--- + +## Quadtree +When dealing with large images or PDF previews, loading the entire high-quality image at once and then zooming can be resource-intensive and slow. Quadtree provides an effective solution by breaking down the image into smaller tiles, enabling efficient storage and retrieval. Each tile represents a specific region of the image, allowing us to load only the required portions based on the user's viewport and zoom level. + +![An example image showing the usage of quadtree](../../static/assets/5cff54de-5133-4369-8680-52d2723eb756.jpg) + +Each tile is represented by its Quadkey, Quadkeys have some important characteristics. Firstly, the length of a quadkey is the same as the level of detail for the tile it represents. Secondly, the quadkey of a tile always begins with the quadkey of its parent tile (the tile that contains it at the previous level). For instance, in the example given, tile 2 is the parent of tiles 20 through 23, and tile 13 is the parent of tiles 130 through 133. + +The image for each tile can be fetched by its quadkey. For instance, if we wanted to load the image for the first tile in level 2, we would simply have to append its quadkey to the original image's URL like this: `"sample_image_" + 00 + ".jpg"` + +### Creating Quadtree +Let's start by creating a class named `QuadNode`. This class will define some methods for creating (see the `split()` method) and searching (`retrieve()`) the quads within the quadtree. +Below is the implementation that we'll use in the demo: +```typescript +class QuadNode { + /** + * The numeric boundaries of this node. + * @readonly + */ + bounds: NodeGeometry; + + /** + * The level of this node. + * @defaultValue `0` + * @readonly + */ + level: number; + + Id: string; + + empty = false; + + nodes: QuadNode[]; + + constructor(bounds: { x: number; y: number; width: number; height: number; Id: string }, level: number) { + this.bounds = { + x: bounds.x || 0, + y: bounds.y || 0, + width: bounds.width, + height: bounds.height, + }; + this.level = level || 0; + this.nodes = []; + this.Id = bounds.Id; + } + + /** + * Split the node into 4 subnodes. + */ + split(splitWidth: number, splitHeight: number): void { + const level = this.level + 1; + const { bounds } = this; + + const width = splitWidth / 2, + height = splitHeight / 2, + x = bounds.x, + y = bounds.y; + + // max 5 levels + if (level > 6) { + return; + } + + const coords = [ + { x: x, y: y }, + { x: x + width, y: y }, + { x: x, y: y + height }, + { x: x + width, y: y + height }, + ]; + let _id; + { + for (let i = 0; i < coords.length; i++) { + if (level === 0) { + _id = "root"; + } + if (level === 1) { + _id = i.toString(); + } else { + _id = this.Id + i.toString(); + } + const childWidth = Math.min(width, bounds.width - (coords[i].x - bounds.x)); + const childHeight = Math.min(height, bounds.height - (coords[i].y - bounds.y)); + this.nodes[i] = new QuadNode( + { + x: coords[i].x, + y: coords[i].y, + height: childHeight, + width: childWidth, + Id: _id, + }, + level + ); + + if (childWidth <= 0 || childHeight <= 0) { + this.nodes[i].empty = true; + } else { + this.nodes[i].split(width, height); + } + } + } + } + + overlaps(obj: NodeGeometry): boolean { + const { bounds } = this; + const maxBoundX = bounds.x + bounds.width; + const maxBoundY = bounds.y + bounds.height; + const maxObjX = obj.x + obj.width; + const maxObjY = obj.y + obj.height; + const insideX = (obj.x >= bounds.x && obj.x <= maxBoundX) || (maxObjX >= maxBoundX && obj.x <= maxBoundX) || (maxObjX >= bounds.x && maxObjX < maxBoundX); + const insideY = (obj.y >= bounds.y && obj.y <= maxBoundY) || (maxObjY >= maxBoundY && obj.y <= maxBoundY) || (maxObjY >= bounds.y && maxObjY < maxBoundY); + if (insideX && insideY) { + return true; + } + return false; + } + + /** + * Return all objects that could collide with the given geometry. + * @param obj - geometry to be checked + * @param testLevel - level to be checked + * @returns Array containing all detected objects. + */ + retrieve(obj: NodeGeometry, testLevel: number): QuadNode[] { + + let returnObjects: QuadNode[] = []; + // if we have subnodes, retrieve their objects + if (this.nodes.length && this.level < testLevel) { + for (let i = 0; i < this.nodes.length; i++) { + const node = this.nodes[i]; + if (!node.empty && node.overlaps(obj)) { + returnObjects = returnObjects.concat( + node.retrieve(obj, testLevel) + ); + } + } + } else { + returnObjects.push(this); + } + return returnObjects; + } +} +``` + +### Usage example +The `QuadNode` class can be used to create a quadtree using the following example: +```typescript +const width = 800; // width of the root Quad. +const height = 600; // height of the root Quad. +const level = 1; // root level +const quadTree = new QuadNode({ x: 0, y: 0, width, height, Id: "" }, level); + +// Split the nodes into 4 subnodes/quads until reaching max levels of 5. +quadTree.split(splitWidth, splitHeight); +``` + +### Zooming in/out on canvas using quadtree +Now that we know how to create a quadtree, we can now move forward to implement the tile based zoom on our `previewCanvas`, let's start by adding an `onWheel` event listener on our minimap (aka `previewCanvas`). +Below code shows how to use `onwheel` event listener to zoom in/out on canvas using mouse wheel or touchpad: + +```typescript +previewCanvas.onwheel = async (e) => { + e.preventDefault(); + + wheelDelta += e.deltaY * -0.01; + wheelDelta = Math.min(Math.max(1, wheelDelta), 5); + currentLevel = Math.ceil(wheelDelta); + + if (currentLevel === 1) { + // reset the zoom + level = currentLevel; + try { + const initialImage = await loadImage(preview as string); + if (previewCanvasContext2D) { + previewCanvasContext2D.clearRect(0, 0, previewCanvas.width, previewCanvas.height); + previewCanvasContext2D.drawImage(initialImage, 0, 0, previewCanvas.width, previewCanvas.height); + } + } catch (error) { + console.error("Failed to load the preview image ", error); + } + currentArea = undefined; + elements = undefined; + zoomedImage = undefined; + return; + } + if (level === currentLevel) { + return; + } + if (level === 2) { + level++; + } + + level = currentLevel; + + // Get the position of the click relative to the canvas + const rect = previewCanvas.getBoundingClientRect(); + let centerX = e.clientX - rect.left; + let centerY = e.clientY - rect.top; + const width = previewCanvas.width / currentLevel; + const height = previewCanvas.height / currentLevel; + + if (currentArea) { + const previousAreaMinX = currentArea.x; + const previousAreaMinY = currentArea.y; + centerX = previousAreaMinX + centerX / currentLevel; + centerY = previousAreaMinY + centerY / currentLevel; + } + + const right = previewCanvas.width - (centerX + width / 2); + const bot = previewCanvas.height - (centerY + height / 2); + + let x = centerX - width / 2; + if (right < 0) { + x += right; + } + + let y = centerY - height / 2; + if (bot < 0) { + y += bot; + } + + const area: NodeGeometry = { + x: Math.max(0, x), + y: Math.max(0, y), + width: width, + height: height, + }; + + currentArea = area; + elements = quadTree.retrieve(currentArea, currentLevel); + + // draw and stitch the found images on canvas + await drawAndStitchOnCanvas(elements, currentArea); +}; +``` +#### Breakdown of above code +We start by defining a rectangle to retrieve the quads that intersect with it: +```typescript +const area: NodeGeometry = { + x: Math.max(0, x), + y: Math.max(0, y), + width: width, + height: height, +}; +``` +Then we call `retrieve()` method of `MinimapHelper` to search for all the quads that intersect with the rectangle created above: +```typescript +elements = quadTree.retrieve(previousArea, currentLevel); +``` +And finally call `drawAndStitchOnCanvas()` on found elements to load the image tiles and stitch them together on the minimap (`previewCanvas`): + ```typescript +const drawAndStitchOnCanvas = async (elements: QuadNode[], area: NodeGeometry) => { + // clear the canvas + previewCanvasContext2D?.clearRect(0, 0, previewCanvas.width, previewCanvas.height); + // Loop through the found nodes and draw images based on node on the canvas + for (let i = 0; i < elements.length; i++) { + const node = elements[i]; + const nodeBoundsWidth = node.bounds.width; + const nodeBoundsHeight = node.bounds.height; + try { + const loadedImage = await loadImage(preview as string, node.Id); + + const boundsWRatio = loadedImage.naturalWidth / nodeBoundsWidth; + const boundsHRatio = loadedImage.naturalHeight / nodeBoundsHeight; + + const cutLeft = Math.max(0, area.x - node.bounds.x); + const cutRight = Math.max(0, node.bounds.x + node.bounds.width - (area.x + area.width)); + const cutX = cutLeft + cutRight; + + const cutTop = Math.max(0, area.y - node.bounds.y); + const cutBot = Math.max(0, node.bounds.y + node.bounds.height - (area.y + area.height)); + const cutY = cutTop + cutBot; + + const zoom = currentLevel; + + const x = (Math.max(node.bounds.x, area.x) - area.x) * zoom; + const y = (Math.max(node.bounds.y, area.y) - area.y) * zoom; + + const sx = cutLeft * boundsWRatio; + const sy = cutTop * boundsHRatio; + + const sWidth = loadedImage.naturalWidth - sx - cutRight * boundsWRatio; + const sHeight = loadedImage.naturalHeight - sy - cutBot * boundsHRatio; + + const dWidth = (node.bounds.width - cutX) * zoom; + const dHeight = (node.bounds.height - cutY) * zoom; + + previewCanvasContext2D?.drawImage(loadedImage, sx, sy, sWidth, sHeight, x, y, dWidth + 1, dHeight + 1); // +1 for pixel overlap to avoid grid like lines + } catch (err) { + console.error("Something went wrong", err); + } + } +}; + ``` + + --- + +## Minimap +In this section, we will learn how to download and create the minimap. + +### Creating minimap +Let's initialize a class called `MinimapHelper`. This class contains useful methods for interacting between the PDF preview (`toMinimap()`) and the 3D Space (`toWorld()`), you'll see their actual usage in the demo provided at the end of this tutorial. + +```typescript +/** + * Class representing a MinimapHelper that also contains an instance of `QuadNode` class. + */ +export class MinimapHelper { + /** + * Subnodes of this node + * @defaultValue `[]` + * @readonly + */ + quadTree: QuadNode; + + pixelWidth = 0; + pixelHeight = 0; + currentIndex = 0; + + glMatrix!: typeof GlMatrix; + + /** + * Minimap Constructor + * @param minimaps - minimap info + * @param glMatrix - glMatrix dependency + * @param quadTreeProps - bounds and properties of the node + * @param level - depth level (internal use only, required for subnodes) + */ + constructor(width: number, height: number, readonly minimaps: MinimapInfo[], glMatrix: typeof GlMatrix) { + this.pixelWidth = width; + this.pixelHeight = height; + this.glMatrix = glMatrix; + this.quadTree = new QuadNode({ x: 0, y: 0, width, height, Id: "" }, 1); + } + + async split(topLevelWidth: number, topLevelHeight: number) { + const numImagesWidth = topLevelWidth / 256; + const cw = Math.ceil(Math.log(numImagesWidth) / Math.log(2)); + const widthSplitBy = Math.pow(2, cw) / 2; + const widthSplit = widthSplitBy / numImagesWidth; + + const numImagesHeight = topLevelHeight / 256; + const ch = Math.ceil(Math.log(numImagesHeight) / Math.log(2)); + const heightSplitBy = Math.pow(2, ch) / 2; + const heightSplit = heightSplitBy / numImagesHeight; + + this.quadTree.split(this.pixelWidth * widthSplit * 2, this.pixelHeight * heightSplit * 2); + } + + retrieve(obj: NodeGeometry, testLevel: number): QuadNode[] { + return this.quadTree.retrieve(obj, testLevel); + } + + toMinimap(worldPos: vec3): vec2 { + const curInfo = this.getCurrentInfo(); + const diff = this.glMatrix.vec3.sub(this.glMatrix.vec3.create(), worldPos, curInfo.corner); + const diffX = this.glMatrix.vec3.dot(diff, curInfo.dirX); + const diffY = this.glMatrix.vec3.dot(diff, curInfo.dirY); + + const x = (diffX / curInfo.dx) * this.pixelWidth; + const y = this.pixelHeight - (diffY / curInfo.dy) * this.pixelHeight; + return this.glMatrix.vec2.fromValues(x, y); + } + + toWorld(minimapPos: vec2): vec3 { + const curInfo = this.getCurrentInfo(); + const diffX = minimapPos[0] / this.pixelWidth; + const diffY = 1 - minimapPos[1] / this.pixelHeight; + const pos = this.glMatrix.vec3.clone(curInfo.corner); + pos[1] += 10; + this.glMatrix.vec3.scaleAndAdd(pos, pos, curInfo.dirX, curInfo.dx * diffX); + this.glMatrix.vec3.scaleAndAdd(pos, pos, curInfo.dirY, curInfo.dy * diffY); + return pos; + } + + directionPoints(worldPos: vec3, rot: quat, length: number): vec2[] { + const path: vec2[] = []; + path.push(this.toMinimap(worldPos)); + const rotA = this.glMatrix.quat.rotateY(this.glMatrix.quat.create(), rot, Math.PI / 8); + const dirZ = this.glMatrix.vec3.fromValues(0, 0, -1); + const dirA = this.glMatrix.vec3.transformQuat(this.glMatrix.vec3.create(), dirZ, rotA); + const posA = this.glMatrix.vec3.scaleAndAdd(this.glMatrix.vec3.create(), worldPos, dirA, length); + path.push(this.toMinimap(posA)); + + const rotB = this.glMatrix.quat.rotateY(this.glMatrix.quat.create(), rot, -Math.PI / 8); + const dirB = this.glMatrix.vec3.transformQuat(this.glMatrix.vec3.create(), dirZ, rotB); + const posB = this.glMatrix.vec3.scaleAndAdd(this.glMatrix.vec3.create(), worldPos, dirB, length); + path.push(this.toMinimap(posB)); + + return path; + } + + getCurrentInfo() { + return this.minimaps[this.currentIndex]; + } + + getMinimapImage() { + return this.getCurrentInfo().image; + } + + getAspect() { + return this.getCurrentInfo().aspect; + } + + update(camPos: vec3): boolean { + for (let i = 1; i < this.minimaps.length; ++i) { + if (camPos[1] - 0.5 < this.minimaps[i].elevation) { + if (i !== this.currentIndex) { + this.currentIndex = i - 1; + return true; + } + return false; + } + } + if (this.currentIndex !== this.minimaps.length - 1) { + this.currentIndex = this.minimaps.length - 1; + return true; + } + return false; + } +} +``` +The `MinimapHelper` class also creates a new instance of the `QuadNode` in the constructor. Therefore, when we create a new instance of `MinimapHelper`, it will contain our quadtree, which can be accessed using the `quadTree` property. +### Downloading the minimap +After initializing the class mentioned above, we will proceed to create a function responsible for downloading the minimap. It should be noted that this function includes a DB search to obtain information about the "Corners" and "Size" of Quadtree, which is necessary for the `MinimapHelper` class we created earlier. "Corners" info is utilized for the transformation between image space and 3D space and the "Size" property is used to correctly split the Quadtree. + +```typescript +async function downloadMinimap(width: number, height: number, scene: SceneData, glMatrix: typeof GlMatrix): Promise { + const minimaps: MinimapInfo[] = []; + + // perform a db search to get the metadata + const iterator = scene?.db?.search( + { + searchPattern: [{ property: "Novorender/Document/Preview", exact: true }], + }, + undefined + ); + const iteratorResult = await iterator?.next(); + const data = await iteratorResult?.value.loadMetaData(); + + let corner = glMatrix.vec3.create(); + const dirX = glMatrix.vec3.create(); + const dirY = glMatrix.vec3.create(); + let dx = 0; + let dy = 0; + let aspect = 0; + let elevation = 0; + let image = ""; + let topLevelWidth = 0; + let topLevelHeight = 0; + + for (const prop of data.properties) { + switch (prop[0]) { + // get the corners + case "Novorender/Document/Corners": { + const points = prop[1].split("]"); + const c1 = points[0].replaceAll("[", "").split(","); + const c2 = points[1].replaceAll("[", "").split(","); + const c3 = points[2].replaceAll("[", "").split(","); + const a = glMatrix.vec3.fromValues(Number(c1[0]), Number(c1[1]), Number(c1[2])); + const b = glMatrix.vec3.fromValues(Number(c2[1]), Number(c2[2]), Number(c2[3])); + const c = glMatrix.vec3.fromValues(Number(c3[1]), Number(c3[2]), Number(c3[3])); + glMatrix.vec3.sub(dirX, b, a); + dx = glMatrix.vec3.len(dirX); + glMatrix.vec3.normalize(dirX, dirX); + glMatrix.vec3.sub(dirY, c, b); + dy = glMatrix.vec3.len(dirY); + glMatrix.vec3.normalize(dirY, dirY); + corner = glMatrix.vec3.clone(a); + elevation = a[1]; + aspect = dx / dy; + break; + } + + // get the image preview + case "Novorender/Document/Preview": { + const url = new URL((scene as SceneData).url); + url.pathname += prop[1]; + // This is the PDF image URL + image = url.toString(); + break; + } + + // get the top-level dimensions of quadtree + case "Novorender/Document/Size": { + const sizes = prop[1].split(","); + topLevelWidth = Number(sizes[0]); + topLevelHeight = Number(sizes[1]); + break; + } + } + } + + minimaps.push({ + aspect, + image, + dx, + dy, + corner, + dirX, + dirY, + elevation, + }); + + minimaps.sort((a, b) => a.elevation - b.elevation); + + const minimap = new MinimapHelper(width, height, minimaps, glMatrix); + + // split the quadtree + await minimap.split(); + + return minimap; +} +``` +:::note +In addition to obtaining the corner information, the function above also downloads the image URL for the `previewCanvas`, eliminating the need for separate downloading as [mentioned earlier](/docs/tutorials/minimap#loading-and-displaying-the-preview-image). +::: + +### Usage example +Invoking the above method, `downloadMinimap()`, will provide us with a new instance of the `MinimapHelper` class. This instance will contain our quadtree, as well as other useful methods for interacting with both the minimap and the 3D space. The example below demonstrates the usage of the `downloadMinimap` function: + +```typescript +let preview: string | undefined; +let minimap: MinimapHelper; + +if (sceneData) { + minimap = await downloadMinimap(previewCanvas.width, previewCanvas.height, sceneData, glMatrix); + + // get the image URL for `previewCanvas` + preview = minimap.getMinimapImage(); +} +``` + + +### Updating the camera movements between minimap and 3D space +In this section we'll implement a mechanism to update the camera position on 3D space using minimap's `x` and `y` coordinates. +Let's start by adding a `click` listener on the minimap (`previewCanvas`) that will move the camera on the 3D space to the same position as the minimap: + +```typescript +previewCanvas.onclick = (e: MouseEvent) => { + // Get the position of the click relative to the canvas + const rect = previewCanvas.getBoundingClientRect(); + let x = e.clientX - rect.left; + let y = e.clientY - rect.top; + + // `currenArea` will have a value if the previewCanvas is zoomed in + if (currentArea) { + const canvasScaleX = currentArea.width / previewCanvas.width; + const canvasScaleY = currentArea.height / previewCanvas.height; + x = currentArea.x + (x * canvasScaleX) / currentLevel; + y = currentArea.y + (y * canvasScaleY) / currentLevel; + } + + // this will move the camera on 3D space to same position as minimap + view.camera.controller.moveTo(minimap.toWorld(glMatrix.vec2.fromValues(x, y)), view.camera.rotation); + }; +``` +The next step is to draw two direction vectors on the minimap. These vectors will point to the click positions (`x` and `y`) obtained from the click listener mentioned above. +The function below handles drawing and animating the direction vectors. We need to run this function on every frame change to detect the camera change, which is why you'll notice it being called within the render loop in demo. +```typescript +function animate() { + const ctx = previewCanvas.getContext("2d")!; + // Run every frame to check if the camera has changed + if (!prevCamRot || !glMatrix.quat.equals(prevCamRot, view.camera.rotation) || !prevCamPos || !glMatrix.vec3.equals(prevCamPos, view.camera.position)) { + prevCamRot = glMatrix.quat.clone(view.camera.rotation); + prevCamPos = glMatrix.vec3.clone(view.camera.position); + if (minimap) { + // Update minimap info based on camera position. Returns true if it changed the pdf to another floor + minimap.update(view.camera.position as vec3); + let imgUrl: string; + if (elements?.length && currentLevel !== 1 && zoomedImage) { + imgUrl = zoomedImage; + } else { + imgUrl = minimap.getMinimapImage(); + } + loadImage(imgUrl).then((img) => { + // Redraw the image for te minimap + ctx.clearRect(0, 0, previewCanvas.width, previewCanvas.height); + ctx.drawImage(img, 0, 0, previewCanvas.width, previewCanvas.height); + // draw and animate directions vectors + drawVectors(ctx); + }); + } + } +} + +// handles the drawing and animating of direction vectors +const drawVectors = (ctx: CanvasRenderingContext2D) => { + //Gets the camera position in minimap space + const minimapPos = minimap.toMinimap(view.camera.position as vec3); + + //Gets a cone of the camera direction in minimap space, point[0] is the camera position + const dirPath = minimap.directionPoints(view.camera.position as vec3, view.camera.rotation as quat, 5 / currentLevel); + if (currentArea) { + minimapPos[0] = (minimapPos[0] - currentArea.x) * currentLevel; + minimapPos[1] = (minimapPos[1] - currentArea.y) * currentLevel; + for (let i = 0; i < 3; ++i) { + dirPath[i][0] = (dirPath[i][0] - currentArea.x) * currentLevel; + dirPath[i][1] = (dirPath[i][1] - currentArea.y) * currentLevel; + } + } + ctx.strokeStyle = "green"; + for (let i = 1; i < dirPath.length; ++i) { + ctx.beginPath(); + ctx.lineWidth = 3; + ctx.moveTo(dirPath[0][0], dirPath[0][1]); + ctx.lineTo(dirPath[i][0], dirPath[i][1]); + ctx.stroke(); + } + ctx.fillStyle = "green"; + ctx.beginPath(); + ctx.ellipse(minimapPos[0], minimapPos[1], 5, 5, 0, 0, Math.PI * 2); + ctx.fill(); +}; +``` +Clicking on the mininmap now should draw 2 direction vectors pointing towards the click position. + +--- + +## Putting all the pieces together +The following demo combines all the code we previously discussed to create a quadtree, minimap, and synchronize camera movements between both views. + +Please feel free to make any desired changes in the playground editorto suit your preferences or to meet your specific requirements. + diff --git a/v2/docs/tutorials/object_groups.mdx b/v2/docs/tutorials/object_groups.mdx new file mode 100644 index 0000000..96865ab --- /dev/null +++ b/v2/docs/tutorials/object_groups.mdx @@ -0,0 +1,120 @@ +--- +title: "Object groups" +sidebar_position: 5 +description: "Object grouping." +keywords: ["novorender api docs", "webgl api", "data js api", "object groups"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +Although the [ObjectGroup interface](/docs/data-js-api/interfaces/DataJsAPI.ObjectGroup) itself is not particularly noteworthy, +the [SceneData.objectGroups](/docs/data-js-api/interfaces/DataJsAPI.SceneData#objectgroups) property can be extremely useful. +Object IDs in Novorender are not fixed and may change whenever the scene's resources are modified. +Therefore if you store the IDs from a search (e.g. all objects on the first floor) and then later modify the scene's resources, +the scene's objects' IDs may have changed and your stored list of IDs will be stale. + +The search patterns assigned to each object group is run every time a scene's resources are modified so that the list of IDs always will be correct. +That way you can easily create cached searches by using object groups. + +In the case where the [objectGroups.ids](/docs/data-js-api/interfaces/DataJsAPI.Bookmark.ObjectGroup#ids) list is quite large, the .ids property is `undefined` and should be explicity loaded as shown in the [Floors example](#floors-example). + +## Create group + +```typescript +// Search utility fn to return array of object IDs +async function search(scene: Scene, searchPattern: SearchPattern[]): Promise { + const iterator = scene.search({ searchPattern }); + + const result: number[] = []; + for await (const object of iterator) { + result.push(object.id); + } + + return result; +} + +// Search pattern to assign to group +const searchPattern: SearchPattern[] = [ + { + property: "path", + value: "Farger.IFC/3/Surface:2481563/Apartment with 12 condos/2ND FLOOR", + exact: true, + }, +]; + +const secondFloor: ObjectGroup = { + // This search is run on the server every time the scene is rebuilt + // and the resulting object IDs are saved to the group.ids property + search: searchPattern, + // The search is not run when the groups are saved + // so you have to run it client side and set the .ids property yourself when you create the group + ids: await search(scene, searchPattern), + // Search deep + includeDescendants: true, + // The remaining properties are not used for anything on the server + // Group id - UUIDv4 in this case, but it's up to you + id: "56196cbf-f5aa-4f65-9934-911546f89225", + name: "2nd floor", // Display name + grouping: "", // We use this as a path style string to nest groups in the UI + color: [1, 0, 0, 1], // Can be used to highlight objects in group + selected: false, + hidden: false, +}; + +// Before saving it is a good idea to load the latest scene data +// in case it has been modified by someone else as there is currently no way of just adding groups +const sceneData = await dataApi.loadScene(SCENE_ID); + +dataApi.putScene({ + // Keep most of the data + ...sceneData, + // scene.id is the id of the main/admin scene while SCENE_ID is the viewer scene id + url: `${SCENE_ID}:${scene.id}`, + // Overwrite .objectGroups + objectGroups: [secondFloor], +}); + +// Now that the group is saved the .ids property will be kept up to date by the server +``` + +## Modify groups + +```typescript title="Edit a group" +// Load scene data +const sceneData = await dataApi.loadScene(SCENE_ID); +// ID of group to edit +const toEdit = "56196cbf-f5aa-4f65-9934-911546f89225"; +// Create new array with the changes applied. +// In this case name is set to "Updated name" +const updatedGroups = sceneData.objectGroups.map((group) => (group.id === toEdit ? { ...group, name: "Updated name" } : group)); + +// Save scene +dataApi.putScene({ + ...sceneData, + url: `${SCENE_ID}:${scene.id}`, + objectGroups: updatedGroups, +}); +``` + +```typescript title="Delete a group" +// Load scene data +const sceneData = await dataApi.loadScene(SCENE_ID); +// ID of group to delete +const toDelete = "56196cbf-f5aa-4f65-9934-911546f89225"; +// Create new array without the group to delete +const updatedGroups = sceneData.objectGroups.filter((group) => group.id !== toDelete); + +// Save scene +dataApi.putScene({ + ...sceneData, + url: `${SCENE_ID}:${scene.id}`, + objectGroups: updatedGroups, +}); +``` + +## Floors example + +In this example we have predefined groups which are set up for each floor and created buttons to isolate [objectGroups](/docs/data-js-api/interfaces/DataJsAPI.Bookmark-1#objectgroups) +in clicked floor's group. + + diff --git a/v2/docs/tutorials/object_metadata.mdx b/v2/docs/tutorials/object_metadata.mdx new file mode 100644 index 0000000..423260b --- /dev/null +++ b/v2/docs/tutorials/object_metadata.mdx @@ -0,0 +1,36 @@ +--- +title: "Object metadata" +sidebar_position: 6 +description: "Object metadata." +tags: + - Properties + - Zoom to + - Move to + - Fly to +keywords: ["novorender api docs", "webgl api", "object metadata"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +Object metadata is not loaded automatically with the scene and may require additional server requests depending on what data you need. +Generally you will work with either [HierarchicalObjectReference](/docs/webgl-api/interfaces/NovoRender.HierarcicalObjectReference) or the full [ObjectData](/docs/webgl-api/interfaces/NovoRender.ObjectData) metadata set. + +## From pick + +If you are not already familiar with picking, see [Object selection](./object_selection) first. + + + +## From search + +If you are not already familiar with searching, see [Searching](./searching) first. + + + +## Fly to objects + +The previous examples show how to load object data and dump it in a box. +In this example we will show how to fly to objects using [CameraController.zoomTo()](/docs/webgl-api/interfaces/NovoRender.CameraController#zoomto). +When the example is run it will first do a quick search for 4 objects and fly to them. After that it will fly to any object you click. + + diff --git a/v2/docs/tutorials/object_selection.mdx b/v2/docs/tutorials/object_selection.mdx new file mode 100644 index 0000000..ba3cb0f --- /dev/null +++ b/v2/docs/tutorials/object_selection.mdx @@ -0,0 +1,72 @@ +--- +title: "Object Selection" +sidebar_position: 3 +description: "Highlighting sets of objects using WebGL API." +keywords: ["novorender api docs", "webgl api", "object selection"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +NovoRender lets you highlight sets of objects. +This could be used to visualize current object selection, or groups of objects, for instance the results of data queries. + +### Object Identity + +All the objects in a scene are enumerated and assigned a unique integer id/index, expressed as [ObjectId](/docs/webgl-api/interfaces/NovoRender.PickInfo#objectid). + +One way of obtaining such an id is using the [pick()](/docs/webgl-api/interfaces/NovoRender.View#pick) function, which lets you pick the frontmost object, if any, at the given x,y canvas coordinate. + +```typescript +const result = await renderOutput.pick(x, y); +if (result) { + const { objectId } = result; +} +``` + +### Object highlighting + +To highlight the picked object, we must create a highlight object. +Highlighting works by performing a linear transform of the red, green, blue and alpha (opacity) channels. +For now, we'll simply make the selected object lime green. + +```typescript +const red = 0.0; +const green = 1.0; +const blue = 0.0; +const highlightGroup1 = api.createHighlight({ + kind: "color", + color: [red, green, blue], +}); +``` + +Highlights are applied to groups of objects. +By default, all objects are assigned to group #0. +To make our picked object stand out, we assign it to group #1. + +```typescript +scene.objectHighlighter.objectHighlightIndices[objectId] = 1; +scene.objectHighlighter.commit(); // call this to commit all changes +``` + +To make our selected objects stand out even further, we make all other objects less colorful by halving their color saturation. + +```typescript +const highlightGroup0 = api.createHighlight({ kind: "hsla", saturation: 0.5 }); +``` + +We then assign these highlights to our two groups, default and selected respectively: + +```typescript +view.settings.objectHighlights = [highlightGroup0, highlightGroup1]; +``` + +### Demo + +Click on objects to turn them green. + + +
+ +:::note +Currently, there are a maximum of 256 highlight groups, the last one (#255) being reserved for objects that should not be rendered. +::: diff --git a/v2/docs/tutorials/parametric_measure.mdx b/v2/docs/tutorials/parametric_measure.mdx new file mode 100644 index 0000000..c1e7358 --- /dev/null +++ b/v2/docs/tutorials/parametric_measure.mdx @@ -0,0 +1,71 @@ +--- +title: "Parametric measure" +description: "Fetch parametric data based on real world position, and calculate measurements between 2 objects using Measure API." +keywords: ["novorender api docs", "webgl api", "measure api", "parametric measure"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +NovoRender measure API can be used to fetch parametric data based on real world position, and calculate measurements between 2 objects + +### Measure entity + +A measure entity refers to a part of a parametric object, for example the inner or outer cylinder of a pipe. +A measure entity can also be a single point, this is usually used if no parametric object exists at a clicked location. + +The normal way of getting measure entities is to used the [pickMeasureEntity()](/docs/measure-api/interfaces/Measure.MeasureScene#pickmeasureentity) function on the measure [scene](/docs/measure-api/interfaces/Measure.MeasureScene#pickmeasureentity) object. This will use world coordinates and [objectId](/docs/webgl-api/interfaces/NovoRender.PickInfo#objectid) to find the closest edge surface or point. It will return the picked point if no parametric data is found near the input point. [objectId](/docs/webgl-api/interfaces/NovoRender.PickInfo#objectid) and [position](/docs/webgl-api/interfaces/NovoRender.PickInfo#position) can be used from the novorender webgl-api [pick](/docs/webgl-api/interfaces/NovoRender.View#pick) function on render [renderOutput](/docs/webgl-api/interfaces/NovoRender.RenderOutput) + +```typescript +const output = await view.render(); +const result = output.pick(x, y); +if (result) { + const entity = await measureScene.pickMeasureEntity(result.objectId, result.position); +} +``` + +### Parametric values on entity + +To get the parametric values such as the the radius, and centerline of a cylinder the [measure()](/docs/measure-api/interfaces/Measure.MeasureScene#measure) +function can be used. This function be be used to get values from a single object by leaving the second argument as undefined. + +```typescript +const measureValues = measurescene.measure(entity); +if (measureValues.kind === "cylinder") { + console.log(`Radius of cylinder is: ${measureValues.radius}`); +} +``` + +### Measure against another entity + +A measure between two entities is done by using the [measure()](/docs/measure-api/interfaces/Measure.MeasureScene#measure) function on scene with 2 arguments. +What property the resulting object has will depend on the input arguments. There is also an option parameter +to support additional options such as where a cylinder should measure from + +```typescript +const output = await view.render(); +const result1 = output.pick(x1, y1); + +const result2 = output.pick(x2, y2); +if (result1 && result2) { + const entity1 = await measureScene.pickMeasureEntity(result1.objectId, result1.position); + + const entity2 = await measureScene.pickMeasureEntity(result2.objectId, result2.position); + + const measureValues = (await measurescene.measure(entity1, entity2)) as DuoMeasurementValues | undefined; + if (measureValues && measureValues.distance) { + console.log(`Distance between objects is: ${measureValues.distance}`); + } +} +``` + +### Demo + +Click to select parametric object, parametric data will be shown in an alert dialog. Select another object and the measurement data between the objects will be shown in the alert dialog. +Clicking further objects will alternate between first and second selected and show measure values within an alert dialog. + + +
+ +:::note +Currently, there are a maximum of 256 highlight groups, the last one (#255) being reserved for objects that should not be rendered. +::: diff --git a/v2/docs/tutorials/placing_pdf.mdx b/v2/docs/tutorials/placing_pdf.mdx new file mode 100644 index 0000000..cc108c0 --- /dev/null +++ b/v2/docs/tutorials/placing_pdf.mdx @@ -0,0 +1,163 @@ +--- +title: "Utility to place PDF correctly on a 3D asset" +description: "Use two reference points on both the model and the PDF to place and scale the PDF in 3D space" +keywords: ["novorender api docs", "webgl api", "measure api", "data js api", "placing pdf"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +Normally PDF drawing are not scaled to the 3D geometry, correctly placing and scaling the PDF to fit the 3D geometry +by manipulaing scale, rotation and translations can be difficult. This tutorial will show how we can use the Novorender framework +to help place the PDF correctly. The tutorial is using a floorplan for a building as an example. + +:::note +This tutorial is using database search multiple times, For more information on how to search and loading SceneData, see [Searching](./searching) first. +::: + +### Fetch and draw PDF preview + +PDF documents uploaded to Novorender will have a preview property that can be used to display the PDF as an image. +This image can be found by using database search and getting the metadata. + +```typescript +const pdfScene = (await dataApi.loadScene("bad260f94a5340b9b767ea2756392be4")) as SceneData; +if (pdfScene.db) { + //Search for preview Property + const iterator = pdfScene.db.search( + { + searchPattern: [{ property: "Novorender/Document/Preview", exact: true }], + }, + undefined + ); + const iteratorResult = await iterator.next(); + const data = await iteratorResult.value.loadMetaData(); + for (const prop of data.properties) { + if (prop[0] === "Novorender/Document/Preview") { + const url = new URL((scene as any).url); + url.pathname += prop[1]; + // This is the PDF image URL + return url.toString(); + } + } +} +return undefined; + +for (let i = 0; i < 5; i++) { + const iteratorResult = await iterator.next(); + + if (iteratorResult.done) { + break; + } + + // Because we have set the search option "full: true" + // .loadMetadata() will not result in any more requests being made + // Try flipping it to false and see the difference in the network request log + const objectWithMetadata = await iteratorResult.value.loadMetaData(); + searchResult.push(objectWithMetadata); +} +``` + +The image can be drawn on a 2d canvas + +```typescript +const img = new Image(); +img.onload = function () { + if (context) { + context.drawImage(img, 0, 0, img.width, img.height, 0, 0, img.width, img.height); + } +}; +img.src = previewImage; +``` + +:::note +This tutorial is written without scaling or moving the image, if scaling and translations are used then these needs to be reveresed in +calculation section below +::: + +### Fetch elevation from storey info + +Storey elevations are normally stored in IFC files so this can be used to find the PDF elevation, +if not then manual input or other metadata is needed, the SceneData for this will need to be from the 3D model asset. + +```typescript +const iterator = scene.search( + { + searchPattern: [ + { property: "IfcClass", value: "IfcBuildingStorey", exact: true }, + ], + }, + undefined +); +... + if (prop[0] === "Novorender/Elevation") { + return Number(prop[1]); + } +... +``` + +### Calculate rotation, scale and position + +:::note +The PDF is scaled to fit one meter on the Y axis +::: + +For these calculations we rely on two selected points from the PDF in pixels, that match two points on the 3D model. +To get the points from the PDF simply use the x and y position on the canvas, for points in the 3D model a top down +orthographic camera can be used with the pick() functionality on the webgl view. Elevation can be used to set a clipping plane, +for information on how to clip the model see [Clipping Volumes](./clipping_volumes), and for more information on +picking and drawing on top of a novorender model see [Draw measure object](./drawing2D). + +:::note +To move the model coordinates to 2D Y must be discarded, Z will be flipped and used instead, +Elevation will be used to put it into 3D pace again +::: + +```typescript +const modelPosA = vec2.fromValues(pickPositionA[0], pickPositionA[2] * -1); +const modelPosB = vec2.fromValues(pickPositionB[0], pickPositionB[2] * -1); +//Invert Y axis on the pixel positions on the pdf image +const pixelPosA = vec2.fromValues(pdfPosA[0], imgHeight.current - pdfPosA[1]); +const pixelPosB = vec2.fromValues(pdfPosB[0], imgHeight.current - pdfPosB[1]); +const pixelLength = vec2.dist(pixelPosA, pixelPosB); +const modelLength = vec2.dist(modelPosA, modelPosB); +const modelDir = vec2.sub(vec2.create(), modelPosB, modelPosA); +vec2.normalize(modelDir, modelDir); +const pixDir = vec2.sub(vec2.create(), pixelPosB, pixelPosA); +vec2.normalize(pixDir, pixDir); +const scale = modelLength / pixelLength; + +const radAroundZ = Math.acos(vec2.dot(modelDir, pixDir)) * -1; +const degreesAroundZ = (angleAroundZRad / Math.PI) * 180; +const pdfToWorldScale = imgHeight.current * scale; +const translation = vec2.sub(vec2.create(), modelPos[0], vec2.fromValues(pixelPosA[0] * scale * Math.cos(radAroundZ), pixelPosA[1] * scale * Math.sin(radAroundZ))); +``` + +### Placing a preview of PDF in scene and update + +Dynamic object will be used to place a preview of the PDF in model space, for more information on how dynamic objects are used +see [Dynamic Objects](./dynamic_objects). The dynamic model data can be found using the data api. Values found in the previous +section will be used to set scale, translation and rotation. + +```typescript +const resource = await this.dataApi.getResource("bad260f94a5340b9b767ea2756392be4"); +const url = new URL(resource.gltf); +const asset = await this.api.loadAsset(url); +const instance = this.view.scene.createDynamicObject(asset); +instance.scale = vec3.fromValues(pdfToWorldScale, pdfToWorldScale, 1); +instance.visible = true; + +// Rotate back to y as height +const rotation = quat.fromValues(-0.70710677, 0, 0, 0.70710677); +instance.position = vec3.transformQuat(vec3.create(), vec3.fromValues(translation[0], translation[1], 161.9), rotation); + +// Rotate around Z to match +instance.rotation = quat.multiply(rotation, rotation, quat.fromEuler(quat.create(), 0, 0, degreesAroundZ)); +``` + +When it looks good this asset can be added to the scene. + +### Demo + +Below example shows how to create a 2d view of the model and the PDF. placing two matching points on each will calculate the translation scale and roatation needed to place the pdf properly in model space + + diff --git a/v2/docs/tutorials/searching.mdx b/v2/docs/tutorials/searching.mdx new file mode 100644 index 0000000..56d6884 --- /dev/null +++ b/v2/docs/tutorials/searching.mdx @@ -0,0 +1,39 @@ +--- +title: "Searching" +sidebar_position: 4 +description: "Search using Novorender." +keywords: ["novorender api docs", "webgl api", "searching"] +--- + +import { tutorials } from "@site/demo-snippets/index"; + +Searching will be integral part of most applications using Novorender. +In the example below we demonstrate a few different search patterns where the resulting objects are isolated in the view. +Make sure to also check out the [Scene.search()](/docs/webgl-api/interfaces/NovoRender.Scene#search) documentation. + +### Search By Path + +Example of a Path search pattern where the isolated objects represent the results. + + +
+ +### Fluffy Search + +Fluffy search pattern that looks for terms beginning with "Roof" in all properties. + + +
+ +### Exact Search + +Exact search that only checks the property "ifcClass" and the exact value "ifcRoof". + + +
+ +### Exact Search Excluding Results + +Very similar to the Exact search pattern, but with exclude. All objects other than those located above will be returned. + + diff --git a/v2/docusaurus.config.js b/v2/docusaurus.config.js new file mode 100644 index 0000000..33e7d64 --- /dev/null +++ b/v2/docusaurus.config.js @@ -0,0 +1,264 @@ +// @ts-check +// Note: type annotations allow type checking and IDEs autocompletion + +const { webpackPlugin } = require("./src/plugins"); + +const lightCodeTheme = require("prism-react-renderer/themes/github"); +const darkCodeTheme = require("prism-react-renderer/themes/dracula"); + +const baseGithub = "https://github.com/novorender"; +const baseAPI = "https://data.novorender.com"; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: "Novorender", + tagline: "Novorender API Docs", + url: "https://novorender.com/", + baseUrl: "/v2/", + onBrokenLinks: "warn", + onBrokenMarkdownLinks: "warn", + favicon: "img/favicon.ico", + organizationName: "novorender", // Usually your GitHub org/user name. + projectName: "novorender-api-docs", // Usually your repo name. + themes: ["@docusaurus/theme-live-codeblock"], + presets: [ + [ + "classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: require.resolve("./sidebars.js"), + editUrl: `${baseGithub}/docs/edit/main`, + showLastUpdateTime: true, + }, + blog: { + showReadingTime: true, + editUrl: `${baseGithub}/docs`, + }, + theme: { + customCss: require.resolve("./src/css/custom.css"), + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + metadata: [{ name: "keywords", content: "novorender, novorender docs, novorender documentation, novorender/webgl-api, novorender/data-js-api, novorender/measure-api, novorender rest api docs, api docs" }], + docs: { + sidebar: { + hideable: true, + }, + }, + navbar: { + title: "", + logo: { + alt: "novorender logo", + src: "img/novorender_logo_RGB_2021.png", + srcDark: "img/novorender_logo_RGB_2021_white.png", + }, + items: [ + { + to: "docs/category/documentation", + position: "left", + label: "Docs", + }, + { + to: "docs/webgl-api", + position: "left", + label: "WebGL API", + }, + { + to: "docs/data-js-api", + position: "left", + label: "Data JS API", + }, + { + to: "docs/measure-api", + position: "left", + label: "Measure API", + }, + { + to: "/data-rest-api/", + position: "left", + label: "Data Rest API", + }, + { + to: "/playground/", + position: "left", + label: "Playground", + }, + // { to: '/blog', label: 'Blog', position: 'left' }, + { + href: baseGithub, + className: "header-github-link", + position: "right", + "aria-label": "GitHub repository", + }, + ], + }, + footer: { + style: "dark", + links: [ + { + title: "Docs", + items: [ + { + label: "WebGL API", + to: "/docs/webgl-api", + }, + { + label: "Data JS API", + to: "/docs/data-js-api", + }, + { + label: "Measure API", + to: "/docs/measure-api/", + }, + { + label: "Data Rest API", + to: "/data-rest-api/", + }, + ], + }, + { + title: "Community", + items: [ + { + label: "Stack Overflow", + href: "https://stackoverflow.com/questions/tagged/novorender", + }, + // { + // label: 'Discord', + // href: 'https://discordapp.com/invite/docusaurus', + // }, + { + label: "Twitter", + href: "https://twitter.com/novorender", + }, + ], + }, + { + title: "More", + items: [ + // { + // label: 'Blog', + // to: '/blog', + // }, + { + label: "GitHub", + href: baseGithub, + }, + { + label: "Resources", + href: "https://novorender.com/resources/", + }, + ], + }, + { + title: "Legal", + items: [ + { + label: "Privacy Policy", + href: "https://novorender.com/privacy-policy/", + }, + { + label: "Cookie Policy", + href: "https://novorender.com/cookie-policy/", + }, + ], + }, + { + title: "Get in touch", + items: [ + { + label: "LinkedIn", + href: "https://www.linkedin.com/company/novorender/", + }, + { + label: "info@novorender.com", + href: "mailto:info@novorender.com", + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} Novorender.`, + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + }, + colorMode: { + disableSwitch: false, + defaultMode: "dark", + }, + announcementBar: { + id: "wip_info", + content: "ℹ️ The Novorender documentation site is in active development, so expect frequent updates and new content!", + backgroundColor: "#303846", + textColor: "#fff", + }, + }), + plugins: [ + webpackPlugin, + [ + "docusaurus-plugin-typedoc", + + // Plugin / TypeDoc options + { + id: "webgl-api", + entryPoints: ["type-definitions/webgl-api.ts"], + logLevel: "Error", + out: "webgl-api", + tsconfig: "type-definitions/tsconfig.json", + readme: require.resolve("@novorender/webgl-api/README.md"), + disableSources: true, + frontmatter: { + description: "A Web API for scalable 3D rendering in the cloud.", + title: "WebGL API", + }, + }, + ], + [ + "docusaurus-plugin-typedoc", + { + id: "data-js-api", + entryPoints: ["type-definitions/data-js-api.ts"], + logLevel: "Error", + out: "data-js-api", + tsconfig: "type-definitions/tsconfig.json", + readme: require.resolve("@novorender/data-js-api/README.md"), + disableSources: true, + frontmatter: { + description: "A Data JS API for managing scalable Novorender 3D rendering in the cloud.", + title: "Data JS API", + }, + }, + ], + [ + "docusaurus-plugin-typedoc", + { + id: "measure-api", + entryPoints: ["type-definitions/measure-api.ts"], + logLevel: "Error", + out: "measure-api", + tsconfig: "type-definitions/tsconfig.json", + readme: require.resolve("@novorender/measure-api/README.md"), + disableSources: true, + frontmatter: { + description: "for detailed measuring show distances, differences, elevations and more.", + title: "Measure API", + }, + }, + ], + require.resolve("@cmfcmf/docusaurus-search-local"), + ], + customFields: { + swaggerUI: `https://data-v2.novorender.com/swagger`, + swaggerJSON_V1: `https://data-v2.novorender.com/swagger/v1/swagger.json`, + swaggerJSON_V2: `https://data-v2.novorender.com/swagger/v2/swagger.json`, + }, +}; + +module.exports = config; diff --git a/v2/package-lock.json b/v2/package-lock.json new file mode 100644 index 0000000..39b74ba --- /dev/null +++ b/v2/package-lock.json @@ -0,0 +1,17654 @@ +{ + "name": "novorender-api-docs", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "novorender-api-docs", + "version": "0.0.0", + "dependencies": { + "@cmfcmf/docusaurus-search-local": "1.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/preset-classic": "2.4.1", + "@docusaurus/theme-live-codeblock": "2.4.1", + "@fortawesome/fontawesome-svg-core": "6.4.0", + "@fortawesome/free-solid-svg-icons": "6.4.0", + "@fortawesome/react-fontawesome": "0.2.0", + "@mdx-js/react": "1.6.22", + "@monaco-editor/react": "4.5.1", + "@novorender/data-js-api": "0.2.25", + "@novorender/measure-api": "0.0.143", + "@novorender/web_app": "^0.1.31", + "@novorender/webgl-api": "0.4.59", + "@stoplight/elements": "7.7.18", + "allotment": "1.19.2", + "clsx": "1.2.1", + "monaco-editor": "0.40.0", + "raw-loader": "4.0.2", + "react": "17.0.2", + "react-dom": "17.0.2", + "react-tiny-popover": "7.2.4", + "react-transition-group": "4.4.5" + }, + "devDependencies": { + "@docusaurus/eslint-plugin": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@tsconfig/docusaurus": "1.0.6", + "@tsconfig/node16": "1.0.3", + "@types/puppeteer": "5.4.6", + "@typescript-eslint/eslint-plugin": "^5.54.0", + "@typescript-eslint/parser": "^5.54.0", + "ajv-cli": "5.0.0", + "buffer": "6.0.3", + "copy-webpack-plugin": "11.0.0", + "css-minimizer-webpack-plugin": "4.1.0", + "docusaurus-plugin-typedoc": "0.19.2", + "eslint": "^8.35.0", + "eslint-config-prettier": "^8.7.0", + "eslint-plugin-react": "^7.32.2", + "husky": "8.0.3", + "lint-staged": "13.2.3", + "path-browserify": "1.0.1", + "process": "0.11.10", + "puppeteer": "13.5.2", + "stream-browserify": "3.0.0", + "string_decoder": "1.3.0", + "typedoc": "0.24.8", + "typedoc-plugin-markdown": "3.15.4", + "typescript": "4.9.4", + "url": "0.11.0", + "util": "0.12.4", + "yargs": "17.4.1" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.8.3", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.8.3" + } + }, + "node_modules/@algolia/autocomplete-js": { + "version": "1.8.3", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.8.3", + "@algolia/autocomplete-preset-algolia": "1.8.3", + "@algolia/autocomplete-shared": "1.8.3", + "htm": "^3.1.1", + "preact": "^10.0.0" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.5.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights/node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.8.3", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.8.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.8.3", + "license": "MIT" + }, + "node_modules/@algolia/autocomplete-theme-classic": { + "version": "1.8.3", + "license": "MIT" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.16.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.16.0", + "license": "MIT" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.16.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.16.0", + "@algolia/client-search": "4.16.0", + "@algolia/transporter": "4.16.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.16.0", + "@algolia/client-search": "4.16.0", + "@algolia/requester-common": "4.16.0", + "@algolia/transporter": "4.16.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.16.0", + "@algolia/transporter": "4.16.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.16.0", + "@algolia/requester-common": "4.16.0", + "@algolia/transporter": "4.16.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.16.0", + "@algolia/requester-common": "4.16.0", + "@algolia/transporter": "4.16.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "node_modules/@algolia/logger-common": { + "version": "4.16.0", + "license": "MIT" + }, + "node_modules/@algolia/logger-console": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/logger-common": "4.16.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.16.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.16.0", + "license": "MIT" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.16.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.16.0", + "@algolia/logger-common": "4.16.0", + "@algolia/requester-common": "4.16.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.3", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.21.3", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "license": "MIT", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "license": "MIT", + "dependencies": { + "@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.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.3", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@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.21.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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.21.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.21.2", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.21.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.21.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@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.21.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.21.3", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "license": "MIT", + "dependencies": { + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-transform-typescript": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.3", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.3", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@cmfcmf/docusaurus-search-local/-/docusaurus-search-local-1.1.0.tgz", + "integrity": "sha512-0IVb/aA0IK8ZlktuxmgXmluXfcSpo6Vdd2nG21y1aOH9nVYnPP231Dn0H8Ng9Qf9ronQQCDWHnuWpYOr9rUrEQ==", + "dependencies": { + "@algolia/autocomplete-js": "^1.8.2", + "@algolia/autocomplete-theme-classic": "^1.8.2", + "@algolia/client-search": "^4.12.0", + "algoliasearch": "^4.12.0", + "cheerio": "^1.0.0-rc.9", + "clsx": "^1.1.1", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1" + }, + "peerDependencies": { + "@docusaurus/core": "^2.0.0", + "nodejieba": "^2.5.0" + }, + "peerDependenciesMeta": { + "nodejieba": { + "optional": true + } + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz", + "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==" + }, + "node_modules/@docsearch/react": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz", + "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.1", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@docusaurus/core": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz", + "integrity": "sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==", + "dependencies": { + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.2.1", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.0", + "cli-table3": "^0.6.2", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.23.3", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.12", + "del": "^6.1.1", + "detect-port": "^1.3.0", + "escape-html": "^1.0.3", + "eta": "^2.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "html-minifier-terser": "^6.1.0", + "html-tags": "^3.2.0", + "html-webpack-plugin": "^5.5.0", + "import-fresh": "^3.3.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.6.1", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.3", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.3", + "rtl-detect": "^1.0.4", + "semver": "^7.3.7", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.3", + "tslib": "^2.4.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^6.0.1", + "webpack": "^5.73.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-dev-server": "^4.9.3", + "webpack-merge": "^5.8.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz", + "integrity": "sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==", + "dependencies": { + "cssnano-preset-advanced": "^5.3.8", + "postcss": "^8.4.14", + "postcss-sort-media-queries": "^4.2.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/eslint-plugin": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/eslint-plugin/-/eslint-plugin-2.4.1.tgz", + "integrity": "sha512-Sb+aLgf07v2xenPHlcBtvADFkE6xi1Nx9cKNb98Tq5MGoywHpxUfwT3RHar+eA8vCjR3fu0npSzuRt26AJa5lw==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "^5.30.5", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "node_modules/@docusaurus/logger": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz", + "integrity": "sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz", + "integrity": "sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==", + "dependencies": { + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@mdx-js/mdx": "^1.6.22", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "image-size": "^1.0.1", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.2.0", + "stringify-object": "^3.3.0", + "tslib": "^2.4.0", + "unified": "^9.2.2", + "unist-util-visit": "^2.0.3", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz", + "integrity": "sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.4.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz", + "integrity": "sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz", + "integrity": "sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "@types/react-router-config": "^5.0.6", + "combine-promises": "^1.1.0", + "fs-extra": "^10.1.0", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz", + "integrity": "sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "fs-extra": "^10.1.0", + "tslib": "^2.4.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz", + "integrity": "sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "fs-extra": "^10.1.0", + "react-json-view": "^1.21.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz", + "integrity": "sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz", + "integrity": "sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz", + "integrity": "sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz", + "integrity": "sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "fs-extra": "^10.1.0", + "sitemap": "^7.1.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz", + "integrity": "sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/plugin-debug": "2.4.1", + "@docusaurus/plugin-google-analytics": "2.4.1", + "@docusaurus/plugin-google-gtag": "2.4.1", + "@docusaurus/plugin-google-tag-manager": "2.4.1", + "@docusaurus/plugin-sitemap": "2.4.1", + "@docusaurus/theme-classic": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-search-algolia": "2.4.1", + "@docusaurus/types": "2.4.1" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz", + "integrity": "sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "copy-text-to-clipboard": "^3.0.1", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.14", + "prism-react-renderer": "^1.3.5", + "prismjs": "^1.28.0", + "react-router-dom": "^5.3.3", + "rtlcss": "^3.5.0", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz", + "integrity": "sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==", + "dependencies": { + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^1.3.5", + "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-live-codeblock": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-live-codeblock/-/theme-live-codeblock-2.4.1.tgz", + "integrity": "sha512-KBKrm34kcdNbSeEm6RujN5GWWg4F2dmAYZyHMMQM8FXokx8mNShRx6uq17WXi23JNm7niyMhNOBRfZWay+5Hkg==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "@philpl/buble": "^0.19.7", + "clsx": "^1.2.1", + "fs-extra": "^10.1.0", + "react-live": "2.2.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz", + "integrity": "sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==", + "dependencies": { + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "algoliasearch": "^4.13.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", + "eta": "^2.0.0", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz", + "integrity": "sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==", + "dependencies": { + "fs-extra": "^10.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz", + "integrity": "sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==", + "dependencies": { + "@docusaurus/logger": "2.4.1", + "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "github-slugger": "^1.4.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.4.0", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz", + "integrity": "sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz", + "integrity": "sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==", + "dependencies": { + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", + "joi": "^17.6.0", + "js-yaml": "^4.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "devOptional": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.35.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==" + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "devOptional": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "license": "Apache-2.0" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@monaco-editor/loader": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.3.3.tgz", + "integrity": "sha512-6KKF4CTzcJiS8BJwtxtfyYt9shBiEv32ateQ9T4UVogwn4HM/uPo9iJd2Dmbkpz8CM6Y0PDUpjnZzCwC+eYo2Q==", + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.5.1.tgz", + "integrity": "sha512-NNDFdP+2HojtNhCkRfE6/D6ro6pBNihaOzMbGK84lNWzRu+CfBjwzGt4jmnqimLuqp5yE5viHS2vi+QOAnD5FQ==", + "dependencies": { + "@monaco-editor/loader": "^1.3.3" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@novorender/data-js-api": { + "version": "0.2.25", + "license": "UNLICENSED", + "dependencies": { + "gl-matrix": "^3.3.0" + }, + "optionalDependencies": { + "@novorender/webgl-api": "^0.3.90" + } + }, + "node_modules/@novorender/data-js-api/node_modules/@novorender/webgl-api": { + "version": "0.3.130", + "license": "UNLICENSED", + "optional": true, + "optionalDependencies": { + "gl-matrix": "^3.3.0" + } + }, + "node_modules/@novorender/measure-api": { + "version": "0.0.143", + "resolved": "https://registry.npmjs.org/@novorender/measure-api/-/measure-api-0.0.143.tgz", + "integrity": "sha512-wjouL52QOzG0v/heFDlgvRt9eLfy0aG3uHUNSV3AVIaLJ5z7S39hp+oj0XRhu3cJjXaW2itxBKZvEwwCnlWbYg==", + "dependencies": { + "@novorender/webgl-api": "^0.3.84", + "comlink": "^4.3.1", + "gl-matrix": "^3.4.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@novorender/measure-api/node_modules/@novorender/webgl-api": { + "version": "0.3.130", + "license": "UNLICENSED", + "optionalDependencies": { + "gl-matrix": "^3.3.0" + } + }, + "node_modules/@novorender/web_app": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/@novorender/web_app/-/web_app-0.1.31.tgz", + "integrity": "sha512-VaM+DdLcFrzEHlvw4cju96RPWxJe97hRYsIhRah03dbF05IcJXxDMZDINlaD7bEU7TvuzkWRD5Er0FyqDM0sPw==" + }, + "node_modules/@novorender/webgl-api": { + "version": "0.4.59", + "resolved": "https://registry.npmjs.org/@novorender/webgl-api/-/webgl-api-0.4.59.tgz", + "integrity": "sha512-C0gnFlGfeCuydihIDSm4c0BYPNvmNIUGKQfVfUV8BIlHPeVkZ5KgE23WOJaHcirlSdM0kdiP2xxDLahG9gek3A==", + "optionalDependencies": { + "gl-matrix": "^3.3.0" + } + }, + "node_modules/@philpl/buble": { + "version": "0.19.7", + "license": "MIT", + "dependencies": { + "acorn": "^6.1.1", + "acorn-class-fields": "^0.2.1", + "acorn-dynamic-import": "^4.0.0", + "acorn-jsx": "^5.0.1", + "chalk": "^2.4.2", + "magic-string": "^0.25.2", + "minimist": "^1.2.0", + "os-homedir": "^1.0.1", + "regexpu-core": "^4.5.4" + }, + "bin": { + "buble": "bin/buble" + } + }, + "node_modules/@philpl/buble/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@philpl/buble/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@philpl/buble/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@philpl/buble/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/jsesc": { + "version": "0.5.0", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/@philpl/buble/node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/regexpu-core": { + "version": "4.8.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@philpl/buble/node_modules/regjsparser": { + "version": "0.7.0", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/@philpl/buble/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "license": "MIT" + }, + "node_modules/@react-hook/debounce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-hook/debounce/-/debounce-3.0.0.tgz", + "integrity": "sha512-ir/kPrSfAzY12Gre0sOHkZ2rkEmM4fS5M5zFxCi4BnCeXh2nvx9Ujd+U4IGpKCuPA+EQD0pg1eK2NGLvfWejag==", + "dependencies": { + "@react-hook/latest": "^1.0.2" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/event": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@react-hook/event/-/event-1.2.6.tgz", + "integrity": "sha512-JUL5IluaOdn5w5Afpe/puPa1rj8X6udMlQ9dt4hvMuKmTrBS1Ya6sb4sVgvfe2eU4yDuOfAhik8xhbcCekbg9Q==", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/latest": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", + "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/passive-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", + "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/resize-observer": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-1.2.6.tgz", + "integrity": "sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==", + "dependencies": { + "@juggle/resize-observer": "^3.3.1", + "@react-hook/latest": "^1.0.2", + "@react-hook/passive-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/size": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@react-hook/size/-/size-2.1.2.tgz", + "integrity": "sha512-BmE5asyRDxSuQ9p14FUKJ0iBRgV9cROjqNG9jT/EjCM+xHha1HVqbPoT+14FQg1K7xIydabClCibUY4+1tw/iw==", + "dependencies": { + "@react-hook/passive-layout-effect": "^1.2.0", + "@react-hook/resize-observer": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/throttle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@react-hook/throttle/-/throttle-2.2.0.tgz", + "integrity": "sha512-LJ5eg+yMV8lXtqK3lR+OtOZ2WH/EfWvuiEEu0M3bhR7dZRfTyEJKxH1oK9uyBxiXPtWXiQggWbZirMCXam51tg==", + "dependencies": { + "@react-hook/latest": "^1.0.2" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-hook/window-size": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@react-hook/window-size/-/window-size-3.1.1.tgz", + "integrity": "sha512-yWnVS5LKnOUIrEsI44oz3bIIUYqflamPL27n+k/PC//PsX/YeWBky09oPeAoc9As6jSH16Wgo8plI+ECZaHk3g==", + "dependencies": { + "@react-hook/debounce": "^3.0.0", + "@react-hook/event": "^1.2.1", + "@react-hook/throttle": "^2.2.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@react-types/button": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.4.1.tgz", + "integrity": "sha512-B54M84LxdEppwjXNlkBEJyMfe9fd+bvFV7R6+NJvupGrZm/LuFNYjFcHk7yjMKWTdWm6DbpIuQz54n5qTW7Vlg==", + "dependencies": { + "@react-types/shared": "^3.8.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1" + } + }, + "node_modules/@react-types/checkbox": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.4.4.tgz", + "integrity": "sha512-rJNhbW4R9HTvdbF2oTZmqGiZ/WVP3/XsU4gae7tfdhSYjG+5T5h9zau1vRhz++zwKn57wfcyNn6a83GDhhgkVw==", + "dependencies": { + "@react-types/shared": "^3.18.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-types/checkbox/node_modules/@react-types/shared": { + "version": "3.18.1", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.18.1.tgz", + "integrity": "sha512-OpTYRFS607Ctfd6Tmhyk6t6cbFyDhO5K+etU35X50pMzpypo1b7vF0mkngEeTc0Xwl0e749ONZNPZskMyu5k8w==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-types/radio": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.1.2.tgz", + "integrity": "sha512-vkIic8abrVUyl/YjKU3yTVwn8QgebzuadfV89PsaKc3hdmSiHhDsln5wYsfWOEotqMwPrG1aEv9yRMYO78OQXQ==", + "dependencies": { + "@react-types/shared": "^3.8.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1" + } + }, + "node_modules/@react-types/shared": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.9.0.tgz", + "integrity": "sha512-YYksINfR6q92P10AhPEGo47Hd7oz1hrnZ6Vx8Gsrq62IbqDdv1XOTzPBaj17Z1ymNY2pitLUSEXsLmozt4wxxQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1" + } + }, + "node_modules/@react-types/switch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.1.2.tgz", + "integrity": "sha512-EaYWoLvUCpOnt//Ov8VBxOjbs4hBpYE/rBAzzIknXaFvKOu867iZBFL7FJbcemOgC8/dwyaj6GUZ1Gw3Z1g59w==", + "dependencies": { + "@react-types/checkbox": "^3.2.3", + "@react-types/shared": "^3.8.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1" + } + }, + "node_modules/@react-types/textfield": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.3.0.tgz", + "integrity": "sha512-lOf0tx3c3dVaomH/uvKpOKFVTXQ232kLnMhOJTtj97JDX7fTr3SNhDUV0G8Zf4M0vr+l+xkTrJkywYE23rzliw==", + "dependencies": { + "@react-types/shared": "^3.9.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1" + } + }, + "node_modules/@rehooks/component-size": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rehooks/component-size/-/component-size-1.0.3.tgz", + "integrity": "sha512-pnYld+8SSF2vXwdLOqBGUyOrv/SjzwLjIUcs/4c1JJgR0q4E9eBtBfuZMD6zUD51fvSehSsbnlQMzotSmPTXPg==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@sentry/browser": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.19.7.tgz", + "integrity": "sha512-oDbklp4O3MtAM4mtuwyZLrgO1qDVYIujzNJQzXmi9YzymJCuzMLSRDvhY83NNDCRxf0pds4DShgYeZdbSyKraA==", + "dependencies": { + "@sentry/core": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/core": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", + "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/minimal": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/hub": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", + "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "dependencies": { + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/minimal": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", + "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/react": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-6.19.7.tgz", + "integrity": "sha512-VzJeBg/v41jfxUYPkH2WYrKjWc4YiMLzDX0f4Zf6WkJ4v3IlDDSkX6DfmWekjTKBho6wiMkSNy2hJ1dHfGZ9jA==", + "dependencies": { + "@sentry/browser": "6.19.7", + "@sentry/minimal": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "hoist-non-react-statics": "^3.3.2", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "react": "15.x || 16.x || 17.x || 18.x" + } + }, + "node_modules/@sentry/react/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "dependencies": { + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "license": "MIT", + "dependencies": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@stoplight/elements": { + "version": "7.7.18", + "resolved": "https://registry.npmjs.org/@stoplight/elements/-/elements-7.7.18.tgz", + "integrity": "sha512-bsObKwTwIemW8upsiXLuexq0Uhk4+ANIgFcJavi3QTxtNX4o5fUVj21ARfQIPSzvznv2KY9TIQpGZHSeYpBODg==", + "dependencies": { + "@stoplight/elements-core": "~7.7.18", + "@stoplight/http-spec": "^5.1.4", + "@stoplight/json": "^3.18.1", + "@stoplight/mosaic": "^1.33.0", + "@stoplight/types": "^13.7.0", + "@stoplight/yaml": "^4.2.3", + "classnames": "^2.2.6", + "file-saver": "^2.0.5", + "lodash": "^4.17.19", + "react-query": "^3.34.19", + "react-router-dom": "^5.2.0" + }, + "engines": { + "node": ">=14.13" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@stoplight/elements-core": { + "version": "7.7.18", + "resolved": "https://registry.npmjs.org/@stoplight/elements-core/-/elements-core-7.7.18.tgz", + "integrity": "sha512-OEmJ8SqrEFrXA+rYcb3m5ng9/gEaBaK1qFEQlOT9jvNauAV/XSu7uyAMAY8YYSkDEY+r2YMVcGfBVcgV5unViA==", + "dependencies": { + "@stoplight/http-spec": "^5.1.4", + "@stoplight/json": "^3.18.1", + "@stoplight/json-schema-ref-parser": "^9.0.5", + "@stoplight/json-schema-sampler": "0.2.3", + "@stoplight/json-schema-viewer": "^4.9.1", + "@stoplight/markdown-viewer": "^5.6.0", + "@stoplight/mosaic": "^1.33.0", + "@stoplight/mosaic-code-editor": "^1.33.0", + "@stoplight/mosaic-code-viewer": "^1.33.0", + "@stoplight/path": "^1.3.2", + "@stoplight/react-error-boundary": "^2.0.0", + "@stoplight/types": "^13.7.0", + "@stoplight/yaml": "^4.2.3", + "classnames": "^2.2.6", + "httpsnippet-lite": "^3.0.1", + "jotai": "1.3.9", + "json-schema": "^0.4.0", + "lodash": "^4.17.19", + "nanoid": "^3.1.32", + "prop-types": "^15.7.2", + "react-query": "^3.34.19", + "react-router-dom": "^5.2.0", + "react-router-hash-link": "^2.1.0", + "tslib": "^2.1.0", + "urijs": "^1.19.11", + "util": "^0.12.4", + "xml-formatter": "^2.6.1" + }, + "engines": { + "node": ">=14.13" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@stoplight/http-spec": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/@stoplight/http-spec/-/http-spec-5.11.1.tgz", + "integrity": "sha512-NtiAZo0THgDEI9V1/MN2zjhM1RfgiirefYNikqvz1b5Ur2OT9Ggax0WezAanAVdfN3bVs47EnT7dcdQn2Uk6eA==", + "dependencies": { + "@stoplight/json": "^3.18.1", + "@stoplight/json-schema-generator": "1.0.2", + "@stoplight/types": "^13.17.0", + "@types/json-schema": "7.0.11", + "@types/swagger-schema-official": "~2.0.22", + "@types/type-is": "^1.6.3", + "fnv-plus": "^1.3.1", + "lodash.isequalwith": "^4.4.0", + "lodash.pick": "^4.4.0", + "lodash.pickby": "^4.6.0", + "openapi3-ts": "^2.0.2", + "postman-collection": "^4.1.2", + "tslib": "^2.3.1", + "type-is": "^1.6.18" + }, + "engines": { + "node": ">=14.13" + } + }, + "node_modules/@stoplight/json": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.21.0.tgz", + "integrity": "sha512-5O0apqJ/t4sIevXCO3SBN9AHCEKKR/Zb4gaj7wYe5863jme9g02Q0n/GhM7ZCALkL+vGPTe4ZzTETP8TFtsw3g==", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.3", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "jsonc-parser": "~2.2.1", + "lodash": "^4.17.21", + "safe-stable-stringify": "^1.1" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@stoplight/json-schema-generator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stoplight/json-schema-generator/-/json-schema-generator-1.0.2.tgz", + "integrity": "sha512-FzSLFoIZc6Lmw3oRE7kU6YUrl5gBmUs//rY59jdFipBoSyTPv5NyqeyTg5mvT6rY1F3qTLU3xgzRi/9Pb9eZpA==", + "dependencies": { + "cross-fetch": "^3.1.5", + "json-promise": "1.1.x", + "minimist": "1.2.6", + "mkdirp": "0.5.x", + "pretty-data": "0.40.x" + }, + "bin": { + "json-schema-generator": "bin/cli.js" + } + }, + "node_modules/@stoplight/json-schema-generator/node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/@stoplight/json-schema-merge-allof": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@stoplight/json-schema-merge-allof/-/json-schema-merge-allof-0.7.8.tgz", + "integrity": "sha512-JTDt6GYpCWQSb7+UW1P91IAp/pcLWis0mmEzWVFcLsrNgtUYK7JLtYYz0ZPSR4QVL0fJ0YQejM+MPq5iNDFO4g==", + "dependencies": { + "compute-lcm": "^1.1.0", + "json-schema-compare": "^0.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/@stoplight/json-schema-ref-parser": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@stoplight/json-schema-ref-parser/-/json-schema-ref-parser-9.2.5.tgz", + "integrity": "sha512-7UI3pX5oyGzAdGPah001CyPnIsJZJW+38sGjvx862zXQFidBe0sxFO5MUety61Zr/RaygCQ2RU/KfD7hSfOLxg==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@stoplight/path": "^1.3.2", + "@stoplight/yaml": "^4.0.2", + "call-me-maybe": "^1.0.1", + "fastestsmallesttextencoderdecoder": "^1.0.22", + "isomorphic-fetch": "^3.0.0", + "node-abort-controller": "^3.0.1" + } + }, + "node_modules/@stoplight/json-schema-sampler": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@stoplight/json-schema-sampler/-/json-schema-sampler-0.2.3.tgz", + "integrity": "sha512-57PqNll9y/Rkfp4/t1AkVfz5C0PIrDd8i2AW/N0XU5wVJ50kIrmJg3BD+PzmVcrF3lXFH7/LojoOUkzLZXMJpg==", + "dependencies": { + "@types/json-schema": "^7.0.7", + "json-pointer": "^0.6.1" + } + }, + "node_modules/@stoplight/json-schema-tree": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@stoplight/json-schema-tree/-/json-schema-tree-2.2.3.tgz", + "integrity": "sha512-cJ11QpzuoEsM6YgAahxoZDqzE+UjWTZqbRJanYLYqA4bC9pqB00Sj/NBqvTTIi6FfSef1D77KvURU5CcDk4h+A==", + "dependencies": { + "@stoplight/json": "^3.12.0", + "@stoplight/json-schema-merge-allof": "^0.7.8", + "@stoplight/lifecycle": "^2.3.2", + "@types/json-schema": "^7.0.7", + "magic-error": "0.0.1" + }, + "engines": { + "node": ">=10.18" + } + }, + "node_modules/@stoplight/json-schema-viewer": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@stoplight/json-schema-viewer/-/json-schema-viewer-4.10.0.tgz", + "integrity": "sha512-w3c25stdpWQ37+x82532Xx5eLVC34jgdiuQdM7sxuZwWk5O+GDIlCrHuKg3lUZoMBKqhCrHxf99LdEnK9CqpLw==", + "dependencies": { + "@stoplight/json": "^3.20.1", + "@stoplight/json-schema-tree": "^2.2.2", + "@stoplight/react-error-boundary": "^2.0.0", + "@types/json-schema": "^7.0.7", + "classnames": "^2.2.6", + "fnv-plus": "^1.3.1", + "jotai": "^1.4.5", + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@stoplight/markdown-viewer": "^5", + "@stoplight/mosaic": "^1.32", + "@stoplight/mosaic-code-viewer": "^1.32", + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@stoplight/json-schema-viewer/node_modules/jotai": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-1.13.1.tgz", + "integrity": "sha512-RUmH1S4vLsG3V6fbGlKzGJnLrDcC/HNb5gH2AeA9DzuJknoVxSGvvg8OBB7lke+gDc4oXmdVsaKn/xDUhWZ0vw==", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@babel/core": "*", + "@babel/template": "*", + "jotai-devtools": "*", + "jotai-immer": "*", + "jotai-optics": "*", + "jotai-redux": "*", + "jotai-tanstack-query": "*", + "jotai-urql": "*", + "jotai-valtio": "*", + "jotai-xstate": "*", + "jotai-zustand": "*", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@babel/template": { + "optional": true + }, + "jotai-devtools": { + "optional": true + }, + "jotai-immer": { + "optional": true + }, + "jotai-optics": { + "optional": true + }, + "jotai-redux": { + "optional": true + }, + "jotai-tanstack-query": { + "optional": true + }, + "jotai-urql": { + "optional": true + }, + "jotai-valtio": { + "optional": true + }, + "jotai-xstate": { + "optional": true + }, + "jotai-zustand": { + "optional": true + } + } + }, + "node_modules/@stoplight/lifecycle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@stoplight/lifecycle/-/lifecycle-2.3.3.tgz", + "integrity": "sha512-JbPRTIzPZabeYPAk5+gdsnfwAxqW35G9e0ZjOG3toUmNViLOsEzuK4vpWd+Prv2Mw8HRmu+haiYizteZp6mk0w==", + "dependencies": { + "tslib": "^2.3.1", + "wolfy87-eventemitter": "~5.2.8" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@stoplight/markdown": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@stoplight/markdown/-/markdown-3.2.0.tgz", + "integrity": "sha512-Hhnrj7xb+f4iMQQeZBKLgfst3OJyV8T4BKr8BSYnKpp070B6fE63V/lkPuKqrpvidcv6kz3INDBU/GE7K2Q0uw==", + "dependencies": { + "@stoplight/types": "^12.3.0", + "@stoplight/yaml": "^4.2.2", + "github-slugger": "^1.3.0", + "hast-util-whitespace": "^2.0.0", + "lodash": "^4.17.21", + "mdast-util-to-string": "^3.1.0", + "remark-frontmatter": "^3.0.0", + "remark-gfm": "^1.0.0", + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.1", + "tslib": "^2.3.0", + "unified": "^9.2.1", + "unist-util-select": "^4.0.0", + "unist-util-visit": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@stoplight/markdown-viewer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@stoplight/markdown-viewer/-/markdown-viewer-5.6.0.tgz", + "integrity": "sha512-vKHn1Bv9nafBYQWtNLlrRZ1aKqFRTOdfWUAhCSV1ZH4iqxGa+O1OWWTBbeOF5du8vcrWu1tTrXoCXkZjmq1NlA==", + "dependencies": { + "@rehooks/component-size": "^1.0.3", + "@stoplight/markdown": "^3.1.3", + "@stoplight/react-error-boundary": "^2.0.0", + "deepmerge": "^4.2.2", + "hast-to-hyperscript": "^10.0.1", + "hast-util-raw": "7.0.0", + "hast-util-sanitize": "^4.0.0", + "hastscript": "^7.0.2", + "mdast-util-to-hast": "^11.1.1", + "remark-parse": "^9.0.0", + "unified": "^9.2.1", + "unist-builder": "^3.0.0", + "unist-util-select": "^4.0.1", + "unist-util-visit": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@stoplight/mosaic": "^1.24.4", + "@stoplight/mosaic-code-viewer": "^1.24.4", + "react": ">=16.14", + "react-dom": ">=16.14" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + }, + "node_modules/@stoplight/markdown-viewer/node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/hast-util-from-parse5/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/hast-util-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.0.0.tgz", + "integrity": "sha512-3UKuYgaqakZrY916JfQzqSk8xZGyxpj9zwfPB3MctXLDorPdyqk1QZGZoCEqU2LMIEzVXBZukAQs7aAH9TJPIw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "@types/unist": "^2.0.3", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/mdast-util-to-hast": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-11.3.0.tgz", + "integrity": "sha512-4o3Cli3hXPmm1LhB+6rqhfsIUBjnKFlIUZvudaermXB+4/KONdd/W4saWWkC+LBLbPMqhFSSTSRgafHsT5fVJw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "@types/mdurl": "^1.0.0", + "mdast-util-definitions": "^5.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/mdast-util-to-hast/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/@stoplight/markdown-viewer/node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/unist-builder": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.1.tgz", + "integrity": "sha512-gnpOw7DIpCA0vpr6NqdPvTWnlPTApCTRzr+38E6hCWx3rz/cjo83SsKIlS1Z+L5ttScQ2AwutNnb8+tAvpb6qQ==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/unist-util-visit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", + "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/unist-util-visit-parents": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", + "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/vfile-location/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown-viewer/node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@stoplight/markdown/node_modules/@stoplight/types": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-12.5.0.tgz", + "integrity": "sha512-dwqYcDrGmEyUv5TWrDam5TGOxU72ufyQ7hnOIIDdmW5ezOwZaBFoR5XQ9AsH49w7wgvOqB2Bmo799pJPWnpCbg==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/markdown/node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown/node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown/node_modules/unist-util-visit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", + "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/markdown/node_modules/unist-util-visit-parents": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", + "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@stoplight/mosaic": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/@stoplight/mosaic/-/mosaic-1.42.0.tgz", + "integrity": "sha512-ekTcf89CCUFA/0+cWq/iSSqXe9wVk+kSHkF0aBzT3ZkilGBUr2URITFx9Slvc0t+j+wm0C7p+ehx5DI6bXaVxg==", + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.2.0", + "@react-hook/size": "^2.1.1", + "@react-hook/window-size": "^3.0.7", + "@react-types/button": "3.4.1", + "@react-types/radio": "3.1.2", + "@react-types/shared": "3.9.0", + "@react-types/switch": "3.1.2", + "@react-types/textfield": "3.3.0", + "@stoplight/types": "^13.7.0", + "@types/react": "^17.0.3", + "@types/react-dom": "^17.0.3", + "clsx": "^1.1.1", + "copy-to-clipboard": "^3.3.1", + "dom-helpers": "^3.3.1", + "lodash.get": "^4.4.2", + "nano-memoize": "^1.2.1", + "polished": "^4.1.3", + "react-fast-compare": "^3.2.0", + "react-overflow-list": "^0.5.0", + "ts-keycode-enum": "^1.0.6", + "tslib": "^2.1.0", + "use-resize-observer": "^9.0.2", + "zustand": "^3.5.2" + }, + "peerDependencies": { + "react": ">= 16.14" + } + }, + "node_modules/@stoplight/mosaic-code-editor": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/@stoplight/mosaic-code-editor/-/mosaic-code-editor-1.42.0.tgz", + "integrity": "sha512-K/9FebPKdac6vddhiGYuOagVKyU3u913hv2eJtVMsTNMbvN0n67mj0dFHWZFu3P2+cRTnkHtAYEidFelpVK+xg==", + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.2.0", + "@react-hook/size": "^2.1.1", + "@react-hook/window-size": "^3.0.7", + "@react-types/radio": "3.1.2", + "@react-types/shared": "3.9.0", + "@react-types/switch": "3.1.2", + "@stoplight/mosaic": "1.42.0", + "@stoplight/mosaic-code-viewer": "1.42.0", + "@stoplight/types": "^13.7.0", + "clsx": "^1.1.1", + "copy-to-clipboard": "^3.3.1", + "dom-helpers": "^3.3.1", + "lodash.get": "^4.4.2", + "nano-memoize": "^1.2.1", + "polished": "^4.1.3", + "prism-react-renderer": "^1.2.1", + "prismjs": "^1.23.0", + "react-fast-compare": "^3.2.0", + "react-overflow-list": "^0.5.0", + "ts-keycode-enum": "^1.0.6", + "tslib": "^2.1.0", + "use-resize-observer": "^9.0.2", + "zustand": "^3.5.2" + }, + "peerDependencies": { + "react": ">= 16.14" + } + }, + "node_modules/@stoplight/mosaic-code-viewer": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/@stoplight/mosaic-code-viewer/-/mosaic-code-viewer-1.42.0.tgz", + "integrity": "sha512-kroa7Oiw0UWxluk8dMTiHwW0wl0KYlkd2Ee14ZjjfV3UEI6dkoHMbAn2Xx6RW8+CVRRnJ8yCS7xQ25cIJ+zrrw==", + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.2.0", + "@react-hook/size": "^2.1.1", + "@react-hook/window-size": "^3.0.7", + "@react-types/radio": "3.1.2", + "@react-types/shared": "3.9.0", + "@react-types/switch": "3.1.2", + "@stoplight/mosaic": "1.42.0", + "@stoplight/types": "^13.7.0", + "clsx": "^1.1.1", + "copy-to-clipboard": "^3.3.1", + "dom-helpers": "^3.3.1", + "lodash.get": "^4.4.2", + "nano-memoize": "^1.2.1", + "polished": "^4.1.3", + "prism-react-renderer": "^1.2.1", + "prismjs": "^1.23.0", + "react-fast-compare": "^3.2.0", + "react-overflow-list": "^0.5.0", + "ts-keycode-enum": "^1.0.6", + "tslib": "^2.1.0", + "use-resize-observer": "^9.0.2", + "zustand": "^3.5.2" + }, + "peerDependencies": { + "react": ">= 16.14" + } + }, + "node_modules/@stoplight/mosaic/node_modules/@types/react": { + "version": "17.0.62", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz", + "integrity": "sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@stoplight/ordered-object-literal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.4.tgz", + "integrity": "sha512-OF8uib1jjDs5/cCU+iOVy+GJjU3X7vk/qJIkIJFqwmlJKrrtijFmqwbu8XToXrwTYLQTP+Hebws5gtZEmk9jag==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/path": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz", + "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/react-error-boundary": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@stoplight/react-error-boundary/-/react-error-boundary-2.0.0.tgz", + "integrity": "sha512-r9cyaaH2h0kFe5c0aP+yJuY9CyXgfbBaMO6660M/wRQXqM49K5Ul7kexE4ei2cqYgo+Cd6ALl6RXSZFYwf2kCA==", + "dependencies": { + "@sentry/react": "^6.13.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@stoplight/types": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.17.0.tgz", + "integrity": "sha512-9wzSi8MZQXjO+GSYehwMWFSUHO5qtDr282RxrDDsxO9ZHn0a4nWE+kTWDWSdtbiZrIEantTSkycmQJxKxnnRTQ==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/yaml": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.2.3.tgz", + "integrity": "sha512-Mx01wjRAR9C7yLMUyYFTfbUf5DimEpHMkRDQ1PKLe9dfNILbgdxyrncsOXM3vCpsQ1Hfj4bPiGl+u4u6e9Akqw==", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.1", + "@stoplight/types": "^13.0.0", + "@stoplight/yaml-ast-parser": "0.0.48", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=10.8" + } + }, + "node_modules/@stoplight/yaml-ast-parser": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.48.tgz", + "integrity": "sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg==" + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.5.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.5.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/docusaurus": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.21.3", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.17", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.33", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/har-format": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.11.tgz", + "integrity": "sha512-T232/TneofqK30AD1LRrrf8KnjLvzrjWDp7eWST5KoiSzrBfRsLrWDPk4STQPW4NZG6v2MltnduBVmakbZOBIQ==" + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.10", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/js-cookie": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", + "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.15.5", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "license": "MIT" + }, + "node_modules/@types/puppeteer": { + "version": "5.4.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.0.28", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "17.0.20", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", + "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", + "dependencies": { + "@types/react": "^17" + } + }, + "node_modules/@types/react-dom/node_modules/@types/react": { + "version": "17.0.62", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz", + "integrity": "sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.6", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "license": "MIT", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/swagger-schema-official": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.22.tgz", + "integrity": "sha512-7yQiX6MWSFSvc/1wW5smJMZTZ4fHOd+hqLr3qr/HONDxHEa2bnYAsOcGBOEqFIjd4yetwMOdEDdeW+udRAQnHA==" + }, + "node_modules/@types/type-is": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@types/type-is/-/type-is-1.6.3.tgz", + "integrity": "sha512-PNs5wHaNcBgCQG5nAeeZ7OvosrEsI9O4W2jAOO9BCCg4ux9ZZvH2+0iSCOIDBiKuQsiNS8CBlmfX9f5YBQ22cA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/type-utils": "5.54.0", + "@typescript-eslint/utils": "5.54.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.54.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/typescript-estree": "5.54.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.54.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.54.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/typescript-estree": "5.54.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.54.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.54.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.56.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.54.0", + "@typescript-eslint/utils": "5.54.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.54.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/visitor-keys": "5.54.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.54.0", + "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/typescript-estree": "5.54.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.54.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.54.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.56.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.56.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/visitor-keys": "5.56.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.56.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.56.0", + "@typescript-eslint/types": "5.56.0", + "@typescript-eslint/typescript-estree": "5.56.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.56.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.56.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@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" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@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" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@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" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xobotyi/scrollbar-width": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==" + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-class-fields": { + "version": "0.2.1", + "license": "MIT", + "engines": { + "node": ">=4.8.2" + }, + "peerDependencies": { + "acorn": "^6.0.0" + } + }, + "node_modules/acorn-dynamic-import": { + "version": "4.0.0", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-cli": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0", + "fast-json-patch": "^2.0.0", + "glob": "^7.1.0", + "js-yaml": "^3.14.0", + "json-schema-migrate": "^2.0.0", + "json5": "^2.1.3", + "minimist": "^1.2.0" + }, + "bin": { + "ajv": "dist/index.js" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/ajv-cli/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/ajv-cli/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.16.0", + "@algolia/cache-common": "4.16.0", + "@algolia/cache-in-memory": "4.16.0", + "@algolia/client-account": "4.16.0", + "@algolia/client-analytics": "4.16.0", + "@algolia/client-common": "4.16.0", + "@algolia/client-personalization": "4.16.0", + "@algolia/client-search": "4.16.0", + "@algolia/logger-common": "4.16.0", + "@algolia/logger-console": "4.16.0", + "@algolia/requester-browser-xhr": "4.16.0", + "@algolia/requester-common": "4.16.0", + "@algolia/requester-node-http": "4.16.0", + "@algolia/transporter": "4.16.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.14.0.tgz", + "integrity": "sha512-gXDXzsSS0YANn5dHr71CUXOo84cN4azhHKUbg71vAWnH+1JBiR4jf7to3t3JHXknXkbV0F7f055vUSBKrltHLQ==", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/allotment": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/allotment/-/allotment-1.19.2.tgz", + "integrity": "sha512-RiiCLa4AQATPsQDXvleyvdRzSsd2J7naLuY+eK1sn1zeXBKMdsCwWuICZ+ZCeDCrJXjVV+q/mHfB2LT7PEYmTw==", + "dependencies": { + "classnames": "^2.3.0", + "eventemitter3": "^5.0.0", + "lodash.clamp": "^4.0.0", + "lodash.debounce": "^4.0.0", + "lodash.isequal": "^4.5.0", + "use-resize-observer": "^9.0.0" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "0.25.0", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buble": { + "version": "0.19.6", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "magic-string": "^0.25.1", + "minimist": "^1.2.0", + "os-homedir": "^1.0.1", + "regexpu-core": "^4.2.0", + "vlq": "^1.0.0" + }, + "bin": { + "buble": "bin/buble" + } + }, + "node_modules/buble/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/buble/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/buble/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/buble/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/buble/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/buble/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/buble/node_modules/jsesc": { + "version": "0.5.0", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/buble/node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/buble/node_modules/regexpu-core": { + "version": "4.8.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/buble/node_modules/regjsparser": { + "version": "0.7.0", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/buble/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001469", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "1.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "dev": true, + "license": "ISC" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/classnames": { + "version": "2.3.2", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.2", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.19", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comlink": { + "version": "4.4.1", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/component-props": { + "version": "1.1.1" + }, + "node_modules/component-xor": { + "version": "0.0.4", + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/compute-gcd": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/compute-lcm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", + "dependencies": { + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/configstore": { + "version": "5.0.1", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.1.3", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.29.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.29.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.29.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^27.5.1", + "postcss": "^8.4.13", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", + "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" + }, + "node_modules/css-tree": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "dependencies": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "devOptional": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/node_modules/human-signals": { + "version": "2.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/strip-final-newline": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/devtools-protocol": { + "version": "0.0.969999", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/docusaurus-plugin-typedoc": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-typedoc/-/docusaurus-plugin-typedoc-0.19.2.tgz", + "integrity": "sha512-N4B2MOaXIyu+FloFn6zVbGgSqszeFQE/7ZIgFakpkVg5F0rfysiDGac2PHbPf4o8DWdyyviJOAuhXk6U7Febeg==", + "dev": true, + "peerDependencies": { + "typedoc": ">=0.24.0", + "typedoc-plugin-markdown": ">=3.15.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/dom-iterator": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "component-props": "1.1.1", + "component-xor": "0.0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "license": "BSD-3-Clause" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.337", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.12.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "license": "MIT" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.35.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@eslint/eslintrc": "^2.0.0", + "@eslint/js": "8.35.0", + "@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.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.7.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "dev": true, + "license": "MIT", + "dependencies": { + "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.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "devOptional": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "devOptional": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "devOptional": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.5.0", + "devOptional": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.8.2", + "devOptional": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.0", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-patch": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fast-json-patch/node_modules/fast-deep-equal": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "devOptional": true, + "license": "MIT" + }, + "node_modules/fast-loops": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz", + "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==" + }, + "node_modules/fast-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fast-url-parser/node_modules/punycode": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/fastest-stable-stringify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==" + }, + "node_modules/fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "devOptional": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "devOptional": true, + "license": "ISC" + }, + "node_modules/flux": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/fnv-plus": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz", + "integrity": "sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "license": "ISC" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "license": "ISC" + }, + "node_modules/gl-matrix": { + "version": "3.4.3", + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "devOptional": true, + "license": "MIT" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-10.0.3.tgz", + "integrity": "sha512-NuBoUStp4fRwmvlfbidlEiRSTk0gSHm+97q4Xn9CJ10HO+Py7nlTuDi6RhM1qLOureukGrCXLG7AAxaGqqyslQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.1", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-to-hyperscript/node_modules/style-to-object": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", + "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-from-parse5/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-from-parse5/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/hast-util-raw/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-sanitize": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz", + "integrity": "sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-parse5/node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-parse5/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-parse5/node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/htm": { + "version": "3.1.1", + "license": "Apache-2.0" + }, + "node_modules/html-entities": { + "version": "2.3.3", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/http-reasons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", + "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/httpsnippet-lite": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/httpsnippet-lite/-/httpsnippet-lite-3.0.5.tgz", + "integrity": "sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA==", + "dependencies": { + "@types/har-format": "^1.2.10", + "formdata-node": "^4.4.1", + "stringify-object": "3.3.0" + }, + "engines": { + "node": ">=14.13" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "dev": true, + "license": "MIT", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/inline-style-prefixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz", + "integrity": "sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==", + "dependencies": { + "css-in-js-utils": "^3.1.0", + "fast-loops": "^1.1.3" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "license": "MIT" + }, + "node_modules/isarray": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.9.1", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/jotai": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/jotai/-/jotai-1.3.9.tgz", + "integrity": "sha512-b6DvH9gf+7TfjaboCO54g+C0yhaakIaUBtjLf0dk1p15FWCzNw/93sezdXy9cCaZ8qcEdMLJcjBwQlORmIq29g==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@babel/core": "*", + "@babel/template": "*", + "@urql/core": "*", + "immer": "*", + "optics-ts": "*", + "react": ">=16.8", + "react-query": "*", + "valtio": "*", + "wonka": "*", + "xstate": "*" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@babel/template": { + "optional": true + }, + "@urql/core": { + "optional": true + }, + "immer": { + "optional": true + }, + "optics-ts": { + "optional": true + }, + "react-query": { + "optional": true + }, + "valtio": { + "optional": true + }, + "wonka": { + "optional": true + }, + "xstate": { + "optional": true + } + } + }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "devOptional": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "dependencies": { + "foreach": "^2.0.4" + } + }, + "node_modules/json-promise": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/json-promise/-/json-promise-1.1.8.tgz", + "integrity": "sha512-rz31P/7VfYnjQFrF60zpPTT0egMPlc8ZvIQHWs4ZtNZNnAXRmXo6oS+6eyWr5sEMG03OVhklNrTXxiIRYzoUgQ==", + "dependencies": { + "bluebird": "*" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-compare": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", + "dependencies": { + "lodash": "^4.17.4" + } + }, + "node_modules/json-schema-migrate": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "dev": true, + "dependencies": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/liquid-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", + "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/listr2": { + "version": "5.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.clamp": { + "version": "4.0.3", + "license": "MIT" + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.isequalwith": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isequalwith/-/lodash.isequalwith-4.4.0.tgz", + "integrity": "sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" + }, + "node_modules/lodash.pickby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", + "integrity": "sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/log-update": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/lunr-languages": { + "version": "1.10.0", + "license": "MPL-1.1" + }, + "node_modules/magic-error": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/magic-error/-/magic-error-0.0.1.tgz", + "integrity": "sha512-1+N1ET8cbC5bfLQZcRojClzgK2gbUt9keTMr9OJeuXnQKWsfwRRRICuMA3HKaCIXFEgKzxivuMGCNKD7cdU5pg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "license": "MIT" + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", + "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz", + "integrity": "sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==", + "dependencies": { + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", + "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==", + "dependencies": { + "mdast-util-gfm-autolink-literal": "^0.1.0", + "mdast-util-gfm-strikethrough": "^0.2.0", + "mdast-util-gfm-table": "^0.1.0", + "mdast-util-gfm-task-list-item": "^0.1.0", + "mdast-util-to-markdown": "^0.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz", + "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==", + "dependencies": { + "ccount": "^1.0.0", + "mdast-util-find-and-replace": "^1.1.0", + "micromark": "^2.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz", + "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==", + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz", + "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==", + "dependencies": { + "markdown-table": "^2.0.0", + "mdast-util-to-markdown": "~0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz", + "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==", + "dependencies": { + "mdast-util-to-markdown": "~0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.13", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz", + "integrity": "sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==", + "dependencies": { + "fault": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", + "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==", + "dependencies": { + "micromark": "~2.11.0", + "micromark-extension-gfm-autolink-literal": "~0.5.0", + "micromark-extension-gfm-strikethrough": "~0.6.5", + "micromark-extension-gfm-table": "~0.4.0", + "micromark-extension-gfm-tagfilter": "~0.3.0", + "micromark-extension-gfm-task-list-item": "~0.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz", + "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==", + "dependencies": { + "micromark": "~2.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz", + "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==", + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz", + "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==", + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz", + "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz", + "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==", + "dependencies": { + "micromark": "~2.11.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-format": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", + "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", + "dependencies": { + "charset": "^1.0.0" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.5", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "dev": true, + "license": "MIT" + }, + "node_modules/monaco-editor": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.40.0.tgz", + "integrity": "sha512-1wymccLEuFSMBvCk/jT1YDW/GuxMLYwnFwF9CDyYCxoTw2Pt379J3FUhwy9c43j51JdcxVPjwk0jm0EVDsBS2g==" + }, + "node_modules/mrmime": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nano-memoize": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/nano-memoize/-/nano-memoize-1.3.1.tgz", + "integrity": "sha512-wQiW3xHptgGlec/Zbo7oq6Zz4kKoK8TaIIs1irTO9iJOGTIG3lnQRUJfH73bJ/rn7MOE4sTdSU+ALPGEidaijQ==" + }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "dependencies": { + "big-integer": "^1.6.16" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, + "node_modules/obuf": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi3-ts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-2.0.2.tgz", + "integrity": "sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==", + "dependencies": { + "yaml": "^1.10.2" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "license": "MIT", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/polished": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz", + "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.0.0", + "klona": "^2.0.6", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.1.3", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postman-collection": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.1.7.tgz", + "integrity": "sha512-fMICmDa6megCH/jKq66MZVcR26wrSn1G/rjIkqrtdB6Df4u/I+XLRbWueQnz91Jwm3FR+su1refy4gwIjLLGLg==", + "dependencies": { + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.3.8", + "uuid": "8.3.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-url-encoder": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", + "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/preact": { + "version": "10.13.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-data": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz", + "integrity": "sha512-YFLnEdDEDnkt/GEhet5CYZHCvALw6+Elyb/tp8kQG03ZSIuzeaDWpZYndCXwgqu4NAjh1PI534dhDS1mHarRnQ==", + "engines": { + "node": "*" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "1.3.5", + "license": "MIT", + "peerDependencies": { + "react": ">=0.14.9" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", + "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer": { + "version": "13.5.2", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.969999", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "pkg-dir": "4.2.0", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.5.0" + }, + "engines": { + "node": ">=10.18.1" + } + }, + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "node_modules/qs": { + "version": "6.11.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/raw-loader/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/raw-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/raw-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/raw-loader/node_modules/schema-utils": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "dependencies": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "license": "MIT" + }, + "node_modules/react-fast-compare": { + "version": "3.2.1", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + }, + "peerDependencies": { + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-live": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "buble": "0.19.6", + "core-js": "^2.4.1", + "dom-iterator": "^1.0.0", + "prism-react-renderer": "^1.0.1", + "prop-types": "^15.5.8", + "react-simple-code-editor": "^0.10.0", + "unescape": "^1.0.1" + }, + "engines": { + "node": ">= 0.12.0", + "npm": ">= 2.0.0" + } + }, + "node_modules/react-live/node_modules/core-js": { + "version": "2.6.12", + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/react-live/node_modules/react": { + "version": "16.14.0", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-live/node_modules/react-dom": { + "version": "16.14.0", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" + } + }, + "node_modules/react-live/node_modules/react-simple-code-editor": { + "version": "0.10.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.0.0", + "react-dom": "^16.0.0" + } + }, + "node_modules/react-live/node_modules/scheduler": { + "version": "0.19.1", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-overflow-list": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/react-overflow-list/-/react-overflow-list-0.5.0.tgz", + "integrity": "sha512-+UegukgQ10E4ll3txz4DJyrnCgZ3eDVuv5dvR8ziyG5FfgCDZcUKeKhIgbU90oyqQa21aH4oLOoGKt0TiYJRmg==", + "dependencies": { + "react-use": "^17.3.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/react-overflow-list/node_modules/react-use": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.0.tgz", + "integrity": "sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==", + "dependencies": { + "@types/js-cookie": "^2.2.6", + "@xobotyi/scrollbar-width": "^1.9.5", + "copy-to-clipboard": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.3.1", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.1.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^3.0.1", + "ts-easing": "^0.2.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-overflow-list/node_modules/react-use/node_modules/nano-css": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.5.tgz", + "integrity": "sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==", + "dependencies": { + "css-tree": "^1.1.2", + "csstype": "^3.0.6", + "fastest-stable-stringify": "^2.0.2", + "inline-style-prefixer": "^6.0.0", + "rtl-css-js": "^1.14.0", + "sourcemap-codec": "^1.4.8", + "stacktrace-js": "^2.0.2", + "stylis": "^4.0.6" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-hash-link": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/react-router-hash-link/-/react-router-hash-link-2.4.3.tgz", + "integrity": "sha512-NU7GWc265m92xh/aYD79Vr1W+zAIXDWp3L2YZOYP4rCqPnJ6LI6vh3+rKgkidtYijozHclaEQTAHaAaMWPVI4A==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router-dom": ">=4" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz", + "integrity": "sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-tiny-popover": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/react-tiny-popover/-/react-tiny-popover-7.2.4.tgz", + "integrity": "sha512-T7ZSwXcUtPXCog3Bux9+TjoTvUeMi/+zI0Yv/TkIznZCWUg0XTt2797G0IiT5mTVeJeLivUzdOmKA1hOQdMfOQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-transition-group/node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/react-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "peerDependencies": { + "react": "*", + "tslib": "*" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz", + "integrity": "sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==", + "dependencies": { + "mdast-util-frontmatter": "^0.2.0", + "micromark-extension-frontmatter": "^0.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz", + "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==", + "dependencies": { + "mdast-util-gfm": "^0.1.0", + "micromark-extension-gfm": "^0.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remark-mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, + "node_modules/renderkid": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/rtl-detect": { + "version": "1.0.4", + "license": "BSD-3-Clause" + }, + "node_modules/rtlcss": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", + "dependencies": { + "find-up": "^5.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.3.11", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/search-insights": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.7.0.tgz", + "integrity": "sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==", + "peer": true, + "engines": { + "node": ">=8.16.0" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/send": { + "version": "0.18.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "engines": { + "node": ">=6.9" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.0", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shiki": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/shiki/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "1.0.19", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "license": "MIT" + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/stable": { + "version": "0.1.8", + "license": "MIT" + }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.3.2", + "license": "MIT" + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.16.6", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.7", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.8.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/throttle-debounce": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", + "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" + }, + "node_modules/ts-keycode-enum": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ts-keycode-enum/-/ts-keycode-enum-1.0.6.tgz", + "integrity": "sha512-DF8+Cf/FJJnPRxwz8agCoDelQXKZWQOS/gnnwx01nZ106tPJdB3BgJ9QTtLwXgR82D8O+nTjuZzWgf0Rg4vuRA==" + }, + "node_modules/tslib": { + "version": "2.5.0", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typedoc": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", + "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 14.14" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x" + } + }, + "node_modules/typedoc-plugin-markdown": { + "version": "3.15.4", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.15.4.tgz", + "integrity": "sha512-KpjFL/NDrQAbY147oIoOgob2vAdEchsMcTVd6+e6H2lC1l5xhi48bhP/fMJI7qYQ8th5nubervgqw51z7gY66A==", + "dev": true, + "dependencies": { + "handlebars": "^4.7.7" + }, + "peerDependencies": { + "typedoc": ">=0.24.0" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/unescape": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "license": "MIT", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-select": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-4.0.3.tgz", + "integrity": "sha512-1074+K9VyR3NyUz3lgNtHKm7ln+jSZXtLJM4E22uVuoFn88a/Go2pX8dusrt/W+KWH1ncn8jcd8uCQuvXb/fXA==", + "dependencies": { + "@types/unist": "^2.0.0", + "css-selector-parser": "^1.0.0", + "nth-check": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-select/node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/cli-boxes": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/update-notifier/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/widest-line": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" + }, + "node_modules/url": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-resize-observer": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "@juggle/resize-observer": "^3.3.1" + }, + "peerDependencies": { + "react": "16.8.0 - 18", + "react-dom": "16.8.0 - 18" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util": { + "version": "0.12.4", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==" + }, + "node_modules/validate.io-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" + } + }, + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + }, + "node_modules/value-equal": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vlq": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "node_modules/wait-on": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.76.3", + "license": "MIT", + "dependencies": { + "@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" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.8.0", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.8.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.9", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.13.1", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.8.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.8.0", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.17", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", + "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/wolfy87-eventemitter": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.2.9.tgz", + "integrity": "sha512-P+6vtWyuDw+MB01X7UeF8TaHBvbCovf4HPEMF/SV7BdDc1SMTiBy13SRD71lQh4ExFTG1d/WNzDGDCyOKSMblw==" + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-formatter": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz", + "integrity": "sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw==", + "dependencies": { + "xml-parser-xo": "^3.2.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xml-parser-xo": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz", + "integrity": "sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "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 + } + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/v2/package.json b/v2/package.json new file mode 100644 index 0000000..3ee87fe --- /dev/null +++ b/v2/package.json @@ -0,0 +1,95 @@ +{ + "name": "novorender-api-docs", + "version": "0.0.0", + "private": true, + "engines": { + "node": ">=16.14" + }, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "npm run validate-snippets && docusaurus build --out-dir ../build/v2", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc", + "validate:json-config": "ajv validate -s scene-screenshot-gen/schema.json -d scene-screenshot-gen/config.json", + "gen:demo-screenshots": "tsc -p scene-screenshot-gen/tsconfig.json && node scene-screenshot-gen/index.js", + "validate-and-gen": "npm run validate:json-config && npm run gen:demos-screenshots --", + "validate-snippets": "npx --no-install tsc -p demo-snippets/tsconfig.json", + "prepare": "husky install", + "lint": "eslint src/ demo-snippets/ --max-warnings=0" + }, + "dependencies": { + "@cmfcmf/docusaurus-search-local": "1.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/preset-classic": "2.4.1", + "@docusaurus/theme-live-codeblock": "2.4.1", + "@fortawesome/fontawesome-svg-core": "6.4.0", + "@fortawesome/free-solid-svg-icons": "6.4.0", + "@fortawesome/react-fontawesome": "0.2.0", + "@mdx-js/react": "1.6.22", + "@monaco-editor/react": "4.5.1", + "@novorender/data-js-api": "0.2.25", + "@novorender/measure-api": "0.0.143", + "@novorender/web_app": "^0.1.31", + "@novorender/webgl-api": "0.4.59", + "@stoplight/elements": "7.7.18", + "allotment": "1.19.2", + "clsx": "1.2.1", + "monaco-editor": "0.40.0", + "raw-loader": "4.0.2", + "react": "17.0.2", + "react-dom": "17.0.2", + "react-tiny-popover": "7.2.4", + "react-transition-group": "4.4.5" + }, + "devDependencies": { + "@docusaurus/eslint-plugin": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@tsconfig/docusaurus": "1.0.6", + "@tsconfig/node16": "1.0.3", + "@types/puppeteer": "5.4.6", + "@typescript-eslint/eslint-plugin": "^5.54.0", + "@typescript-eslint/parser": "^5.54.0", + "ajv-cli": "5.0.0", + "buffer": "6.0.3", + "copy-webpack-plugin": "11.0.0", + "css-minimizer-webpack-plugin": "4.1.0", + "docusaurus-plugin-typedoc": "0.19.2", + "eslint": "^8.35.0", + "eslint-config-prettier": "^8.7.0", + "eslint-plugin-react": "^7.32.2", + "husky": "8.0.3", + "lint-staged": "13.2.3", + "path-browserify": "1.0.1", + "process": "0.11.10", + "puppeteer": "13.5.2", + "stream-browserify": "3.0.0", + "string_decoder": "1.3.0", + "typedoc": "0.24.8", + "typedoc-plugin-markdown": "3.15.4", + "typescript": "4.9.4", + "url": "0.11.0", + "util": "0.12.4", + "yargs": "17.4.1" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "lint-staged": { + "**/*": "npx prettier --write --ignore-unknown" + } +} diff --git a/v2/sidebars.js b/v2/sidebars.js new file mode 100644 index 0000000..a4fd16f --- /dev/null +++ b/v2/sidebars.js @@ -0,0 +1,71 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + mainSidebar: [ + { + type: "category", + label: "Documentation", + link: { + type: "generated-index", + title: "Docs", + description: "Learn more about the Novorender's open source APIs", + }, + collapsed: false, + items: [ + { + type: "category", + label: "WebGL API", + link: { + type: "doc", + id: "webgl-api/index", + }, + items: [{ type: "autogenerated", dirName: "webgl-api" }], + }, + { + type: "category", + label: "Data JS API", + link: { + type: "doc", + id: "data-js-api/index", + }, + items: [{ type: "autogenerated", dirName: "data-js-api" }], + }, + { + type: "category", + label: "Measure API", + link: { + type: "doc", + id: "measure-api/index", + }, + items: [{ type: "autogenerated", dirName: "measure-api" }], + }, + { + type: "category", + label: "Tutorials", + link: { + type: "generated-index", + title: "Tutorials", + description: "Learn more about the different features and techniques.", + }, + items: [{ type: "autogenerated", dirName: "tutorials" }], + }, + { type: "link", label: "Data Rest API", href: "/data-rest-api" }, + ], + }, + ], +}; + +module.exports = sidebars; diff --git a/v2/src/components/MonacoWrapper/index.styles.css b/v2/src/components/MonacoWrapper/index.styles.css new file mode 100644 index 0000000..670187b --- /dev/null +++ b/v2/src/components/MonacoWrapper/index.styles.css @@ -0,0 +1,89 @@ +.editor-svg-icon { + fill: var(--ifm-color-primary); +} + +.editor-svg-icon path { + transform: scale(0.035); +} + +.popover-content { + background: var(--ifm-navbar-background-color); + padding: 5px; + border: 1px solid var(--ifm-color-gray-800); + font-size: 12px; + border-radius: 4px; + box-shadow: var(--ifm-global-shadow-lw); +} + +.popover-content > p { + color: var(--ifm-color-gray-800); + font-size: 12px; + margin: 0; +} + +.popover-content hr { + margin: 5px 0; +} + +.editor-config-dropdown { +} + +.editor-config-dropdown hr { + margin-top: 8px; + margin-bottom: 0px; + background: var(--ifm-color-gray-800); +} + +.editor-config-dropdown > li > span { + font-size: 10px; +} + +.editor-config-dropdown > li > div { + display: flex; + justify-content: center; + align-items: center; +} + +.editor-config-dropdown > li > div .font-size-button { + padding: 5px; + margin-right: 5px; + border-radius: 50%; + width: 25px; + font-size: 12px; + height: 25px; + line-height: 1; +} + +.editor-config-dropdown > li > div .hidden-areas-toggle-button { + padding: 5px; + margin-right: 5px; + font-size: 12; + line-height: 1; +} + +.playground_navbar { + padding-top: 0; + padding-bottom: 0; + height: 36px; + margin-bottom: 5px; +} + +.playground_footer_navbar { + padding-top: 0; + padding-bottom: 0; + height: 26px; + margin-top: 5px; +} + +.editor-error-alert { + position: absolute; + bottom: 0; + right: 30px; + max-width: 600px; +} + +.renderer-loading-message { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/v2/src/components/MonacoWrapper/index.tsx b/v2/src/components/MonacoWrapper/index.tsx new file mode 100644 index 0000000..e23f6a0 --- /dev/null +++ b/v2/src/components/MonacoWrapper/index.tsx @@ -0,0 +1,687 @@ +import React, { Fragment, useEffect, useRef, useState } from "react"; +import BrowserOnly from "@docusaurus/BrowserOnly"; +import { useColorMode } from "@docusaurus/theme-common"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import Link from "@docusaurus/Link"; +import { useHistory } from "@docusaurus/router"; +import Editor, { Monaco, useMonaco } from "@monaco-editor/react"; +import { editor } from "monaco-editor"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import Admonition from "@theme/Admonition"; +import { Allotment } from "allotment"; +import { Popover } from "react-tiny-popover"; +import Renderer from "@site/src/components/Renderer"; +import Spinner from "@site/src/components/misc/spinner"; +const { devDependencies } = require("../../../package.json"); + +/** CSS */ +import "./index.styles.css"; +import "allotment/dist/style.css"; +/** CSS END */ + +/** Icons */ +import RotationIconSvg from "@site/static/img/landscape-portrait.svg"; +import { faSquareArrowUpRight, faUpRightAndDownLeftFromCenter, faDownload, faCopy, faPenToSquare, faCircleInfo, faCode, faSlash, faGear } from "@fortawesome/free-solid-svg-icons"; +/** Icons END */ + +// @ts-expect-error +import WebglDTS from "!!raw-loader!@site/node_modules/@novorender/webgl-api/index.d.ts"; +// @ts-expect-error +import DataJsApiDTS from "!!raw-loader!@site/node_modules/@novorender/data-js-api/index.d.ts"; +// @ts-expect-error +import MeasureApiDTS from "!!raw-loader!@site/node_modules/@novorender/measure-api/index.d.ts"; +// @ts-expect-error +import WebAppDTS from "!!raw-loader!@site/node_modules/@novorender/web_app/index.d.ts"; +// @ts-expect-error +import GlMatrixDTS from "!!raw-loader!@site/node_modules/gl-matrix/index.d.ts"; +import * as MeasureAPI from "@novorender/measure-api"; +import * as DataJsAPI from "@novorender/data-js-api"; +import * as GlMatrix from "gl-matrix"; + +/** Types */ +import type { API } from "@novorender/webgl-api"; +import type { IDempProps } from "@site/demo-snippets/misc"; +/** Types END */ + +export interface IParams { + webglAPI: API; + measureAPI: typeof MeasureAPI; + dataJsAPI: typeof DataJsAPI; + glMatrix: typeof GlMatrix; + primaryCanvas: HTMLCanvasElement; + canvas2D: HTMLCanvasElement; +} + +// the namespace from the original index.d.ts needs replacing +// or Monaco doesn't like it +const dts_fixed = WebglDTS.replace(`"@novorender/webgl-api"`, "NovoRender"); +// const dts_fixed_measure_api = MeasureApiDTS.replace(`"@novorender/measure-api"`, "NovoRender1") + +/** + * @todo move to separate file + */ +function useDebounce(value: T, delay?: number): T { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const timer = setTimeout(() => setDebouncedValue(value), delay || 500); + + return () => { + clearTimeout(timer); + }; + }, [value, delay]); + + return debouncedValue; +} + +const editorOptions: editor.IEditorConstructionOptions = { + minimap: { enabled: false }, + formatOnPaste: true, + formatOnType: true, + scrollBeyondLastLine: false, + automaticLayout: true, + contextmenu: false, + folding: false, + showFoldingControls: "never", + guides: { indentation: true }, + fixedOverflowWidgets: true, + lineNumbers: "off", +}; + +export default function MonacoWrapper({ code, demoName, dirName, description, editorConfig, editUrl }: IDempProps): JSX.Element { + const monaco = useMonaco(); + const { siteConfig } = useDocusaurusContext(); + const { colorMode } = useColorMode(); + const history = useHistory(); + const editorInstance = useRef(null); + const textAreaInstance = useRef(null); + const editorFooterInstance = useRef(); + const editorNavbarInstance = useRef(); + const [codeOutput, setCodeOutput] = useState(null); + const [codeError, setCodeError] = useState(null); + const [initialCode, setInitialCode] = useState(null); + const [tsCodeForClipboard, setTsCodeForClipboard] = useState(initialCode); + const [theme, setTheme] = useState<"light" | "vs-dark" | "">(""); + const [isActivity, setIsActivity] = useState(false); + const [canvasRef, setCanvasRef] = useState(null); + const [canvasWrapperRef, setCanvasWrapperRef] = useState(null); + const [api, setApiInstance] = useState(); // Create API + const [measureApiInstance, setMeasureApiInstance] = useState(); // Measure API + const [splitPaneDirectionVertical, setSplitPaneDirectionVertical] = useState(true); // Direction to split. If true then the panes will be stacked vertically, otherwise they will be stacked horizontally. + const [force_rerender_allotment, set_force_rerender_allotment] = useState(true); // allotment doesn't support dynamically changing pane positions so we must force re-render the component so it recalculates the size + const [editorHeight, setEditorHeight] = useState(editorConfig.mode === "inline" ? (innerHeight * 80) / 100 / 2 : innerHeight / 2 - 68); // minus editor top-bar and footer height + const [rendererHeight, setRendererHeight] = useState(editorConfig.mode === "inline" ? (innerHeight * 80) / 100 / 2 : innerHeight / 2 - 68); // minus editor top-bar and footer height + const [rendererPaneWidth, setRendererPaneWidth] = useState(); + const [isDemoDescPopoverOpen, setIsDemoDescPopoverOpen] = useState(false); + const [isMessagesAndAlertPopoverOpen, setIsMessagesAndAlertPopoverOpen] = useState(false); + const [messagesAndAlerts, setMessagesAndAlerts] = useState([]); + const [main, setMain] = useState(); + const [isHiddenAreasShowing, setIsHiddenAreasShowing] = useState(false); + const main_debounced = useDebounce(codeOutput, 1000); + const [hasMainChanged, setHasMainChanged] = useState(false); + const [fontSize, setFontSize] = useState(); + + useEffect(() => { + console.log("playgroundConfig ", editorConfig); + + if (code) { + setInitialCode(code); + setTsCodeForClipboard(code); // for clipboard copy + } + }, [code]); + + /** + * @description transpile and return js string + * @param editor Editor instance + * @param monaco Monaco Instance + * @returns transpiled output as string + */ + const returnTranspiledOutput = async (editor, monaco: Monaco): Promise => { + try { + const model = editor.getModel()!; + const uri = model.uri; + const worker = await monaco.languages.typescript.getTypeScriptWorker(); + const languageService = await worker(uri); + const result = await languageService.getEmitOutput(uri.toString()); + return result.outputFiles[0].text; + } catch (error) { + console.log("Failed to get transpiled output, details ==> ", error); + } + }; + + /** + * @description extract and return render config + * @param transpiledOutput string that contains config + * @returns RenderConfig + */ + const returnRenderConfigFromOutput = async (transpiledOutput: string): Promise<{ main: () => void; showTip?: () => void }> => { + const encodedJs = encodeURIComponent(transpiledOutput); + const dataUri = `data:text/javascript;charset=utf-8,${encodedJs}`; + const { main, showTip } = await import(/* webpackIgnore: true */ dataUri); + + console.log("main ==> ", main); + + return { main, showTip }; + }; + + const codeChangeHandler = async (tsCode: string) => { + setIsActivity(true); // toggle spinner. + setTsCodeForClipboard(tsCode); // for clipboard copy + const output = await returnTranspiledOutput(editorInstance.current, monaco); + + console.log("output ", output); + + // compare current output with previous output to check if anything has + // been changed. + if (codeOutput && JSON.stringify(codeOutput) === JSON.stringify(output)) { + console.log("[INFO]: Code hasn't been changed, returning."); + setIsActivity(false); // toggle spinner. + return false; + } + + // set current output in state so we can compare later + setCodeOutput(output); + setHasMainChanged(true); + }; + + useEffect(() => { + if (main_debounced) { + (async () => { + const { main } = await returnRenderConfigFromOutput(codeOutput); + if (main) { + // first reset `main` so the react forces + // the component to remount which then creates + // everything again (the view, scene etc...) + setMain(() => null); + + // set the main again + setMain(() => main); + } + setIsActivity(false); // toggle spinner. + })(); + } + }, [main_debounced]); + + useEffect(() => { + let unblock; + if (hasMainChanged) { + // Block navigation and register a callback that + // fires when a navigation attempt is blocked. + unblock = history.block((tx) => { + // Navigation was blocked! Let's show a confirmation dialog + // so the user can decide if they actually want to navigate + // away and discard changes they've made in the current page. + if (window.confirm("Are you sure you want to leave this page? changes you made could be lost.")) { + return unblock(); + } + return false; + }); + window.addEventListener("beforeunload", unloadEventHandler); + } + + return () => { + window.removeEventListener("beforeunload", unloadEventHandler); + if (unblock) { + unblock(); + } + }; + }, [hasMainChanged]); + + useEffect(() => { + (async () => { + // import dynamically for SSR + const api = await import("@novorender/webgl-api"); + const measureApi = await import("@novorender/measure-api"); + + setApiInstance(api); + setMeasureApiInstance(measureApi); + + const apiInstance = api.createAPI(); + + if (!apiInstance["supportsOffscreenCanvas"]) { + setMessagesAndAlerts([...messagesAndAlerts, "⚠ OffscreenCanvas is not supported in this browser."]); + } + })(); + + return () => { + window.removeEventListener("beforeunload", unloadEventHandler); + }; + }, []); + + const unloadEventHandler = (e) => { + if (hasMainChanged) { + e.preventDefault(); + return (e.returnValue = ""); + } + }; + + // handle editor theme based on docusaurus colorMode. + useEffect(() => { + setTheme(colorMode === "dark" ? "vs-dark" : "light"); + }, [colorMode]); + + useEffect(() => { + if (monaco) { + // Add additional d.ts files to the JavaScript language service and change. + // Also change the default compilation options. + // The sample below shows how a class Facts is declared and introduced + // to the system and how the compiler is told to use ES6 (target=2). + + // validation settings + // monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({ + // noSemanticValidation: true, + // noSyntaxValidation: false + // }); + + // compiler options + // monaco.languages.typescript.typescriptDefaults.setCompilerOptions({ + // // moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs, + // // allowSyntheticDefaultImports: true, + // moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs, + // module: monaco.languages.typescript.ModuleKind.ESNext, + // allowNonTsExtensions: true, + // // baseUrl: '.', + // // paths: { "@/*": ['node_modules/*'] }, + // target: monaco.languages.typescript.ScriptTarget.Latest + // }); + + const libUri = "index.d.ts"; + + const dtss = `declare module "@novorender/web_app" { + ${WebAppDTS} + }`; + + monaco.languages.typescript.typescriptDefaults.addExtraLib(WebglDTS + dts_fixed + MeasureApiDTS + GlMatrixDTS + DataJsApiDTS + dtss, libUri); + + // monaco.languages.typescript.typescriptDefaults.addExtraLib(WebAppDTS); + monaco.languages.typescript.typescriptDefaults.addExtraLib( + `/** + * @description opens an alert that displays provided content + * @param content string to show in the alert + */ + declare function openAlert(content:string, type: 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'danger' = 'info'):void + + /** + * @description opens a pane in bottom left of renderer to show any text + * @param content string to show in the info pane + */ + declare function openInfoPane(content: object | string | any, title?: string): void;` + ); + + // monaco.languages.typescript.typescriptDefaults.addExtraLib( + // GlMatrixDTS, + // 'file:///node_modules/gl-matrix/index.d.ts' + // ); + + // When resolving definitions and references, the editor will try to use created models. + // Creating a model for the library allows "peek definition/references" commands to work with the library. + if (!monaco.editor.getModel(monaco.Uri.parse(libUri))) { + monaco.editor.createModel(WebglDTS + dts_fixed + MeasureApiDTS + GlMatrixDTS + DataJsApiDTS + dtss, "typescript", monaco.Uri.parse(libUri)); + } + } + }, [monaco]); + + function handleEditorWillMount(monaco) { + configureFontSize(); + } + + function configureFontSize(size?: number): void { + const lsKey = "playground.fontSize"; + const fontSize = size || Number(localStorage.getItem(lsKey)) || 14; // default font-size 14; + localStorage.setItem(lsKey, fontSize.toString()); + setFontSize(fontSize); + } + + async function handleEditorDidMount(editor: editor.ICodeEditor, monaco: Monaco) { + setIsActivity(true); // toggle spinner + editorInstance.current = editor; + + // hide hidden ranges upon init + toggleHiddenAreas(isHiddenAreasShowing, editor, monaco); + + const model = editor.getModel(); + // highlight ranges based on comments "\\ HighlightedRangeStarted \\ HighlightRangeEnded" + const rangesToHighlight = model.findMatches("//\\s*HighlightedRangeStarted\n([\\s\\S\\n]*?)//\\s*HighlightedRangeEnded", false, true, false, null, true); + if (rangesToHighlight && rangesToHighlight.length) { + let _rangesToHighlight = []; + let _rangesToRemove = []; + + rangesToHighlight.map((r) => { + _rangesToHighlight.push({ + range: new monaco.Range(r.range.startLineNumber === 0 ? r.range.startLineNumber : r.range.startLineNumber + 1, 0, r.range.endLineNumber - 1, 0), + options: { + inlineClassName: "playground-monaco-inline-decoration", + isWholeLine: true, + }, + }); + _rangesToRemove.push( + { + range: new monaco.Range(r.range.startLineNumber, 0, r.range.startLineNumber + 1, 0), + text: null, + }, + { + range: new monaco.Range(r.range.endLineNumber, 0, r.range.endLineNumber + 1, 0), + text: null, + } + ); + }); + + editor.deltaDecorations([], _rangesToHighlight); + model.applyEdits(_rangesToRemove); + } + + await editor.getAction("editor.action.formatDocument").run(); + if (editorConfig.cursorPosition) { + editor.setPosition(editorConfig.cursorPosition); + } + if (editorConfig.revealLine) { + editor.revealLineNearTop(editorConfig.revealLine); + } + const output = await returnTranspiledOutput(editor, monaco); + setCodeOutput(output); + const { main, showTip } = await returnRenderConfigFromOutput(output); + + if (showTip) { + try { + showTip(); + } catch (error) { + console.error("An error occurred while trying to execute showTip"); + } + } + + if (main) { + setMain(() => main); + } + + setIsActivity(false); // toggle spinner + } + + // toggle hidden areas in the editor + function toggleHiddenAreas(show: boolean, editor: editor.ICodeEditor, monacoInstance: Monaco): void { + if (show) { + // @ts-expect-error + editor.setHiddenAreas([]); + } else { + const model = editor.getModel(); + // hide ranges based on comments "\\ HiddenRangeStarted \\ HiddenRangeEnded" + const rangesToHide = model.findMatches("//\\s*HiddenRangeStarted\n([\\s\\S\\n]*?)//\\s*HiddenRangeEnded", false, true, false, null, true); + console.log("rangesToHide ", rangesToHide); + if (rangesToHide && rangesToHide.length) { + // @ts-expect-error + editor.setHiddenAreas(rangesToHide.map((r) => new monacoInstance.Range(r.range.startLineNumber, 0, r.range.endLineNumber, 0))); + } + } + + setIsHiddenAreasShowing(show); + } + + function handleEditorValidation(markers) { + console.log("markers ", markers); + + if (markers.length && markers[0].severity > 1) { + console.log("diags ", markers[0]); + const diagnostic = markers[0]; + setCodeError(diagnostic); + } else { + setCodeError(null); + } + } + + // copy the current code output to clipboard + function copyToClipboard() { + textAreaInstance.current.select(); + document.execCommand("copy"); + } + + // download the contents of current canvas as image + function downloadCanvasAsImage(): void { + let link = document.createElement("a"); + link.download = `${demoName}.png`; + link.href = canvasRef.toDataURL(); + link.click(); + link.remove(); + } + + // change split pane mode to vertical or horizontal + function changeSplitPaneRotation(): void { + set_force_rerender_allotment(false); // hide the allotment component + setSplitPaneDirectionVertical(!splitPaneDirectionVertical); // update position + setTimeout(() => { + set_force_rerender_allotment(true); // render the allotment component again + }, 50); + } + + // toggle canvas fullscreen mode + function toggleCanvasFullscreenMode(): void { + canvasWrapperRef.requestFullscreen().catch((e) => { + console.log("Failed to request fullscreen => ", e); + alert("Failed to expand canvas"); + }); + } + + return ( + + {() => ( + + + +
+ {force_rerender_allotment && ( + ) => { + if (e?.length > 1) { + if (splitPaneDirectionVertical) { + setEditorHeight(e[0]); + setRendererHeight(e[1]); + } else { + setRendererPaneWidth(e[1]); + } + } + }} + > +
+ + {codeError && ( +
+ +

{codeError.message}

+
+
+ )} +
+ {main ? ( + setMessagesAndAlerts(Array.from(new Set([...messagesAndAlerts, m])))} + splitPaneDirectionVertical={splitPaneDirectionVertical} + /> + ) : ( +
+ Loading the renderer... +
+ )} +
+ )} +
+