Repository: vanilla-extract-css/vanilla-extract
Pull request #1030 (2023-03-08 03:54:08)

Add `createCompiler` to integration package
This PR adds a new compiler to the integration package, powered by [vite-node](https://www.npmjs.com/package/vite-node).

This allows us to cache results across builds which can dramatically improve build performance, particularly for esbuild consumers since it doesn't automatically manage caching of plugins.

I've also added a new esbuild plugin that makes use of the new compiler, but it's been marked as private for now. This allows us to run tests and fixtures against the new plugin without forcing us to release it immediately. In the meantime, since Remix uses `@vanilla-extract/integration` directly, Remix will be able to roll out the new Vanilla Extract compiler immediately without waiting for all official plugins to be migrated.

You can run a fixture against the new compiler like this:

```
pnpm build
pnpm start-fixture themed --type=esbuild-next
```

changeset-bot[bot]: ###  🦋  Changeset detected

Latest commit: 57293218a3a5e2d223c58c9f0fc0136fa4dbc4df

**The changes in this PR will be included in the next version bump.**

<details><summary>This PR includes changesets to release 11 packages</summary>

  | Name                                  | Type  |
| ------------------------------------- | ----- |
| @vanilla-extract/css                  | Minor |
| @vanilla-extract/esbuild-plugin       | Patch |
| @vanilla-extract/integration          | Minor |
| @vanilla-extract/jest-transform       | Patch |
| @fixtures/features                    | Patch |
| @fixtures/low-level                   | Patch |
| @fixtures/recipes                     | Patch |
| @fixtures/sprinkles                   | Patch |
| @fixtures/themed                      | Patch |
| @fixtures/unused-modules              | Patch |
| vanilla-extract-example-webpack-react | Patch |

</details>

Not sure what this means? [Click here  to learn what changesets are](https://github.com/changesets/changesets/blob/master/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/vanilla-extract-css/vanilla-extract/new/create-compiler-api?filename=.changeset/good-gorillas-stare.md&value=---%0A%22%40vanilla-extract%2Fcss%22%3A%20patch%0A%22%40vanilla-extract%2Fesbuild-plugin-next%22%3A%20patch%0A%22%40vanilla-extract%2Fesbuild-plugin%22%3A%20patch%0A%22%40vanilla-extract%2Fintegration%22%3A%20patch%0A%22%40vanilla-extract%2Fjest-transform%22%3A%20patch%0A%22%40vanilla-extract%2Frollup-plugin%22%3A%20patch%0A%22%40vanilla-extract%2Fvite-plugin%22%3A%20patch%0A%22%40vanilla-extract-private%2Ftest-helpers%22%3A%20patch%0A---%0A%0AAdd%20%60createCompiler%60%20function%0A)



Patch:
diff --git a/.changeset/khaki-years-stare.md b/.changeset/khaki-years-stare.md
new file mode 100644
index 0000000..d9ca4e6
--- /dev/null
+++ b/.changeset/khaki-years-stare.md
@@ -0,0 +1,5 @@
+---
+'@vanilla-extract/css': minor
+---
+
+Provide current file scope as an additional argument to the adapter methods `registerClassName` and `registerComposition`. This is to allow fine-grained caching of registered class names and class compositions per file.
diff --git a/.changeset/large-rabbits-grow.md b/.changeset/large-rabbits-grow.md
new file mode 100644
index 0000000..ea90951
--- /dev/null
+++ b/.changeset/large-rabbits-grow.md
@@ -0,0 +1,5 @@
+---
+'@vanilla-extract/css': patch
+---
+
+Throw when `setAdapter` is called with a falsy value
diff --git a/.changeset/silent-roses-impress.md b/.changeset/silent-roses-impress.md
new file mode 100644
index 0000000..442bb53
--- /dev/null
+++ b/.changeset/silent-roses-impress.md
@@ -0,0 +1,7 @@
+---
+'@vanilla-extract/esbuild-plugin': patch
+'@vanilla-extract/integration': patch
+'@vanilla-extract/jest-transform': patch
+---
+
+Bump esbuild to v0.17.6
diff --git a/.changeset/slow-carrots-itch.md b/.changeset/slow-carrots-itch.md
new file mode 100644
index 0000000..28468c5
--- /dev/null
+++ b/.changeset/slow-carrots-itch.md
@@ -0,0 +1,5 @@
+---
+'@vanilla-extract/integration': minor
+---
+
+Add `createCompiler` function for creating a compiler instance that can be re-used between builds. This is a low-level function intended for use by bundler plugins and, as such, is currently undocumented. Note that in order to use the new compiler you must also update `@vanilla-extract/css` to v1.10.0.
diff --git a/.changeset/tender-snakes-occur.md b/.changeset/tender-snakes-occur.md
new file mode 100644
index 0000000..c68b194
--- /dev/null
+++ b/.changeset/tender-snakes-occur.md
@@ -0,0 +1,5 @@
+---
+'@vanilla-extract/integration': minor
+---
+
+Add support for `onBeginFileScope` adapter lifecycle hook
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index a46018b..c14982a 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -35,8 +35,39 @@ jobs:
       - name: Lint
         run: pnpm lint
 
-      - name: Test
-        run: pnpm test:jest
+      - name: Unit Test
+        run: pnpm test:unit
+  windows-test:
+    strategy:
+      matrix:
+        # Blank string allows us to test against version in nvmrc file
+        # configured in 'Set up Node.js' down below.
+        node: [''] # Add 'lts/*' to this list when ready
+    name: Windows Tests (${{ (matrix.node && matrix.node != 'lts/*') && format('node {0}', matrix.node) || matrix.node || 'nvmrc' }})
+    runs-on: windows-latest
+    env:
+      CI: true
+    steps:
+      - name: Checkout Repo
+        uses: actions/checkout@main
+
+      - uses: pnpm/action-setup@v2
+
+      - name: Set up Node.js
+        uses: actions/setup-node@main
+        with:
+          node-version: ${{ matrix.node }}
+          node-version-file: ${{ matrix.node == '' && '.nvmrc' || '' }}
+          cache: 'pnpm'
+
+      - name: Install Dependencies
+        run: pnpm i
+
+      - name: Build
+        run: pnpm build
+
+      - name: Unit Test
+        run: pnpm test:unit
   playwright:
     name: Playwright tests
     runs-on: macos-11
diff --git a/jest.config.js b/jest.config.js
index 5c2aaf0..fb5bb70 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -4,6 +4,6 @@ module.exports = {
     '\\.css\\.ts$': '@vanilla-extract/jest-transform',
     '\\.tsx?$': ['babel-jest', { configFile: './babel-jest.config.js' }],
   },
-  testMatch: ['**/?(*.)+(test).[jt]s?(x)'],
+  testMatch: ['**/?(*.)+(test).[jt]s?(x)', '!**/*.vitest.test*'],
   testTimeout: 10000,
 };
diff --git a/package.json b/package.json
index e9417c9..1f818a3 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,9 @@
     "start": "pnpm start-fixture themed",
     "start-site": "pnpm --filter=site start",
     "build-site": "pnpm --filter=site build",
+    "test:unit": "pnpm test:jest && pnpm test:vitest",
     "test:jest": "jest",
+    "test:vitest": "vitest --watch=false",
     "test:playwright": "playwright test",
     "format": "prettier --write .",
     "lint": "manypkg check && prettier --check . && tsc",
@@ -55,7 +57,8 @@
     "rollup-plugin-dts": "^4.2.2",
     "rollup-plugin-node-externals": "^5.0.0",
     "ts-node": "^10.0.0",
-    "typescript": "^4.9.4"
+    "typescript": "^4.9.4",
+    "vitest": "^0.28.5"
   },
   "packageManager": "pnpm@7.9.5",
   "pnpm": {
diff --git a/packages/css/src/adapter.ts b/packages/css/src/adapter.ts
index 67b99c7..646cee0 100644
--- a/packages/css/src/adapter.ts
+++ b/packages/css/src/adapter.ts
@@ -29,6 +29,10 @@ export const setAdapterIfNotSet = (newAdapter: Adapter) => {
 };
 
 export const setAdapter = (newAdapter: Adapter) => {
+  if (!newAdapter) {
+    throw new Error('No adapter provided when calling "setAdapter"');
+  }
+
   hasConfiguredAdapter = true;
 
   adapterStack.push(newAdapter);
@@ -58,6 +62,12 @@ export const markCompositionUsed: Adapter['markCompositionUsed'] = (
   return currentAdapter().markCompositionUsed(...props);
 };
 
+export const onBeginFileScope: NonNullable<Adapter['onBeginFileScope']> = (
+  ...props
+) => {
+  return currentAdapter().onBeginFileScope?.(...props);
+};
+
 export const onEndFileScope: Adapter['onEndFileScope'] = (...props) => {
   return currentAdapter().onEndFileScope(...props);
 };
diff --git a/packages/css/src/fileScope.ts b/packages/css/src/fileScope.ts
index 324c33b..cc04b13 100644
--- a/packages/css/src/fileScope.ts
+++ b/packages/css/src/fileScope.ts
@@ -1,5 +1,5 @@
 import outdent from 'outdent';
-import { onEndFileScope } from './adapter';
+import { onBeginFileScope, onEndFileScope } from './adapter';
 import type { FileScope } from './types';
 
 let refCounter = 0;
@@ -8,10 +8,12 @@ const fileScopes: Array<FileScope> = [];
 
 export function setFileScope(filePath: string, packageName?: string) {
   refCounter = 0;
-  fileScopes.unshift({
+  const fileScope = {
     filePath,
     packageName,
-  });
+  };
+  fileScopes.unshift(fileScope);
+  onBeginFileScope(fileScope);
 }
 
 export function endFileScope() {
diff --git a/packages/css/src/style.ts b/packages/css/src/style.ts
index a10d087..abb719c 100644
--- a/packages/css/src/style.ts
+++ b/packages/css/src/style.ts
@@ -22,7 +22,7 @@ import { dudupeAndJoinClassList } from './utils';
 
 function composedStyle(rules: Array<StyleRule | ClassNames>, debugId?: string) {
   const className = generateIdentifier(debugId);
-  registerClassName(className);
+  registerClassName(className, getFileScope());
 
   const classList = [];
   const styleRules = [];
@@ -40,10 +40,13 @@ function composedStyle(rules: Array<StyleRule | ClassNames>, debugId?: string) {
   if (classList.length > 0) {
     result = `${className} ${dudupeAndJoinClassList(classList)}`;
 
-    registerComposition({
-      identifier: className,
-      classList: result,
-    });
+    registerComposition(
+      {
+        identifier: className,
+        classList: result,
+      },
+      getFileScope(),
+    );
 
     if (styleRules.length > 0) {
       // If there are styles attached to this composition then it is
@@ -71,7 +74,7 @@ export function style(rule: ComplexStyleRule, debugId?: string) {
 
   const className = generateIdentifier(debugId);
 
-  registerClassName(className);
+  registerClassName(className, getFileScope());
   appendCss({ type: 'local', selector: className, rule }, getFileScope());
 
   return className;
diff --git a/packages/css/src/theme.ts b/packages/css/src/theme.ts
index 0fff0b5..9e281df 100644
--- a/packages/css/src/theme.ts
+++ b/packages/css/src/theme.ts
@@ -55,7 +55,7 @@ export function createTheme(arg1: any, arg2?: any, arg3?: string): any {
     typeof arg2 === 'object' ? arg3 : arg2,
   );
 
-  registerClassName(themeClassName);
+  registerClassName(themeClassName, getFileScope());
 
   const vars =
     typeof arg2 === 'object'
diff --git a/packages/css/src/types.ts b/packages/css/src/types.ts
index 5f00384..9e4a5fa 100644
--- a/packages/css/src/types.ts
+++ b/packages/css/src/types.ts
@@ -132,9 +132,10 @@ export interface Composition {
 type IdentOption = 'short' | 'debug';
 export interface Adapter {
   appendCss: (css: CSS, fileScope: FileScope) => void;
-  registerClassName: (className: string) => void;
-  registerComposition: (composition: Composition) => void;
+  registerClassName: (className: string, fileScope: FileScope) => void;
+  registerComposition: (composition: Composition, fileScope: FileScope) => void;
   markCompositionUsed: (identifier: string) => void;
+  onBeginFileScope?: (fileScope: FileScope) => void;
   onEndFileScope: (fileScope: FileScope) => void;
   getIdentOption: () => IdentOption;
 }
diff --git a/packages/esbuild-plugin-next/package.json b/packages/esbuild-plugin-next/package.json
new file mode 100644
index 0000000..005568c
--- /dev/null
+++ b/packages/esbuild-plugin-next/package.json
@@ -0,0 +1,24 @@
+{
+  "private": true,
+  "name": "@vanilla-extract/esbuild-plugin-next",
+  "version": "0.0.0",
+  "description": "Zero-runtime Stylesheets-in-TypeScript",
+  "main": "dist/vanilla-extract-esbuild-plugin-next.cjs.js",
+  "module": "dist/vanilla-extract-esbuild-plugin-next.esm.js",
+  "files": [
+    "/dist"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/vanilla-extract-css/vanilla-extract.git",
+    "directory": "packages/esbuild-plugin-next"
+  },
+  "author": "SEEK",
+  "license": "MIT",
+  "dependencies": {
+    "@vanilla-extract/integration": "^6.0.2"
+  },
+  "devDependencies": {
+    "esbuild": "0.17.6"
+  }
+}
diff --git a/packages/esbuild-plugin-next/src/index.ts b/packages/esbuild-plugin-next/src/index.ts
new file mode 100644
index 0000000..1d0f9bd
--- /dev/null
+++ b/packages/esbuild-plugin-next/src/index.ts
@@ -0,0 +1,85 @@
+import { dirname } from 'path';
+
+import {
+  cssFileFilter,
+  createCompiler,
+  vanillaExtractTransformPlugin,
+  IdentifierOption,
+  CreateCompilerOptions,
+} from '@vanilla-extract/integration';
+import type { Plugin } from 'esbuild';
+
+const vanillaCssNamespace = 'vanilla-extract-css-ns';
+
+interface VanillaExtractPluginOptions {
+  outputCss?: boolean;
+  runtime?: boolean;
+  processCss?: (css: string) => Promise<string>;
+  identifiers?: IdentifierOption;
+  compilerVitePlugins?: CreateCompilerOptions['vitePlugins'];
+}
+export function vanillaExtractPlugin({
+  outputCss = true,
+  runtime = false,
+  processCss,
+  identifiers: identOption,
+  compilerVitePlugins: vitePlugins,
+}: VanillaExtractPluginOptions = {}): Plugin {
+  if (runtime) {
+    // If using runtime CSS then just apply fileScopes and debug IDs to code
+    return vanillaExtractTransformPlugin({ identOption });
+  }
+
+  return {
+    name: 'vanilla-extract',
+    async setup(build) {
+      const root = build.initialOptions.absWorkingDir || process.cwd();
+      const identifiers =
+        identOption || (build.initialOptions.minify ? 'short' : 'debug');
+
+      const compiler = createCompiler({ root, identifiers, vitePlugins });
+
+      build.onDispose(async () => {
+        await compiler.close();
+      });
+
+      build.onResolve({ filter: /\.vanilla\.css/ }, (args) => {
+        return {
+          path: args.path,
+          namespace: vanillaCssNamespace,
+        };
+      });
+
+      build.onLoad(
+        { filter: /.*/, namespace: vanillaCssNamespace },
+        async ({ path }) => {
+          const [rootRelativePath] = path.split('.vanilla.css');
+
+          let { css, filePath } = compiler.getCssForFile(rootRelativePath);
+
+          if (typeof processCss === 'function') {
+            css = await processCss(css);
+          }
+
+          return {
+            contents: css,
+            loader: 'css',
+            resolveDir: dirname(filePath),
+          };
+        },
+      );
+
+      build.onLoad({ filter: cssFileFilter }, async ({ path }) => {
+        const { source, watchFiles } = await compiler.processVanillaFile(path, {
+          outputCss,
+        });
+
+        return {
+          contents: source,
+          loader: 'js',
+          watchFiles: Array.from(watchFiles),
+        };
+      });
+    },
+  };
+}
diff --git a/packages/esbuild-plugin/package.json b/packages/esbuild-plugin/package.json
index 2e5fbc5..0c0fb89 100644
--- a/packages/esbuild-plugin/package.json
+++ b/packages/esbuild-plugin/package.json
@@ -18,6 +18,6 @@
     "@vanilla-extract/integration": "^6.0.2"
   },
   "devDependencies": {
-    "esbuild": "^0.16.3"
+    "esbuild": "0.17.6"
   }
 }
diff --git a/packages/integration/package.json b/packages/integration/package.json
index eb75d4d..8d95f3a 100644
--- a/packages/integration/package.json
+++ b/packages/integration/package.json
@@ -18,13 +18,15 @@
     "@babel/plugin-syntax-typescript": "^7.20.0",
     "@vanilla-extract/babel-plugin-debug-ids": "^1.0.2",
     "@vanilla-extract/css": "^1.9.4",
-    "esbuild": "^0.16.3",
+    "esbuild": "0.17.6",
     "eval": "0.1.6",
     "find-up": "^5.0.0",
     "javascript-stringify": "^2.0.1",
     "lodash": "^4.17.21",
     "mlly": "^1.1.0",
-    "outdent": "^0.8.0"
+    "outdent": "^0.8.0",
+    "vite": "^4.1.4",
+    "vite-node": "^0.28.5"
   },
   "devDependencies": {
     "@types/babel__core": "^7.1.20",
diff --git a/packages/integration/src/addFileScope.ts b/packages/integration/src/addFileScope.ts
index 1ea7ef6..8e06d30 100644
--- a/packages/integration/src/addFileScope.ts
+++ b/packages/integration/src/addFileScope.ts
@@ -6,12 +6,14 @@ interface AddFileScopeParams {
   filePath: string;
   rootPath: string;
   packageName: string;
+  globalAdapterIdentifier?: string;
 }
 export function addFileScope({
   source,
   filePath,
   rootPath,
   packageName,
+  globalAdapterIdentifier,
 }: AddFileScopeParams) {
   // Encode windows file paths as posix
   const normalizedPath = posix.join(...relative(rootPath, filePath).split(sep));
@@ -26,18 +28,42 @@ export function addFileScope({
   const { hasESM, isMixed } = detectSyntax(source);
 
   if (hasESM && !isMixed) {
+    const setAdapterSnippet = globalAdapterIdentifier
+      ? `
+        import * as __vanilla_css_adapter__ from "@vanilla-extract/css/adapter";
+        __vanilla_css_adapter__.setAdapter(${globalAdapterIdentifier});
+      `
+      : '';
+    const removeAdapterSnippet = setAdapterSnippet
+      ? '__vanilla_css_adapter__.removeAdapter();'
+      : '';
+
     return `
+      ${setAdapterSnippet}
       import { setFileScope, endFileScope } from "@vanilla-extract/css/fileScope";
       setFileScope("${normalizedPath}", "${packageName}");
       ${source}
       endFileScope();
+      ${removeAdapterSnippet}
     `;
   }
 
+  const setAdapterSnippet = globalAdapterIdentifier
+    ? `
+      const __vanilla_css_adapter__ = require("@vanilla-extract/css/adapter");
+      __vanilla_css_adapter__.setAdapter(${globalAdapterIdentifier});
+    `
+    : '';
+  const removeAdapterSnippet = setAdapterSnippet
+    ? '__vanilla_css_adapter__.removeAdapter();'
+    : '';
+
   return `
+    ${setAdapterSnippet}
     const __vanilla_filescope__ = require("@vanilla-extract/css/fileScope");
     __vanilla_filescope__.setFileScope("${normalizedPath}", "${packageName}");
     ${source}
     __vanilla_filescope__.endFileScope();
+    ${removeAdapterSnippet};
   `;
 }
diff --git a/packages/integration/src/compiler.ts b/packages/integration/src/compiler.ts
new file mode 100644
index 0000000..85f1f86
--- /dev/null
+++ b/packages/integration/src/compiler.ts
@@ -0,0 +1,395 @@
+import { join, relative, isAbsolute } from 'path';
+import type { Adapter } from '@vanilla-extract/css';
+import { transformCss } from '@vanilla-extract/css/transformCss';
+import type { ModuleNode, Plugin as VitePlugin } from 'vite';
+import type { ViteNodeRunner } from 'vite-node/client';
+
+import type { IdentifierOption } from './types';
+import { cssFileFilter } from './filters';
+import { getPackageInfo } from './packageInfo';
+import { transform } from './transform';
+import { lock } from './lock';
+import { serializeVanillaModule } from './processVanillaFile';
+
+type Css = Parameters<Adapter['appendCss']>[0];
+type Composition = Parameters<Adapter['registerComposition']>[0];
+
+const globalAdapterIdentifier = '__vanilla_globalCssAdapter__';
+
+const scanModule = (entryModule: ModuleNode, root: string) => {
+  const queue = [entryModule];
+  const cssDeps = new Set<string>();
+  const watchFiles = new Set<string>();
+
+  for (const moduleNode of queue) {
+    const relativePath = moduleNode.id && relative(root, moduleNode.id);
+
+    if (relativePath) {
+      cssDeps.add(relativePath);
+    }
+
+    if (moduleNode.file) {
+      watchFiles.add(moduleNode.file);
+    }
+
+    queue.push(...moduleNode.importedModules);
+  }
+
+  // This ensures the root module's styles are last in terms of CSS ordering
+  const [head, ...tail] = cssDeps;
+
+  return { cssDeps: [...tail, head], watchFiles };
+};
+
+// We lazily load this utility from Vite
+let normalizeModuleId: (fsPath: string) => string;
+
+const createViteServer = async ({
+  root,
+  identifiers,
+  vitePlugins = [],
+}: {
+  root: string;
+  identifiers: IdentifierOption;
+  vitePlugins?: Array<VitePlugin>;
+}) => {
+  const pkg = getPackageInfo(root);
+  const vite = await import('vite');
+
+  normalizeModuleId = vite.normalizePath;
+
+  const server = await vite.createServer({
+    root,
+    server: {
+      hmr: false,
+    },
+    logLevel: 'silent',
+    optimizeDeps: {
+      disabled: true,
+    },
+    ssr: {
+      noExternal: true,
+    },
+    plugins: [
+      {
+        name: 'vanilla-extract-externalize',
+        enforce: 'pre',
+        async resolveId(source, importer) {
+          if (source.startsWith('@vanilla-extract/')) {
+            const result = await this.resolve(source, importer, {
+              skipSelf: true,
+            });
+
+            return result ? { ...result, external: true } : null;
+          }
+        },
+      },
+      {
+        name: 'vanilla-extract-transform',
+        async transform(code, id) {
+          if (cssFileFilter.test(id)) {
+            const filescopedCode = await transform({
+              source: code,
+              rootPath: root,
+              filePath: id,
+              packageName: pkg.name,
+              identOption: identifiers,
+              globalAdapterIdentifier,
+            });
+
+            return filescopedCode;
+          }
+        },
+      },
+      ...vitePlugins,
+    ],
+  });
+
+  // this is need to initialize the plugins
+  await server.pluginContainer.buildStart({});
+
+  const { ViteNodeRunner } = await import('vite-node/client');
+  const { ViteNodeServer } = await import('vite-node/server');
+
+  const node = new ViteNodeServer(server);
+
+  const runner = new ViteNodeRunner({
+    root,
+    base: server.config.base,
+    fetchModule(id) {
+      return node.fetchModule(id);
+    },
+    resolveId(id, importer) {
+      return node.resolveId(id, importer);
+    },
+  });
+
+  server.watcher.on('change', (filePath) => {
+    runner.moduleCache.invalidateDepTree([filePath]);
+  });
+
+  return {
+    server,
+    runner,
+  };
+};
+
+export interface Compiler {
+  processVanillaFile(
+    filePath: string,
+    options?: {
+      outputCss?: boolean;
+    },
+  ): Promise<{ source: string; watchFiles: Set<string> }>;
+  getCssForFile(virtualCssFilePath: string): { filePath: string; css: string };
+  close(): Promise<void>;
+}
+
+interface ProcessedVanillaFile {
+  source: string;
+  watchFiles: Set<string>;
+}
+
+export interface CreateCompilerOptions {
+  root: string;
+  cssImportSpecifier?: (filePath: string) => string;
+  identifiers?: IdentifierOption;
+  vitePlugins?: Array<VitePlugin>;
+}
+export const createCompiler = ({
+  root,
+  identifiers = 'debug',
+  cssImportSpecifier = (filePath) => filePath + '.vanilla.css',
+  vitePlugins,
+}: CreateCompilerOptions): Compiler => {
+  let originalPrepareContext: ViteNodeRunner['prepareContext'];
+
+  const vitePromise = createViteServer({
+    root,
+    identifiers,
+    vitePlugins,
+  }).then(({ server, runner }) => {
+    // Store the original method so we can monkey patch it on demand
+    originalPrepareContext = runner.prepareContext;
+    return { server, runner };
+  });
+
+  const cssCache = new Map<string, { css: string }>();
+
+  const processVanillaFileCache = new Map<
+    string,
+    {
+      lastInvalidationTimestamp: number;
+      result: ProcessedVanillaFile;
+    }
+  >();
+
+  const classRegistrationsByModuleId = new Map<
+    string,
+    {
+      localClassNames: Set<string>;
+      composedClassLists: Array<Composition>;
+    }
+  >();
+
+  return {
+    async processVanillaFile(
+      filePath,
+      options = {},
+    ): Promise<ProcessedVanillaFile> {
+      const { server, runner } = await vitePromise;
+
+      filePath = isAbsolute(filePath) ? filePath : join(root, filePath);
+      const outputCss = options.outputCss ?? true;
+
+      const cacheKey = Object.entries({ filePath, outputCss })
+        .map((entry) => entry.join('='))
+        .join('|');
+      const cachedFile = processVanillaFileCache.get(cacheKey);
+      if (cachedFile) {
+        const moduleNode = server.moduleGraph.getModuleById(filePath);
+        if (
+          cachedFile.lastInvalidationTimestamp ===
+          moduleNode?.lastInvalidationTimestamp
+        ) {
+          return cachedFile.result;
+        }
+      }
+
+      const cssByModuleId = new Map<string, Array<Css>>();
+      const localClassNames = new Set<string>();
+      const composedClassLists: Array<Composition> = [];
+
+      const cssAdapter: Adapter = {
+        getIdentOption: () => identifiers,
+        onBeginFileScope: (fileScope) => {
+          // Before evaluating a file, reset the cache for it
+          const moduleId = normalizeModuleId(fileScope.filePath);
+          cssByModuleId.set(moduleId, []);
+          classRegistrationsByModuleId.set(moduleId, {
+            localClassNames: new Set(),
+            composedClassLists: [],
+          });
+        },
+        onEndFileScope: ({ filePath }) => {
+          // For backwards compatibility, ensure the cache is populated even if
+          // a file didn't contain any CSS. This is to ensure that the only
+          // error messages shown in older versions are the ones below.
+          const moduleId = normalizeModuleId(filePath);
+          const cssObjs = cssByModuleId.get(moduleId) ?? [];
+          cssByModuleId.set(moduleId, cssObjs);
+        },
+        registerClassName: (className, fileScope) => {
+          if (!fileScope) {
+            throw new Error(
+              'Your version of @vanilla-extract/css must be at least v1.10.0. Please update to a compatible version.',
+            );
+          }
+
+          localClassNames.add(className);
+
+          const moduleId = normalizeModuleId(fileScope.filePath);
+          classRegistrationsByModuleId
+            .get(moduleId)!
+            .localClassNames.add(className);
+        },
+        registerComposition: (composedClassList, fileScope) => {
+          if (!fileScope) {
+            throw new Error(
+              'Your version of @vanilla-extract/css must be at least v1.10.0. Please update to a compatible version.',
+            );
+          }
+
+          composedClassLists.push(composedClassList);
+
+          const moduleId = normalizeModuleId(fileScope.filePath);
+          classRegistrationsByModuleId
+            .get(moduleId)!
+            .composedClassLists.push(composedClassList);
+        },
+        markCompositionUsed: () => {
+          // This compiler currently retains all composition classes
+        },
+        appendCss: (css, fileScope) => {
+          const moduleId = normalizeModuleId(fileScope.filePath);
+          const cssObjs = cssByModuleId.get(moduleId) ?? [];
+          cssObjs.push(css);
+
+          cssByModuleId.set(moduleId, cssObjs);
+        },
+      };
+
+      const { fileExports, cssImports, watchFiles, lastInvalidationTimestamp } =
+        await lock(async () => {
+          // Monkey patch the prepareContext method to inject the adapter
+          runner.prepareContext = function (...args) {
+            return {
+              ...originalPrepareContext.apply(this, args),
+              [globalAdapterIdentifier]: cssAdapter,
+            };
+          };
+
+          const fileExports = await runner.executeFile(filePath);
+
+          const moduleId = normalizeModuleId(filePath);
+          const moduleNode = server.moduleGraph.getModuleById(moduleId);
+
+          if (!moduleNode) {
+            throw new Error(`Can't find ModuleNode for ${filePath}`);
+          }
+
+          const cssImports = [];
+
+          const { cssDeps, watchFiles } = scanModule(moduleNode, root);
+
+          for (const cssDep of cssDeps) {
+            const cssDepModuleId = normalizeModuleId(cssDep);
+            const cssObjs = cssByModuleId.get(cssDepModuleId);
+            const cachedCss = cssCache.get(cssDepModuleId);
+            const cachedClassRegistrations =
+              classRegistrationsByModuleId.get(cssDepModuleId);
+
+            if (!cssObjs && !cachedCss && !cachedClassRegistrations) {
+              continue;
+            }
+
+            if (cssObjs) {
+              const css = transformCss({
+                localClassNames: Array.from(localClassNames),
+                composedClassLists,
+                cssObjs,
+              }).join('\n');
+
+              cssCache.set(cssDepModuleId, { css });
+            } else if (cachedClassRegistrations) {
+              cachedClassRegistrations.localClassNames.forEach(
+                (localClassName) => {
+                  localClassNames.add(localClassName);
+                },
+              );
+              composedClassLists.push(
+                ...cachedClassRegistrations.composedClassLists,
+              );
+            }
+
+            if (cssObjs || cachedCss?.css) {
+              cssImports.push(
+                `import '${cssImportSpecifier(cssDepModuleId)}';`,
+              );
+            }
+          }
+
+          return {
+            fileExports,
+            cssImports: outputCss ? cssImports : [],
+            watchFiles,
+            lastInvalidationTimestamp: moduleNode.lastInvalidationTimestamp,
+          };
+        });
+
+      const result: ProcessedVanillaFile = {
+        source: serializeVanillaModule(
+          cssImports,
+          fileExports,
+          null, // This compiler currently retains all composition classes
+        ),
+        watchFiles,
+      };
+
+      processVanillaFileCache.set(cacheKey, {
+        lastInvalidationTimestamp,
+        result,
+      });
+
+      return result;
+    },
+    getCssForFile(filePath: string) {
+      if (!normalizeModuleId) {
+        throw new Error(
+          `Compiler is still loading. No CSS for file: ${filePath}`,
+        );
+      }
+
+      filePath = isAbsolute(filePath) ? filePath : join(root, filePath);
+      const rootRelativePath = relative(root, filePath);
+
+      const moduleId = normalizeModuleId(rootRelativePath);
+      const result = cssCache.get(moduleId);
+
+      if (!result) {
+        throw new Error(`No CSS for file: ${filePath}`);
+      }
+
+      return {
+        css: result.css,
+        filePath: rootRelativePath,
+        resolveDir: root,
+      };
+    },
+    async close() {
+      const { server } = await vitePromise;
+
+      await server.close();
+    },
+  };
+};
diff --git a/packages/integration/src/index.ts b/packages/integration/src/index.ts
index 9ed56d1..f6152d2 100644
--- a/packages/integration/src/index.ts
+++ b/packages/integration/src/index.ts
@@ -6,6 +6,7 @@ export {
 export { getSourceFromVirtualCssFile } from './virtualFile';
 export { getPackageInfo } from './packageInfo';
 export { compile, vanillaExtractTransformPlugin } from './compile';
+export { createCompiler } from './compiler';
 export { hash } from './hash';
 export { addFileScope } from './addFileScope';
 export { serializeCss, deserializeCss } from './serialize';
@@ -16,3 +17,4 @@ export * from './filters';
 export type { IdentifierOption } from './types';
 export type { PackageInfo } from './packageInfo';
 export type { CompileOptions } from './compile';
+export type { Compiler, CreateCompilerOptions } from './compiler';
diff --git a/packages/integration/src/lock.ts b/packages/integration/src/lock.ts
new file mode 100644
index 0000000..e551550
--- /dev/null
+++ b/packages/integration/src/lock.ts
@@ -0,0 +1,37 @@
+type AsyncFunction<T> = () => Promise<T>;
+
+const queue: Array<() => void> = [];
+let isProcessingQueue = false;
+
+export async function lock<T>(fn: AsyncFunction<T>): Promise<T> {
+  return new Promise<T>((resolve, reject) => {
+    const queueFn = async () => {
+      try {
+        const result = await fn();
+        resolve(result);
+      } catch (error) {
+        reject(error);
+      } finally {
+        isProcessingQueue = false;
+        processQueue();
+      }
+    };
+
+    queue.push(queueFn);
+
+    if (!isProcessingQueue) {
+      processQueue();
+    }
+  });
+}
+
+async function processQueue() {
+  if (isProcessingQueue || queue.length === 0) {
+    return;
+  }
+
+  isProcessingQueue = true;
+  const fn = queue.shift()!;
+
+  await fn();
+}
diff --git a/packages/integration/src/transform.ts b/packages/integration/src/transform.ts
index 569eae9..99b8fbb 100644
--- a/packages/integration/src/transform.ts
+++ b/packages/integration/src/transform.ts
@@ -12,6 +12,7 @@ interface TransformParams {
   rootPath: string;
   packageName: string;
   identOption: IdentifierOption;
+  globalAdapterIdentifier?: string;
 }
 export const transformSync = ({
   source,
@@ -51,6 +52,7 @@ export const transform = async ({
   rootPath,
   packageName,
   identOption,
+  globalAdapterIdentifier,
 }: TransformParams): Promise<string> => {
   let code = source;
 
@@ -74,5 +76,6 @@ export const transform = async ({
     filePath,
     rootPath,
     packageName,
+    globalAdapterIdentifier,
   });
 };
diff --git a/packages/jest-transform/package.json b/packages/jest-transform/package.json
index 47f3f75..4b259f1 100644
--- a/packages/jest-transform/package.json
+++ b/packages/jest-transform/package.json
@@ -21,7 +21,7 @@
   "license": "MIT",
   "dependencies": {
     "@vanilla-extract/integration": "^6.0.2",
-    "esbuild": "^0.16.3"
+    "esbuild": "0.17.6"
   },
   "devDependencies": {
     "@jest/transform": "^29.0.3"
diff --git a/packages/rollup-plugin/package.json b/packages/rollup-plugin/package.json
index 280cd6f..c3083c3 100644
--- a/packages/rollup-plugin/package.json
+++ b/packages/rollup-plugin/package.json
@@ -21,7 +21,7 @@
     "@fixtures/themed": "*",
     "@rollup/plugin-json": "^4.1.0",
     "@vanilla-extract/css": "^1.9.5",
-    "esbuild": "^0.16.3",
+    "esbuild": "0.17.6",
     "rollup": "^2.7.0",
     "rollup-plugin-esbuild": "^4.9.1"
   },
diff --git a/packages/vite-plugin/package.json b/packages/vite-plugin/package.json
index f1091fe..434773c 100644
--- a/packages/vite-plugin/package.json
+++ b/packages/vite-plugin/package.json
@@ -21,7 +21,7 @@
     "postcss-load-config": "^3.1.0"
   },
   "devDependencies": {
-    "vite": "^2.7.0"
+    "vite": "npm:vite@^2.7.0"
   },
   "peerDependencies": {
     "vite": "^2.2.3 || ^3.0.0 || ^4.0.3"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e5fab37..9e3c27a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -34,6 +34,7 @@ importers:
       rollup-plugin-node-externals: ^5.0.0
       ts-node: ^10.0.0
       typescript: ^4.9.4
+      vitest: ^0.28.5
     dependencies:
       '@babel/core': 7.20.7
       '@babel/preset-env': 7.20.2_@babel+core@7.20.7
@@ -51,8 +52,8 @@ importers:
       '@vanilla-extract/jest-transform': link:packages/jest-transform
       babel-jest: 27.3.1_@babel+core@7.20.7
       fast-glob: 3.2.12
-      jest: 29.3.1_ts-node@10.9.1
-      jest-environment-jsdom: 29.3.1
+      jest: 29.4.3_ts-node@10.9.1
+      jest-environment-jsdom: 29.4.3
       prettier: 2.8.1
       resolve.exports: 1.1.0
       rollup: 2.79.1
@@ -60,6 +61,7 @@ importers:
       rollup-plugin-node-externals: 5.0.0_rollup@2.79.1
       ts-node: 10.9.1_djsbtcegmovallx2poba2t3laq
       typescript: 4.9.4
+      vitest: 0.28.5
 
   examples/next:
     specifiers:
@@ -217,11 +219,20 @@ importers:
   packages/esbuild-plugin:
     specifiers:
       '@vanilla-extract/integration': ^6.0.2
-      esbuild: ^0.16.3
+      esbuild: 0.17.6
     dependencies:
       '@vanilla-extract/integration': link:../integration
     devDependencies:
-      esbuild: 0.16.17
+      esbuild: 0.17.6
+
+  packages/esbuild-plugin-next:
+    specifiers:
+      '@vanilla-extract/integration': ^6.0.2
+      esbuild: 0.17.6
+    dependencies:
+      '@vanilla-extract/integration': link:../integration
+    devDependencies:
+      esbuild: 0.17.6
 
   packages/integration:
     specifiers:
@@ -231,25 +242,29 @@ importers:
       '@types/lodash': ^4.14.168
       '@vanilla-extract/babel-plugin-debug-ids': ^1.0.2
       '@vanilla-extract/css': ^1.9.4
-      esbuild: ^0.16.3
+      esbuild: 0.17.6
       eval: 0.1.6
       find-up: ^5.0.0
       javascript-stringify: ^2.0.1
       lodash: ^4.17.21
       mlly: ^1.1.0
       outdent: ^0.8.0
+      vite: ^4.1.4
+      vite-node: ^0.28.5
     dependencies:
       '@babel/core': 7.20.7
       '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.7
       '@vanilla-extract/babel-plugin-debug-ids': link:../babel-plugin-debug-ids
       '@vanilla-extract/css': link:../css
-      esbuild: 0.16.17
+      esbuild: 0.17.6
       eval: 0.1.6
       find-up: 5.0.0
       javascript-stringify: 2.1.0
       lodash: 4.17.21
       mlly: 1.1.0
       outdent: 0.8.0
+      vite: 4.1.4
+      vite-node: 0.28.5
     devDependencies:
       '@types/babel__core': 7.1.20
       '@types/lodash': 4.14.177
@@ -258,10 +273,10 @@ importers:
     specifiers:
       '@jest/transform': ^29.0.3
       '@vanilla-extract/integration': ^6.0.2
-      esbuild: ^0.16.3
+      esbuild: 0.17.6
     dependencies:
       '@vanilla-extract/integration': link:../integration
-      esbuild: 0.16.17
+      esbuild: 0.17.6
     devDependencies:
       '@jest/transform': 29.3.1
 
@@ -281,7 +296,7 @@ importers:
       '@parcel/plugin': ^2.7.0
       '@vanilla-extract/integration': ^6.0.0
     dependencies:
-      '@parcel/plugin': 2.7.0
+      '@parcel/plugin': 2.8.3
       '@vanilla-extract/integration': link:../integration
 
   packages/private:
@@ -299,7 +314,7 @@ importers:
       '@rollup/plugin-json': ^4.1.0
       '@vanilla-extract/css': ^1.9.5
       '@vanilla-extract/integration': ^6.1.0
-      esbuild: ^0.16.3
+      esbuild: 0.17.6
       rollup: ^2.7.0
       rollup-plugin-esbuild: ^4.9.1
     dependencies:
@@ -308,9 +323,9 @@ importers:
       '@fixtures/themed': link:../../fixtures/themed
       '@rollup/plugin-json': 4.1.0_rollup@2.79.1
       '@vanilla-extract/css': link:../css
-      esbuild: 0.16.17
+      esbuild: 0.17.6
       rollup: 2.79.1
-      rollup-plugin-esbuild: 4.9.1_uiao7appyg7pvh5lt4amcal6cy
+      rollup-plugin-esbuild: 4.9.1_72vqmc7tx7ptj43i3kyzp2skqu
 
   packages/sprinkles:
     specifiers:
@@ -327,11 +342,11 @@ importers:
       outdent: ^0.8.0
       postcss: ^8.3.6
       postcss-load-config: ^3.1.0
-      vite: ^2.7.0
+      vite: npm:vite@^2.7.0
     dependencies:
       '@vanilla-extract/integration': link:../integration
       outdent: 0.8.0
-      postcss: 8.4.16
+      postcss: 8.4.21
       postcss-load-config: 3.1.0
     devDependencies:
       vite: 2.7.2
@@ -483,13 +498,14 @@ importers:
       '@types/serve-handler': ^6
       '@types/webpack-dev-server': ^3.11.1
       '@vanilla-extract/esbuild-plugin': '*'
+      '@vanilla-extract/esbuild-plugin-next': '*'
       '@vanilla-extract/parcel-transformer': '*'
       '@vanilla-extract/vite-plugin': '*'
       '@vanilla-extract/webpack-plugin': '*'
       babel-loader: ^8.2.2
       css-loader: ^5.2.4
       cssnano: ^5.0.8
-      esbuild: ^0.16.3
+      esbuild: 0.17.6
       got: ^11.8.2
       html-webpack-plugin: ^5.3.1
       mini-css-extract-plugin: ^1.5.1
@@ -500,7 +516,7 @@ importers:
       prettier: ^2.8.1
       serve-handler: ^6.1.3
       style-loader: ^2.0.0
-      vite: ^2.7.0
+      vite: npm:vite@^2.7.0
       webpack: ^5.36.1
       webpack-dev-server: ^3.11.2
       webpack-merge: ^5.7.3
@@ -512,30 +528,31 @@ importers:
       '@fixtures/sprinkles': link:../fixtures/sprinkles
       '@fixtures/themed': link:../fixtures/themed
       '@fixtures/unused-modules': link:../fixtures/unused-modules
-      '@parcel/config-default': 2.7.0_bt4okovxcciljru5eqxfyq6e2a
-      '@parcel/core': 2.7.0
-      '@types/mini-css-extract-plugin': 1.4.3_esbuild@0.16.17
+      '@parcel/config-default': 2.8.3_z7ftfhsu7i56anitrxzhopodiy
+      '@parcel/core': 2.8.3
+      '@types/mini-css-extract-plugin': 1.4.3_esbuild@0.17.6
       '@types/webpack-dev-server': 3.11.6
       '@vanilla-extract/esbuild-plugin': link:../packages/esbuild-plugin
+      '@vanilla-extract/esbuild-plugin-next': link:../packages/esbuild-plugin-next
       '@vanilla-extract/parcel-transformer': link:../packages/parcel-transformer
       '@vanilla-extract/vite-plugin': link:../packages/vite-plugin
       '@vanilla-extract/webpack-plugin': link:../packages/webpack-plugin
       babel-loader: 8.2.3_rogvnekrnkqy3ozger37vg5xlu
       css-loader: 5.2.7_webpack@5.64.2
-      cssnano: 5.0.11_postcss@8.4.16
-      esbuild: 0.16.17
+      cssnano: 5.0.11_postcss@8.4.21
+      esbuild: 0.17.6
       got: 11.8.3
       html-webpack-plugin: 5.5.0_webpack@5.64.2
       mini-css-extract-plugin: 1.6.2_webpack@5.64.2
       minimist: 1.2.5
       path-browserify: 1.0.1
       portfinder: 1.0.28
-      postcss: 8.4.16
+      postcss: 8.4.21
       prettier: 2.8.1
       serve-handler: 6.1.3
       style-loader: 2.0.0_webpack@5.64.2
       vite: 2.7.2
-      webpack: 5.64.2_esbuild@0.16.17
+      webpack: 5.64.2_esbuild@0.17.6
       webpack-dev-server: 3.11.3_webpack@5.64.2
       webpack-merge: 5.8.0
     devDependencies:
@@ -551,6 +568,7 @@ importers:
       '@vanilla-extract-private/test-helpers': '*'
       '@vanilla-extract/css': '*'
       '@vanilla-extract/dynamic': '*'
+      '@vanilla-extract/integration': '*'
       '@vanilla-extract/recipes': '*'
       '@vanilla-extract/sprinkles': '*'
     dependencies:
@@ -560,6 +578,7 @@ importers:
       '@vanilla-extract-private/test-helpers': link:../test-helpers
       '@vanilla-extract/css': link:../packages/css
       '@vanilla-extract/dynamic': link:../packages/dynamic
+      '@vanilla-extract/integration': link:../packages/integration
       '@vanilla-extract/recipes': link:../packages/recipes
       '@vanilla-extract/sprinkles': link:../packages/sprinkles
 
@@ -714,7 +733,7 @@ packages:
       gensync: 1.0.0-beta.2
       json5: 2.2.1
       lodash: 4.17.21
-      resolve: 1.20.0
+      resolve: 1.22.1
       semver: 5.7.1
       source-map: 0.5.7
     transitivePeerDependencies:
@@ -853,7 +872,7 @@ packages:
       '@babel/helper-plugin-utils': 7.20.2
       debug: 4.3.4
       lodash.debounce: 4.0.8
-      resolve: 1.20.0
+      resolve: 1.22.1
       semver: 6.3.0
     transitivePeerDependencies:
       - supports-color
@@ -869,7 +888,7 @@ packages:
       '@babel/helper-plugin-utils': 7.20.2
       debug: 4.3.4
       lodash.debounce: 4.0.8
-      resolve: 1.20.0
+      resolve: 1.22.1
       semver: 6.3.0
     transitivePeerDependencies:
       - supports-color
@@ -2997,7 +3016,7 @@ packages:
       '@changesets/types': 4.0.1
       '@manypkg/get-packages': 1.1.3
       fs-extra: 7.0.1
-      micromatch: 4.0.4
+      micromatch: 4.0.5
     dev: false
 
   /@changesets/errors/0.1.4:
@@ -3168,6 +3187,15 @@ packages:
     cpu: [arm]
     os: [android]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/android-arm/0.17.6:
+    resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
     optional: true
 
   /@esbuild/android-arm64/0.16.17:
@@ -3176,6 +3204,15 @@ packages:
     cpu: [arm64]
     os: [android]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/android-arm64/0.17.6:
+    resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
     optional: true
 
   /@esbuild/android-x64/0.16.17:
@@ -3184,6 +3221,15 @@ packages:
     cpu: [x64]
     os: [android]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/android-x64/0.17.6:
+    resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
     optional: true
 
   /@esbuild/darwin-arm64/0.16.17:
@@ -3192,6 +3238,15 @@ packages:
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/darwin-arm64/0.17.6:
+    resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
     optional: true
 
   /@esbuild/darwin-x64/0.16.17:
@@ -3200,6 +3255,15 @@ packages:
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/darwin-x64/0.17.6:
+    resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
     optional: true
 
   /@esbuild/freebsd-arm64/0.16.17:
@@ -3208,6 +3272,15 @@ packages:
     cpu: [arm64]
     os: [freebsd]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/freebsd-arm64/0.17.6:
+    resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
     optional: true
 
   /@esbuild/freebsd-x64/0.16.17:
@@ -3216,6 +3289,15 @@ packages:
     cpu: [x64]
     os: [freebsd]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/freebsd-x64/0.17.6:
+    resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
     optional: true
 
   /@esbuild/linux-arm/0.16.17:
@@ -3224,6 +3306,15 @@ packages:
     cpu: [arm]
     os: [linux]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/linux-arm/0.17.6:
+    resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
     optional: true
 
   /@esbuild/linux-arm64/0.16.17:
@@ -3232,6 +3323,15 @@ packages:
     cpu: [arm64]
     os: [linux]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/linux-arm64/0.17.6:
+    resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
     optional: true
 
   /@esbuild/linux-ia32/0.16.17:
@@ -3240,6 +3340,15 @@ packages:
     cpu: [ia32]
     os: [linux]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/linux-ia32/0.17.6:
+    resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
     optional: true
 
   /@esbuild/linux-loong64/0.16.17:
@@ -3248,6 +3357,15 @@ packages:
     cpu: [loong64]
     os: [linux]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/linux-loong64/0.17.6:
+    resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
     optional: true
 
   /@esbuild/linux-mips64el/0.16.17:
@@ -3256,6 +3374,15 @@ packages:
     cpu: [mips64el]
     os: [linux]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/linux-mips64el/0.17.6:
+    resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
     optional: true
 
   /@esbuild/linux-ppc64/0.16.17:
@@ -3264,6 +3391,15 @@ packages:
     cpu: [ppc64]
     os: [linux]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/linux-ppc64/0.17.6:
+    resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
     optional: true
 
   /@esbuild/linux-riscv64/0.16.17:
@@ -3272,6 +3408,15 @@ packages:
     cpu: [riscv64]
     os: [linux]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/linux-riscv64/0.17.6:
+    resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
     optional: true
 
   /@esbuild/linux-s390x/0.16.17:
@@ -3280,6 +3425,15 @@ packages:
     cpu: [s390x]
     os: [linux]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/linux-s390x/0.17.6:
+    resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
     optional: true
 
   /@esbuild/linux-x64/0.16.17:
@@ -3288,6 +3442,15 @@ packages:
     cpu: [x64]
     os: [linux]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/linux-x64/0.17.6:
+    resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
     optional: true
 
   /@esbuild/netbsd-x64/0.16.17:
@@ -3296,6 +3459,15 @@ packages:
     cpu: [x64]
     os: [netbsd]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/netbsd-x64/0.17.6:
+    resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
     optional: true
 
   /@esbuild/openbsd-x64/0.16.17:
@@ -3304,6 +3476,15 @@ packages:
     cpu: [x64]
     os: [openbsd]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/openbsd-x64/0.17.6:
+    resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
     optional: true
 
   /@esbuild/sunos-x64/0.16.17:
@@ -3312,6 +3493,15 @@ packages:
     cpu: [x64]
     os: [sunos]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/sunos-x64/0.17.6:
+    resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
     optional: true
 
   /@esbuild/win32-arm64/0.16.17:
@@ -3320,6 +3510,15 @@ packages:
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/win32-arm64/0.17.6:
+    resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
     optional: true
 
   /@esbuild/win32-ia32/0.16.17:
@@ -3328,6 +3527,15 @@ packages:
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/win32-ia32/0.17.6:
+    resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
     optional: true
 
   /@esbuild/win32-x64/0.16.17:
@@ -3336,6 +3544,15 @@ packages:
     cpu: [x64]
     os: [win32]
     requiresBuild: true
+    dev: false
+    optional: true
+
+  /@esbuild/win32-x64/0.17.6:
+    resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
     optional: true
 
   /@hapi/accept/5.0.2:
@@ -3370,20 +3587,20 @@ packages:
     resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
     engines: {node: '>=8'}
 
-  /@jest/console/29.3.1:
-    resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==}
+  /@jest/console/29.4.3:
+    resolution: {integrity: sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 29.3.1
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
       chalk: 4.1.2
-      jest-message-util: 29.3.1
-      jest-util: 29.3.1
+      jest-message-util: 29.4.3
+      jest-util: 29.4.3
       slash: 3.0.0
     dev: false
 
-  /@jest/core/29.3.1_ts-node@10.9.1:
-    resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==}
+  /@jest/core/29.4.3_ts-node@10.9.1:
+    resolution: {integrity: sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
@@ -3391,32 +3608,32 @@ packages:
       node-notifier:
         optional: true
     dependencies:
-      '@jest/console': 29.3.1
-      '@jest/reporters': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/console': 29.4.3
+      '@jest/reporters': 29.4.3
+      '@jest/test-result': 29.4.3
+      '@jest/transform': 29.4.3
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       ci-info: 3.3.0
       exit: 0.1.2
       graceful-fs: 4.2.10
-      jest-changed-files: 29.2.0
-      jest-config: 29.3.1_dzldzuw4l36u5566gumx6niqti
-      jest-haste-map: 29.3.1
-      jest-message-util: 29.3.1
-      jest-regex-util: 29.2.0
-      jest-resolve: 29.3.1
-      jest-resolve-dependencies: 29.3.1
-      jest-runner: 29.3.1
-      jest-runtime: 29.3.1
-      jest-snapshot: 29.3.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      jest-watcher: 29.3.1
-      micromatch: 4.0.4
-      pretty-format: 29.3.1
+      jest-changed-files: 29.4.3
+      jest-config: 29.4.3_dzldzuw4l36u5566gumx6niqti
+      jest-haste-map: 29.4.3
+      jest-message-util: 29.4.3
+      jest-regex-util: 29.4.3
+      jest-resolve: 29.4.3
+      jest-resolve-dependencies: 29.4.3
+      jest-runner: 29.4.3
+      jest-runtime: 29.4.3
+      jest-snapshot: 29.4.3
+      jest-util: 29.4.3
+      jest-validate: 29.4.3
+      jest-watcher: 29.4.3
+      micromatch: 4.0.5
+      pretty-format: 29.4.3
       slash: 3.0.0
       strip-ansi: 6.0.1
     transitivePeerDependencies:
@@ -3424,59 +3641,59 @@ packages:
       - ts-node
     dev: false
 
-  /@jest/environment/29.3.1:
-    resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==}
+  /@jest/environment/29.4.3:
+    resolution: {integrity: sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/fake-timers': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/fake-timers': 29.4.3
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
-      jest-mock: 29.3.1
+      jest-mock: 29.4.3
     dev: false
 
-  /@jest/expect-utils/29.3.1:
-    resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==}
+  /@jest/expect-utils/29.4.3:
+    resolution: {integrity: sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      jest-get-type: 29.2.0
+      jest-get-type: 29.4.3
     dev: false
 
-  /@jest/expect/29.3.1:
-    resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==}
+  /@jest/expect/29.4.3:
+    resolution: {integrity: sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      expect: 29.3.1
-      jest-snapshot: 29.3.1
+      expect: 29.4.3
+      jest-snapshot: 29.4.3
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@jest/fake-timers/29.3.1:
-    resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==}
+  /@jest/fake-timers/29.4.3:
+    resolution: {integrity: sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 29.3.1
-      '@sinonjs/fake-timers': 9.1.2
+      '@jest/types': 29.4.3
+      '@sinonjs/fake-timers': 10.0.2
       '@types/node': 16.11.10
-      jest-message-util: 29.3.1
-      jest-mock: 29.3.1
-      jest-util: 29.3.1
+      jest-message-util: 29.4.3
+      jest-mock: 29.4.3
+      jest-util: 29.4.3
     dev: false
 
-  /@jest/globals/29.3.1:
-    resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==}
+  /@jest/globals/29.4.3:
+    resolution: {integrity: sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/environment': 29.3.1
-      '@jest/expect': 29.3.1
-      '@jest/types': 29.3.1
-      jest-mock: 29.3.1
+      '@jest/environment': 29.4.3
+      '@jest/expect': 29.4.3
+      '@jest/types': 29.4.3
+      jest-mock: 29.4.3
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@jest/reporters/29.3.1:
-    resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==}
+  /@jest/reporters/29.4.3:
+    resolution: {integrity: sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
@@ -3485,10 +3702,10 @@ packages:
         optional: true
     dependencies:
       '@bcoe/v8-coverage': 0.2.3
-      '@jest/console': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/console': 29.4.3
+      '@jest/test-result': 29.4.3
+      '@jest/transform': 29.4.3
+      '@jest/types': 29.4.3
       '@jridgewell/trace-mapping': 0.3.15
       '@types/node': 16.11.10
       chalk: 4.1.2
@@ -3501,9 +3718,9 @@ packages:
       istanbul-lib-report: 3.0.0
       istanbul-lib-source-maps: 4.0.1
       istanbul-reports: 3.1.5
-      jest-message-util: 29.3.1
-      jest-util: 29.3.1
-      jest-worker: 29.3.1
+      jest-message-util: 29.4.3
+      jest-util: 29.4.3
+      jest-worker: 29.4.3
       slash: 3.0.0
       string-length: 4.0.2
       strip-ansi: 6.0.1
@@ -3517,9 +3734,16 @@ packages:
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@sinclair/typebox': 0.24.41
+    dev: true
 
-  /@jest/source-map/29.2.0:
-    resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==}
+  /@jest/schemas/29.4.3:
+    resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@sinclair/typebox': 0.25.24
+
+  /@jest/source-map/29.4.3:
+    resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@jridgewell/trace-mapping': 0.3.15
@@ -3527,23 +3751,23 @@ packages:
       graceful-fs: 4.2.10
     dev: false
 
-  /@jest/test-result/29.3.1:
-    resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==}
+  /@jest/test-result/29.4.3:
+    resolution: {integrity: sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/console': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/console': 29.4.3
+      '@jest/types': 29.4.3
       '@types/istanbul-lib-coverage': 2.0.3
       collect-v8-coverage: 1.0.1
     dev: false
 
-  /@jest/test-sequencer/29.3.1:
-    resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==}
+  /@jest/test-sequencer/29.4.3:
+    resolution: {integrity: sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/test-result': 29.3.1
+      '@jest/test-result': 29.4.3
       graceful-fs: 4.2.10
-      jest-haste-map: 29.3.1
+      jest-haste-map: 29.4.3
       slash: 3.0.0
     dev: false
 
@@ -3561,7 +3785,7 @@ packages:
       jest-haste-map: 27.3.1
       jest-regex-util: 27.0.6
       jest-util: 27.3.1
-      micromatch: 4.0.4
+      micromatch: 4.0.5
       pirates: 4.0.5
       slash: 3.0.0
       source-map: 0.6.1
@@ -3591,6 +3815,30 @@ packages:
       write-file-atomic: 4.0.2
     transitivePeerDependencies:
       - supports-color
+    dev: true
+
+  /@jest/transform/29.4.3:
+    resolution: {integrity: sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@babel/core': 7.20.7
+      '@jest/types': 29.4.3
+      '@jridgewell/trace-mapping': 0.3.15
+      babel-plugin-istanbul: 6.1.1
+      chalk: 4.1.2
+      convert-source-map: 2.0.0
+      fast-json-stable-stringify: 2.1.0
+      graceful-fs: 4.2.10
+      jest-haste-map: 29.4.3
+      jest-regex-util: 29.4.3
+      jest-util: 29.4.3
+      micromatch: 4.0.5
+      pirates: 4.0.5
+      slash: 3.0.0
+      write-file-atomic: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
 
   /@jest/types/25.5.0:
     resolution: {integrity: sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==}
@@ -3633,6 +3881,18 @@ packages:
       '@types/node': 16.11.10
       '@types/yargs': 17.0.12
       chalk: 4.1.2
+    dev: true
+
+  /@jest/types/29.4.3:
+    resolution: {integrity: sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/schemas': 29.4.3
+      '@types/istanbul-lib-coverage': 2.0.3
+      '@types/istanbul-reports': 3.0.1
+      '@types/node': 16.11.10
+      '@types/yargs': 17.0.12
+      chalk: 4.1.2
 
   /@jridgewell/gen-mapping/0.1.1:
     resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
@@ -4306,7 +4566,7 @@ packages:
     dependencies:
       execa: 6.1.0
       map-obj: 5.0.2
-      micromatch: 4.0.4
+      micromatch: 4.0.5
       moize: 6.1.3
       path-exists: 5.0.0
     dev: true
@@ -4824,96 +5084,97 @@ packages:
       '@octokit/openapi-types': 12.11.0
     dev: true
 
-  /@parcel/bundler-default/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-PU5MtWWhc+dYI9x8mguYnm9yiG6TkI7niRpxgJgtqAyGHuEyNXVBQQ0X+qyOF4D9LdankBf8uNN18g31IET2Zg==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/bundler-default/-/bundler-default-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/bundler-default/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-yJvRsNWWu5fVydsWk3O2L4yIy3UZiKWO2cPDukGOIWMgp/Vbpp+2Ct5IygVRtE22bnseW/E/oe0PV3d2IkEJGg==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/hash': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/graph': 2.8.3
+      '@parcel/hash': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
       nullthrows: 1.1.1
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/cache/2.7.0:
-    resolution: {integrity: sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==}
+  /@parcel/cache/2.8.3:
+    resolution: {integrity: sha512-k7xv5vSQrJLdXuglo+Hv3yF4BCSs1tQ/8Vbd6CHTkOhf7LcGg6CPtLw053R/KdMpd/4GPn0QrAsOLdATm1ELtQ==}
     engines: {node: '>= 12.0.0'}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/fs': 2.7.0
-      '@parcel/logger': 2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/fs': 2.8.3
+      '@parcel/logger': 2.8.3
+      '@parcel/utils': 2.8.3
       lmdb: 2.5.2
     dev: false
 
-  /@parcel/cache/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==}
+  /@parcel/cache/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-k7xv5vSQrJLdXuglo+Hv3yF4BCSs1tQ/8Vbd6CHTkOhf7LcGg6CPtLw053R/KdMpd/4GPn0QrAsOLdATm1ELtQ==}
     engines: {node: '>= 12.0.0'}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/core': 2.7.0
-      '@parcel/fs': 2.7.0_@parcel+core@2.7.0
-      '@parcel/logger': 2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/core': 2.8.3
+      '@parcel/fs': 2.8.3_@parcel+core@2.8.3
+      '@parcel/logger': 2.8.3
+      '@parcel/utils': 2.8.3
       lmdb: 2.5.2
     dev: false
 
-  /@parcel/codeframe/2.7.0:
-    resolution: {integrity: sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==}
+  /@parcel/codeframe/2.8.3:
+    resolution: {integrity: sha512-FE7sY53D6n/+2Pgg6M9iuEC6F5fvmyBkRE4d9VdnOoxhTXtkEqpqYgX7RJ12FAQwNlxKq4suBJQMgQHMF2Kjeg==}
     engines: {node: '>= 12.0.0'}
     dependencies:
       chalk: 4.1.2
     dev: false
 
-  /@parcel/compressor-raw/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-SCXwnOOQT6EmpusBsYWNQ/RFri+2JnKuE0gMSf2dROl2xbererX45FYzeDplWALCKAdjMNDpFwU+FyMYoVZSCQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/compressor-raw/-/compressor-raw-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/compressor-raw/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-bVDsqleBUxRdKMakWSlWC9ZjOcqDKE60BE+Gh3JSN6WJrycJ02P5wxjTVF4CStNP/G7X17U+nkENxSlMG77ySg==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/config-default/2.7.0_bt4okovxcciljru5eqxfyq6e2a:
-    resolution: {integrity: sha512-ZzsLr97AYrz8c9k6qn3DlqPzifi3vbP7q3ynUrAFxmt0L4+K0H9N508ZkORYmCgaFjLIQ8Y3eWpwCJ0AewPNIg==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/config-default/-/config-default-2.7.0.tgz}
-    peerDependencies:
-      '@parcel/core': ^2.7.0
-    dependencies:
-      '@parcel/bundler-default': 2.7.0_@parcel+core@2.7.0
-      '@parcel/compressor-raw': 2.7.0_@parcel+core@2.7.0
-      '@parcel/core': 2.7.0
-      '@parcel/namer-default': 2.7.0_@parcel+core@2.7.0
-      '@parcel/optimizer-css': 2.7.0_@parcel+core@2.7.0
-      '@parcel/optimizer-htmlnano': 2.7.0_bt4okovxcciljru5eqxfyq6e2a
-      '@parcel/optimizer-image': 2.7.0_@parcel+core@2.7.0
-      '@parcel/optimizer-svgo': 2.7.0_@parcel+core@2.7.0
-      '@parcel/optimizer-terser': 2.7.0_@parcel+core@2.7.0
-      '@parcel/packager-css': 2.7.0_@parcel+core@2.7.0
-      '@parcel/packager-html': 2.7.0_@parcel+core@2.7.0
-      '@parcel/packager-js': 2.7.0_@parcel+core@2.7.0
-      '@parcel/packager-raw': 2.7.0_@parcel+core@2.7.0
-      '@parcel/packager-svg': 2.7.0_@parcel+core@2.7.0
-      '@parcel/reporter-dev-server': 2.7.0_@parcel+core@2.7.0
-      '@parcel/resolver-default': 2.7.0_@parcel+core@2.7.0
-      '@parcel/runtime-browser-hmr': 2.7.0_@parcel+core@2.7.0
-      '@parcel/runtime-js': 2.7.0_@parcel+core@2.7.0
-      '@parcel/runtime-react-refresh': 2.7.0_@parcel+core@2.7.0
-      '@parcel/runtime-service-worker': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-babel': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-css': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-html': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-image': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-js': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-json': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-postcss': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-posthtml': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-raw': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-react-refresh-wrap': 2.7.0_@parcel+core@2.7.0
-      '@parcel/transformer-svg': 2.7.0_@parcel+core@2.7.0
+  /@parcel/config-default/2.8.3_z7ftfhsu7i56anitrxzhopodiy:
+    resolution: {integrity: sha512-o/A/mbrO6X/BfGS65Sib8d6SSG45NYrNooNBkH/o7zbOBSRQxwyTlysleK1/3Wa35YpvFyLOwgfakqCtbGy4fw==}
+    peerDependencies:
+      '@parcel/core': ^2.8.3
+    dependencies:
+      '@parcel/bundler-default': 2.8.3_@parcel+core@2.8.3
+      '@parcel/compressor-raw': 2.8.3_@parcel+core@2.8.3
+      '@parcel/core': 2.8.3
+      '@parcel/namer-default': 2.8.3_@parcel+core@2.8.3
+      '@parcel/optimizer-css': 2.8.3_@parcel+core@2.8.3
+      '@parcel/optimizer-htmlnano': 2.8.3_z7ftfhsu7i56anitrxzhopodiy
+      '@parcel/optimizer-image': 2.8.3_@parcel+core@2.8.3
+      '@parcel/optimizer-svgo': 2.8.3_@parcel+core@2.8.3
+      '@parcel/optimizer-terser': 2.8.3_@parcel+core@2.8.3
+      '@parcel/packager-css': 2.8.3_@parcel+core@2.8.3
+      '@parcel/packager-html': 2.8.3_@parcel+core@2.8.3
+      '@parcel/packager-js': 2.8.3_@parcel+core@2.8.3
+      '@parcel/packager-raw': 2.8.3_@parcel+core@2.8.3
+      '@parcel/packager-svg': 2.8.3_@parcel+core@2.8.3
+      '@parcel/reporter-dev-server': 2.8.3_@parcel+core@2.8.3
+      '@parcel/resolver-default': 2.8.3_@parcel+core@2.8.3
+      '@parcel/runtime-browser-hmr': 2.8.3_@parcel+core@2.8.3
+      '@parcel/runtime-js': 2.8.3_@parcel+core@2.8.3
+      '@parcel/runtime-react-refresh': 2.8.3_@parcel+core@2.8.3
+      '@parcel/runtime-service-worker': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-babel': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-css': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-html': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-image': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-js': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-json': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-postcss': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-posthtml': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-raw': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-react-refresh-wrap': 2.8.3_@parcel+core@2.8.3
+      '@parcel/transformer-svg': 2.8.3_@parcel+core@2.8.3
     transitivePeerDependencies:
       - cssnano
       - postcss
@@ -4924,24 +5185,24 @@ packages:
       - uncss
     dev: false
 
-  /@parcel/core/2.7.0:
-    resolution: {integrity: sha512-7yKZUdh314Q/kU/9+27ZYTfcnXS6VYHuG+iiUlIohnvUUybxLqVJhdMU9Q+z2QcPka1IdJWz4K4Xx0y6/4goyg==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/core/-/core-2.7.0.tgz}
+  /@parcel/core/2.8.3:
+    resolution: {integrity: sha512-Euf/un4ZAiClnlUXqPB9phQlKbveU+2CotZv7m7i+qkgvFn5nAGnrV4h1OzQU42j9dpgOxWi7AttUDMrvkbhCQ==}
     engines: {node: '>= 12.0.0'}
     dependencies:
       '@mischnic/json-sourcemap': 0.1.0
-      '@parcel/cache': 2.7.0_@parcel+core@2.7.0
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/events': 2.7.0
-      '@parcel/fs': 2.7.0_@parcel+core@2.7.0
-      '@parcel/graph': 2.7.0
-      '@parcel/hash': 2.7.0
-      '@parcel/logger': 2.7.0
-      '@parcel/package-manager': 2.7.0_@parcel+core@2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/cache': 2.8.3_@parcel+core@2.8.3
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/events': 2.8.3
+      '@parcel/fs': 2.8.3_@parcel+core@2.8.3
+      '@parcel/graph': 2.8.3
+      '@parcel/hash': 2.8.3
+      '@parcel/logger': 2.8.3
+      '@parcel/package-manager': 2.8.3_@parcel+core@2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/types': 2.7.0
-      '@parcel/utils': 2.7.0
-      '@parcel/workers': 2.7.0_@parcel+core@2.7.0
+      '@parcel/types': 2.8.3
+      '@parcel/utils': 2.8.3
+      '@parcel/workers': 2.8.3_@parcel+core@2.8.3
       abortcontroller-polyfill: 1.7.3
       base-x: 3.0.9
       browserslist: 4.21.4
@@ -4954,133 +5215,125 @@ packages:
       semver: 5.7.1
     dev: false
 
-  /@parcel/css/1.14.0:
-    resolution: {integrity: sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/css/-/css-1.14.0.tgz}
-    engines: {node: '>= 12.0.0'}
-    dependencies:
-      lightningcss: 1.16.0
-    dev: false
-
-  /@parcel/diagnostic/2.7.0:
-    resolution: {integrity: sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==}
+  /@parcel/diagnostic/2.8.3:
+    resolution: {integrity: sha512-u7wSzuMhLGWZjVNYJZq/SOViS3uFG0xwIcqXw12w54Uozd6BH8JlhVtVyAsq9kqnn7YFkw6pXHqAo5Tzh4FqsQ==}
     engines: {node: '>= 12.0.0'}
     dependencies:
       '@mischnic/json-sourcemap': 0.1.0
       nullthrows: 1.1.1
     dev: false
 
-  /@parcel/events/2.7.0:
-    resolution: {integrity: sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==}
+  /@parcel/events/2.8.3:
+    resolution: {integrity: sha512-hoIS4tAxWp8FJk3628bsgKxEvR7bq2scCVYHSqZ4fTi/s0+VymEATrRCUqf+12e5H47uw1/ZjoqrGtBI02pz4w==}
     engines: {node: '>= 12.0.0'}
     dev: false
 
-  /@parcel/fs-search/2.7.0:
-    resolution: {integrity: sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==}
+  /@parcel/fs-search/2.8.3:
+    resolution: {integrity: sha512-DJBT2N8knfN7Na6PP2mett3spQLTqxFrvl0gv+TJRp61T8Ljc4VuUTb0hqBj+belaASIp3Q+e8+SgaFQu7wLiQ==}
     engines: {node: '>= 12.0.0'}
     dependencies:
       detect-libc: 1.0.3
     dev: false
 
-  /@parcel/fs/2.7.0:
-    resolution: {integrity: sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==}
+  /@parcel/fs/2.8.3:
+    resolution: {integrity: sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==}
     engines: {node: '>= 12.0.0'}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/fs-search': 2.7.0
-      '@parcel/types': 2.7.0
-      '@parcel/utils': 2.7.0
-      '@parcel/watcher': 2.0.5
-      '@parcel/workers': 2.7.0
+      '@parcel/fs-search': 2.8.3
+      '@parcel/types': 2.8.3
+      '@parcel/utils': 2.8.3
+      '@parcel/watcher': 2.1.0
+      '@parcel/workers': 2.8.3
     dev: false
 
-  /@parcel/fs/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==}
+  /@parcel/fs/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==}
     engines: {node: '>= 12.0.0'}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/core': 2.7.0
-      '@parcel/fs-search': 2.7.0
-      '@parcel/types': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
-      '@parcel/watcher': 2.0.5
-      '@parcel/workers': 2.7.0_@parcel+core@2.7.0
+      '@parcel/core': 2.8.3
+      '@parcel/fs-search': 2.8.3
+      '@parcel/types': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
+      '@parcel/watcher': 2.1.0
+      '@parcel/workers': 2.8.3_@parcel+core@2.8.3
     dev: false
 
-  /@parcel/graph/2.7.0:
-    resolution: {integrity: sha512-Q6E94GS6q45PtsZh+m+gvFRp/N1Qopxhu2sxjcWsGs5iBd6IWn2oYLWOH5iVzEjWuYpW2HkB08lH6J50O63uOA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/graph/-/graph-2.7.0.tgz}
+  /@parcel/graph/2.8.3:
+    resolution: {integrity: sha512-26GL8fYZPdsRhSXCZ0ZWliloK6DHlMJPWh6Z+3VVZ5mnDSbYg/rRKWmrkhnr99ZWmL9rJsv4G74ZwvDEXTMPBg==}
     engines: {node: '>= 12.0.0'}
     dependencies:
-      '@parcel/utils': 2.7.0
       nullthrows: 1.1.1
     dev: false
 
-  /@parcel/hash/2.7.0:
-    resolution: {integrity: sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==}
+  /@parcel/hash/2.8.3:
+    resolution: {integrity: sha512-FVItqzjWmnyP4ZsVgX+G00+6U2IzOvqDtdwQIWisCcVoXJFCqZJDy6oa2qDDFz96xCCCynjRjPdQx2jYBCpfYw==}
     engines: {node: '>= 12.0.0'}
     dependencies:
       detect-libc: 1.0.3
       xxhash-wasm: 0.4.2
     dev: false
 
-  /@parcel/logger/2.7.0:
-    resolution: {integrity: sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==}
+  /@parcel/logger/2.8.3:
+    resolution: {integrity: sha512-Kpxd3O/Vs7nYJIzkdmB6Bvp3l/85ydIxaZaPfGSGTYOfaffSOTkhcW9l6WemsxUrlts4za6CaEWcc4DOvaMOPA==}
     engines: {node: '>= 12.0.0'}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/events': 2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/events': 2.8.3
     dev: false
 
-  /@parcel/markdown-ansi/2.7.0:
-    resolution: {integrity: sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==}
+  /@parcel/markdown-ansi/2.8.3:
+    resolution: {integrity: sha512-4v+pjyoh9f5zuU/gJlNvNFGEAb6J90sOBwpKJYJhdWXLZMNFCVzSigxrYO+vCsi8G4rl6/B2c0LcwIMjGPHmFQ==}
     engines: {node: '>= 12.0.0'}
     dependencies:
       chalk: 4.1.2
     dev: false
 
-  /@parcel/namer-default/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-lIKMdsmi//7fepecNDYmJYzBlL91HifPsX03lJCdu1dC6q5fBs+gG0XjKKG7yPnSCw1qH/4m7drzt9+dRZYAHQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/namer-default/-/namer-default-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/namer-default/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-tJ7JehZviS5QwnxbARd8Uh63rkikZdZs1QOyivUhEvhN+DddSAVEdQLHGPzkl3YRk0tjFhbqo+Jci7TpezuAMw==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       nullthrows: 1.1.1
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/node-resolver-core/2.7.0:
-    resolution: {integrity: sha512-5UJQHalqMxdhJIs2hhqQzFfQpF7+NAowsRq064lYtiRvcD8wMr3OOQ9wd1iazGpFSl4JKdT7BwDU9/miDJmanQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/node-resolver-core/-/node-resolver-core-2.7.0.tgz}
+  /@parcel/node-resolver-core/2.8.3:
+    resolution: {integrity: sha512-12YryWcA5Iw2WNoEVr/t2HDjYR1iEzbjEcxfh1vaVDdZ020PiGw67g5hyIE/tsnG7SRJ0xdRx1fQ2hDgED+0Ww==}
     engines: {node: '>= 12.0.0'}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/utils': 2.8.3
       nullthrows: 1.1.1
       semver: 5.7.1
     dev: false
 
-  /@parcel/optimizer-css/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-IfnOMACqhcAclKyOW9X9JpsknB6OShk9OVvb8EvbDTKHJhQHNNmzE88OkSI/pS3ZVZP9Zj+nWcVHguV+kvDeiQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/optimizer-css/-/optimizer-css-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/optimizer-css/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-JotGAWo8JhuXsQDK0UkzeQB0UR5hDAKvAviXrjqB4KM9wZNLhLleeEAW4Hk8R9smCeQFP6Xg/N/NkLDpqMwT3g==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/css': 1.14.0
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/utils': 2.7.0
+      '@parcel/utils': 2.8.3
       browserslist: 4.21.4
+      lightningcss: 1.19.0
       nullthrows: 1.1.1
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/optimizer-htmlnano/2.7.0_bt4okovxcciljru5eqxfyq6e2a:
-    resolution: {integrity: sha512-5QrGdWS5Hi4VXE3nQNrGqugmSXt68YIsWwKRAdarOxzyULSJS3gbCiQOXqIPRJobfZjnSIcdtkyxSiCUe1inIA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/optimizer-htmlnano/2.8.3_z7ftfhsu7i56anitrxzhopodiy:
+    resolution: {integrity: sha512-L8/fHbEy8Id2a2E0fwR5eKGlv9VYDjrH9PwdJE9Za9v1O/vEsfl/0T/79/x129l5O0yB6EFQkFa20MiK3b+vOg==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      htmlnano: 2.0.3_vwmyjx2libiymgyhlnwgrk2lbe
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      htmlnano: 2.0.3_wrp22lcif6dxv2jmykrhdclx6y
       nullthrows: 1.1.1
       posthtml: 0.16.6
       svgo: 2.8.0
@@ -5095,214 +5348,214 @@ packages:
       - uncss
     dev: false
 
-  /@parcel/optimizer-image/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-EnaXz5UjR67FUu0BEcqZTT9LsbB/iFAkkghCotbnbOuC5QQsloq6tw54TKU3y+R3qsjgUoMtGxPcGfVoXxZXYw==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/optimizer-image/-/optimizer-image-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/optimizer-image/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-SD71sSH27SkCDNUNx9A3jizqB/WIJr3dsfp+JZGZC42tpD/Siim6Rqy9M4To/BpMMQIIiEXa5ofwS+DgTEiEHQ==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
-      '@parcel/workers': 2.7.0_@parcel+core@2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
+      '@parcel/workers': 2.8.3_@parcel+core@2.8.3
       detect-libc: 1.0.3
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/optimizer-svgo/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-IO1JV4NpfP3V7FrhsqCcV8pDQIHraFi1/ZvEJyssITxjH49Im/txKlwMiQuZZryAPn8Xb8g395Muawuk6AK6sg==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/optimizer-svgo/-/optimizer-svgo-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/optimizer-svgo/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-9KQed99NZnQw3/W4qBYVQ7212rzA9EqrQG019TIWJzkA9tjGBMIm2c/nXpK1tc3hQ3e7KkXkFCQ3C+ibVUnHNA==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
       svgo: 2.8.0
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/optimizer-terser/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-07VZjIO8xsl2/WmS/qHI8lI/cpu47iS9eRpqwfZEEsdk1cfz50jhWkmFudHBxiHGMfcZ//1+DdaPg9RDBWZtZA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/optimizer-terser/-/optimizer-terser-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/optimizer-terser/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-9EeQlN6zIeUWwzrzu6Q2pQSaYsYGah8MtiQ/hog9KEPlYTP60hBv/+utDyYEHSQhL7y5ym08tPX5GzBvwAD/dA==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/utils': 2.7.0
+      '@parcel/utils': 2.8.3
       nullthrows: 1.1.1
       terser: 5.10.0
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/package-manager/2.7.0:
-    resolution: {integrity: sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==}
+  /@parcel/package-manager/2.8.3:
+    resolution: {integrity: sha512-tIpY5pD2lH53p9hpi++GsODy6V3khSTX4pLEGuMpeSYbHthnOViobqIlFLsjni+QA1pfc8NNNIQwSNdGjYflVA==}
     engines: {node: '>= 12.0.0'}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/fs': 2.7.0
-      '@parcel/logger': 2.7.0
-      '@parcel/types': 2.7.0
-      '@parcel/utils': 2.7.0
-      '@parcel/workers': 2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/fs': 2.8.3
+      '@parcel/logger': 2.8.3
+      '@parcel/types': 2.8.3
+      '@parcel/utils': 2.8.3
+      '@parcel/workers': 2.8.3
       semver: 5.7.1
     dev: false
 
-  /@parcel/package-manager/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==}
+  /@parcel/package-manager/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-tIpY5pD2lH53p9hpi++GsODy6V3khSTX4pLEGuMpeSYbHthnOViobqIlFLsjni+QA1pfc8NNNIQwSNdGjYflVA==}
     engines: {node: '>= 12.0.0'}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/core': 2.7.0
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/fs': 2.7.0_@parcel+core@2.7.0
-      '@parcel/logger': 2.7.0
-      '@parcel/types': 2.7.0
-      '@parcel/utils': 2.7.0
-      '@parcel/workers': 2.7.0_@parcel+core@2.7.0
+      '@parcel/core': 2.8.3
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/fs': 2.8.3_@parcel+core@2.8.3
+      '@parcel/logger': 2.8.3
+      '@parcel/types': 2.8.3
+      '@parcel/utils': 2.8.3
+      '@parcel/workers': 2.8.3_@parcel+core@2.8.3
       semver: 5.7.1
     dev: false
 
-  /@parcel/packager-css/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-44nzZwu+ssGuiFmYM6cf/Y4iChiUZ4DUzzpegnGlhXtKJKe4NHntxThJynuRZWKN2AAf48avApDpimg2jW0KDw==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/packager-css/-/packager-css-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/packager-css/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-WyvkMmsurlHG8d8oUVm7S+D+cC/T3qGeqogb7sTI52gB6uiywU7lRCizLNqGFyFGIxcVTVHWnSHqItBcLN76lA==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/utils': 2.7.0
+      '@parcel/utils': 2.8.3
       nullthrows: 1.1.1
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/packager-html/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-Zgqd7sdcY/UnR370GR0q2ilmEohUDXsO8A1F28QCJzIsR1iCB6KRUT74+pawfQ1IhXZLaaFLLYe0UWcfm0JeXg==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/packager-html/-/packager-html-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/packager-html/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-OhPu1Hx1RRKJodpiu86ZqL8el2Aa4uhBHF6RAL1Pcrh2EhRRlPf70Sk0tC22zUpYL7es+iNKZ/n0Rl+OWSHWEw==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/types': 2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/types': 2.8.3
+      '@parcel/utils': 2.8.3
       nullthrows: 1.1.1
       posthtml: 0.16.6
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/packager-js/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-wTRdM81PgRVDzWGXdWmqLwguWnTYWzhEDdjXpW2n8uMOu/CjHhMtogk65aaYk3GOnq6OBL/NsrmBiV/zKPj1vA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/packager-js/-/packager-js-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/packager-js/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-0pGKC3Ax5vFuxuZCRB+nBucRfFRz4ioie19BbDxYnvBxrd4M3FIu45njf6zbBYsI9eXqaDnL1b3DcZJfYqtIzw==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/hash': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/hash': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/utils': 2.7.0
+      '@parcel/utils': 2.8.3
       globals: 13.20.0
       nullthrows: 1.1.1
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/packager-raw/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-jg2Zp8dI5VpIQlaeahXDCfrPN9m/DKht1NkR9P2CylMAwqCcc1Xc1RRiF0wfwcPZpPMpq1265n+4qnB7rjGBlA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/packager-raw/-/packager-raw-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/packager-raw/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-BA6enNQo1RCnco9MhkxGrjOk59O71IZ9DPKu3lCtqqYEVd823tXff2clDKHK25i6cChmeHu6oB1Rb73hlPqhUA==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/packager-svg/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-EmJg3HpD6/xxKBjir/CdCKJZwI24iVfBuxRS9LUp3xHAIebOzVh1z6IN+i2Di5+NyRwfOFaLliL4uMa1zwbyCA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/packager-svg/-/packager-svg-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/packager-svg/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-mvIoHpmv5yzl36OjrklTDFShLUfPFTwrmp1eIwiszGdEBuQaX7JVI3Oo2jbVQgcN4W7J6SENzGQ3Q5hPTW3pMw==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/types': 2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/types': 2.8.3
+      '@parcel/utils': 2.8.3
       posthtml: 0.16.6
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/plugin/2.7.0:
-    resolution: {integrity: sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==}
+  /@parcel/plugin/2.8.3:
+    resolution: {integrity: sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==}
     engines: {node: '>= 12.0.0'}
     dependencies:
-      '@parcel/types': 2.7.0
+      '@parcel/types': 2.8.3
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/plugin/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==}
+  /@parcel/plugin/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==}
     engines: {node: '>= 12.0.0'}
     dependencies:
-      '@parcel/types': 2.7.0_@parcel+core@2.7.0
+      '@parcel/types': 2.8.3_@parcel+core@2.8.3
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/reporter-dev-server/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-ySuou5addK8fGue8aXzo536BaEjMujDrEc1xkp4TasInXHVcA98b+SYX5NAZTGob5CxKvZQ5ylhg77zW30B+iA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/reporter-dev-server/-/reporter-dev-server-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/reporter-dev-server/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-Y8C8hzgzTd13IoWTj+COYXEyCkXfmVJs3//GDBsH22pbtSFMuzAZd+8J9qsCo0EWpiDow7V9f1LischvEh3FbQ==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/resolver-default/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-v8TvWsbLK7/q7n4gv6OrYNbW18xUx4zKbVMGZb1u4yMhzEH4HFr1D9OeoTq3jk+ximAigds8B6triQbL5exF7A==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/resolver-default/-/resolver-default-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/resolver-default/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-k0B5M/PJ+3rFbNj4xZSBr6d6HVIe6DH/P3dClLcgBYSXAvElNDfXgtIimbjCyItFkW9/BfcgOVKEEIZOeySH/A==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/node-resolver-core': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/node-resolver-core': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/runtime-browser-hmr/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-PLbMLdclQeYsi2LkilZVGFV1n3y55G1jaBvby4ekedUZjMw3SWdMY2tDxgSDdFWfLCnYHJXdGUQSzGGi1kPzjA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/runtime-browser-hmr/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-2O1PYi2j/Q0lTyGNV3JdBYwg4rKo6TEVFlYGdd5wCYU9ZIN9RRuoCnWWH2qCPj3pjIVtBeppYxzfVjPEHINWVg==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/runtime-js/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-9/YUZTBNrSN2H6rbz/o1EOM0O7I3ZR/x9IDzxjJBD6Mi+0uCgCD02aedare/SNr1qgnbZZWmhpOzC+YgREcfLA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/runtime-js/-/runtime-js-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/runtime-js/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-IRja0vNKwvMtPgIqkBQh0QtRn0XcxNC8HU1jrgWGRckzu10qJWO+5ULgtOeR4pv9krffmMPqywGXw6l/gvJKYQ==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
       nullthrows: 1.1.1
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/runtime-react-refresh/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-vDKO0rWqRzEpmvoZ4kkYUiSsTxT5NnH904BFPFxKI0wJCl6yEmPuEifmATo73OuYhP6jIP3Qfl1R4TtiDFPJ1Q==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/runtime-react-refresh/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-2v/qFKp00MfG0234OdOgQNAo6TLENpFYZMbVbAsPMY9ITiqG73MrEsrGXVoGbYiGTMB/Toer/lSWlJxtacOCuA==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
       react-error-overlay: 6.0.9
       react-refresh: 0.9.0
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/runtime-service-worker/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-uD2pAV0yV6+e7JaWH4KVPbG+zRCrxr/OACyS9tIh+Q/R1vRmh8zGM3yhdrcoiZ7tFOnM72vd6xY11eTrUsSVig==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/runtime-service-worker/-/runtime-service-worker-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/runtime-service-worker/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-/Skkw+EeRiwzOJso5fQtK8c9b452uWLNhQH1ISTodbmlcyB4YalAiSsyHCtMYD0c3/t5Sx4ZS7vxBAtQd0RvOw==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
       nullthrows: 1.1.1
     transitivePeerDependencies:
       - '@parcel/core'
@@ -5315,14 +5568,14 @@ packages:
       detect-libc: 1.0.3
     dev: false
 
-  /@parcel/transformer-babel/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-7iklDXXnKH1530+QbI+e4kIJ+Q1puA1ulRS10db3aUJMj5GnvXGDFwhSZ7+T1ps66QHO7cVO29VlbqiRDarH1Q==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-babel/-/transformer-babel-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-babel/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-L6lExfpvvC7T/g3pxf3CIJRouQl+sgrSzuWQ0fD4PemUDHvHchSP4SNUVnd6gOytF3Y1KpnEZIunQGi5xVqQCQ==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/utils': 2.7.0
+      '@parcel/utils': 2.8.3
       browserslist: 4.21.4
       json5: 2.2.1
       nullthrows: 1.1.1
@@ -5331,63 +5584,64 @@ packages:
       - '@parcel/core'
     dev: false
 
-  /@parcel/transformer-css/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-J4EpWK9spQpXyNCmKK8Xnane0xW/1B/EAmfp7Fiv7g+5yUjY4ODf4KUugvE+Eb2gekPkhOKNHermO2KrX0/PFA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-css/-/transformer-css-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-css/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-xTqFwlSXtnaYen9ivAgz+xPW7yRl/u4QxtnDyDpz5dr8gSeOpQYRcjkd4RsYzKsWzZcGtB5EofEk8ayUbWKEUg==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/css': 1.14.0
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/utils': 2.7.0
+      '@parcel/utils': 2.8.3
       browserslist: 4.21.4
+      lightningcss: 1.19.0
       nullthrows: 1.1.1
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/transformer-html/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-wYJl5rn81W+Rlk9oQwDJcjoVsWVDKyeri84FzmlGXOsg0EYgnqOiG+3MDM8GeZjfuGe5fuoum4eqZeS0WdUHXw==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-html/-/transformer-html-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-html/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-kIZO3qsMYTbSnSpl9cnZog+SwL517ffWH54JeB410OSAYF1ouf4n5v9qBnALZbuCCmPwJRGs4jUtE452hxwN4g==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/hash': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/hash': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       nullthrows: 1.1.1
       posthtml: 0.16.6
       posthtml-parser: 0.10.2
       posthtml-render: 3.0.0
       semver: 5.7.1
+      srcset: 4.0.0
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/transformer-image/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-mhi9/R5/ULhCkL2COVIKhNFoLDiZwQgprdaTJr5fnODggVxEX5o7ebFV6KNLMTEkwZUJWoB1hL0ziI0++DtoFA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-image/-/transformer-image-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-image/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-cO4uptcCGTi5H6bvTrAWEFUsTNhA4kCo8BSvRSCHA2sf/4C5tGQPHt3JhdO0GQLPwZRCh/R41EkJs5HZ8A8DAg==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/core': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
-      '@parcel/workers': 2.7.0_@parcel+core@2.7.0
+      '@parcel/core': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
+      '@parcel/workers': 2.8.3_@parcel+core@2.8.3
       nullthrows: 1.1.1
     dev: false
 
-  /@parcel/transformer-js/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-mzerR+D4rDomUSIk5RSTa2w+DXBdXUeQrpDO74WCDdpDi1lIl8ppFpqtmU7O6y6p8QsgkmS9b0g/vhcry6CJTA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-js/-/transformer-js-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-js/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-9Qd6bib+sWRcpovvzvxwy/PdFrLUXGfmSW9XcVVG8pvgXsZPFaNjnNT8stzGQj1pQiougCoxMY4aTM5p1lGHEQ==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/core': 2.7.0
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/core': 2.8.3
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/utils': 2.7.0
-      '@parcel/workers': 2.7.0_@parcel+core@2.7.0
-      '@swc/helpers': 0.4.11
+      '@parcel/utils': 2.8.3
+      '@parcel/workers': 2.8.3_@parcel+core@2.8.3
+      '@swc/helpers': 0.4.14
       browserslist: 4.21.4
       detect-libc: 1.0.3
       nullthrows: 1.1.1
@@ -5395,24 +5649,24 @@ packages:
       semver: 5.7.1
     dev: false
 
-  /@parcel/transformer-json/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-RQjuxBpYOch+kr4a0zi77KJtOLTPYRM7iq4NN80zKnA0r0dwDUCxZBtaj2l0O0o3R4MMJnm+ncP+cB7XR7dZYA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-json/-/transformer-json-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-json/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-B7LmVq5Q7bZO4ERb6NHtRuUKWGysEeaj9H4zelnyBv+wLgpo4f5FCxSE1/rTNmP9u1qHvQ3scGdK6EdSSokGPg==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       json5: 2.2.1
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/transformer-postcss/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-b6RskXBWf0MjpC9qjR2dQ1ZdRnlOiKYseG5CEovWCqM218RtdydFKz7jS+5Gxkb6qBtOG7zGPONXdPe+gTILcA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-postcss/-/transformer-postcss-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-postcss/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-e8luB/poIlz6jBsD1Izms+6ElbyzuoFVa4lFVLZnTAChI3UxPdt9p/uTsIO46HyBps/Bk8ocvt3J4YF84jzmvg==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/hash': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/hash': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
       clone: 2.1.2
       nullthrows: 1.1.1
       postcss-value-parser: 4.2.0
@@ -5421,12 +5675,12 @@ packages:
       - '@parcel/core'
     dev: false
 
-  /@parcel/transformer-posthtml/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-cP8YOiSynWJ1ycmBlhnnHeuQb2cwmklZ+BNyLUktj5p78kDy2de7VjX+dRNRHoW4H9OgEcSF4UEfDVVz5RYIhw==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-posthtml/-/transformer-posthtml-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-posthtml/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-pkzf9Smyeaw4uaRLsT41RGrPLT5Aip8ZPcntawAfIo+KivBQUV0erY1IvHYjyfFzq1ld/Fo2Ith9He6mxpPifA==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
       nullthrows: 1.1.1
       posthtml: 0.16.6
       posthtml-parser: 0.10.2
@@ -5436,33 +5690,33 @@ packages:
       - '@parcel/core'
     dev: false
 
-  /@parcel/transformer-raw/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-sDnItWCFSDez0izK1i5cgv+kXzZTbcJh4rNpVIgmE1kBLvAz608sqgcCkavb2wVJIvLesxYM+5G4p1CwkDlZ1g==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-raw/-/transformer-raw-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-raw/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-G+5cXnd2/1O3nV/pgRxVKZY/HcGSseuhAe71gQdSQftb8uJEURyUHoQ9Eh0JUD3MgWh9V+nIKoyFEZdf9T0sUQ==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/transformer-react-refresh-wrap/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-1vRmIJzyBA1nIiXTAU6tZExq2FvJj/2F0ft6KDw8GYPv0KjmdiPo/PmaZ7JeSVOM6SdXQIQCbTmp1vkMP7DtkA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-react-refresh-wrap/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-q8AAoEvBnCf/nPvgOwFwKZfEl/thwq7c2duxXkhl+tTLDRN2vGmyz4355IxCkavSX+pLWSQ5MexklSEeMkgthg==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
+      '@parcel/utils': 2.8.3
       react-refresh: 0.9.0
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/transformer-svg/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-ioER37zceuuE+K6ZrnjCyMUWEnv+63hIAFResc1OXxRhyt+7kzMz9ZqK0Mt6QMLwl1dxhkLmrU41n9IxzKZuSQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@parcel/transformer-svg/-/transformer-svg-2.7.0.tgz}
-    engines: {node: '>= 12.0.0', parcel: ^2.7.0}
+  /@parcel/transformer-svg/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-3Zr/gBzxi1ZH1fftH/+KsZU7w5GqkmxlB0ZM8ovS5E/Pl1lq1t0xvGJue9m2VuQqP8Mxfpl5qLFmsKlhaZdMIQ==}
+    engines: {node: '>= 12.0.0', parcel: ^2.8.3}
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/hash': 2.7.0
-      '@parcel/plugin': 2.7.0_@parcel+core@2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/hash': 2.8.3
+      '@parcel/plugin': 2.8.3_@parcel+core@2.8.3
       nullthrows: 1.1.1
       posthtml: 0.16.6
       posthtml-parser: 0.10.2
@@ -5472,81 +5726,83 @@ packages:
       - '@parcel/core'
     dev: false
 
-  /@parcel/types/2.7.0:
-    resolution: {integrity: sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==}
+  /@parcel/types/2.8.3:
+    resolution: {integrity: sha512-FECA1FB7+0UpITKU0D6TgGBpGxYpVSMNEENZbSJxFSajNy3wrko+zwBKQmFOLOiPcEtnGikxNs+jkFWbPlUAtw==}
     dependencies:
-      '@parcel/cache': 2.7.0
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/fs': 2.7.0
-      '@parcel/package-manager': 2.7.0
+      '@parcel/cache': 2.8.3
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/fs': 2.8.3
+      '@parcel/package-manager': 2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/workers': 2.7.0
+      '@parcel/workers': 2.8.3
       utility-types: 3.10.0
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/types/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==}
+  /@parcel/types/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-FECA1FB7+0UpITKU0D6TgGBpGxYpVSMNEENZbSJxFSajNy3wrko+zwBKQmFOLOiPcEtnGikxNs+jkFWbPlUAtw==}
     dependencies:
-      '@parcel/cache': 2.7.0_@parcel+core@2.7.0
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/fs': 2.7.0_@parcel+core@2.7.0
-      '@parcel/package-manager': 2.7.0_@parcel+core@2.7.0
+      '@parcel/cache': 2.8.3_@parcel+core@2.8.3
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/fs': 2.8.3_@parcel+core@2.8.3
+      '@parcel/package-manager': 2.8.3_@parcel+core@2.8.3
       '@parcel/source-map': 2.1.1
-      '@parcel/workers': 2.7.0_@parcel+core@2.7.0
+      '@parcel/workers': 2.8.3_@parcel+core@2.8.3
       utility-types: 3.10.0
     transitivePeerDependencies:
       - '@parcel/core'
     dev: false
 
-  /@parcel/utils/2.7.0:
-    resolution: {integrity: sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==}
+  /@parcel/utils/2.8.3:
+    resolution: {integrity: sha512-IhVrmNiJ+LOKHcCivG5dnuLGjhPYxQ/IzbnF2DKNQXWBTsYlHkJZpmz7THoeLtLliGmSOZ3ZCsbR8/tJJKmxjA==}
     engines: {node: '>= 12.0.0'}
     dependencies:
-      '@parcel/codeframe': 2.7.0
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/hash': 2.7.0
-      '@parcel/logger': 2.7.0
-      '@parcel/markdown-ansi': 2.7.0
+      '@parcel/codeframe': 2.8.3
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/hash': 2.8.3
+      '@parcel/logger': 2.8.3
+      '@parcel/markdown-ansi': 2.8.3
       '@parcel/source-map': 2.1.1
       chalk: 4.1.2
     dev: false
 
-  /@parcel/watcher/2.0.5:
-    resolution: {integrity: sha512-x0hUbjv891omnkcHD7ZOhiyyUqUUR6MNjq89JhEI3BxppeKWAm6NPQsqqRrAkCJBogdT/o/My21sXtTI9rJIsw==}
+  /@parcel/watcher/2.1.0:
+    resolution: {integrity: sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw==}
     engines: {node: '>= 10.0.0'}
     requiresBuild: true
     dependencies:
+      is-glob: 4.0.3
+      micromatch: 4.0.5
       node-addon-api: 3.2.1
       node-gyp-build: 4.5.0
     dev: false
 
-  /@parcel/workers/2.7.0:
-    resolution: {integrity: sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==}
+  /@parcel/workers/2.8.3:
+    resolution: {integrity: sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==}
     engines: {node: '>= 12.0.0'}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/logger': 2.7.0
-      '@parcel/types': 2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/logger': 2.8.3
+      '@parcel/types': 2.8.3
+      '@parcel/utils': 2.8.3
       chrome-trace-event: 1.0.3
       nullthrows: 1.1.1
     dev: false
 
-  /@parcel/workers/2.7.0_@parcel+core@2.7.0:
-    resolution: {integrity: sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==}
+  /@parcel/workers/2.8.3_@parcel+core@2.8.3:
+    resolution: {integrity: sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==}
     engines: {node: '>= 12.0.0'}
     peerDependencies:
-      '@parcel/core': ^2.7.0
+      '@parcel/core': ^2.8.3
     dependencies:
-      '@parcel/core': 2.7.0
-      '@parcel/diagnostic': 2.7.0
-      '@parcel/logger': 2.7.0
-      '@parcel/types': 2.7.0
-      '@parcel/utils': 2.7.0
+      '@parcel/core': 2.8.3
+      '@parcel/diagnostic': 2.8.3
+      '@parcel/logger': 2.8.3
+      '@parcel/types': 2.8.3
+      '@parcel/utils': 2.8.3
       chrome-trace-event: 1.0.3
       nullthrows: 1.1.1
     dev: false
@@ -5642,7 +5898,7 @@ packages:
       glob: 7.2.0
       is-reference: 1.2.1
       magic-string: 0.25.7
-      resolve: 1.20.0
+      resolve: 1.22.1
       rollup: 2.79.1
     dev: false
 
@@ -5665,7 +5921,7 @@ packages:
       builtin-modules: 3.3.0
       deepmerge: 4.2.2
       is-module: 1.0.0
-      resolve: 1.20.0
+      resolve: 1.22.1
       rollup: 2.79.1
     dev: false
 
@@ -5718,6 +5974,10 @@ packages:
 
   /@sinclair/typebox/0.24.41:
     resolution: {integrity: sha512-TJCgQurls4FipFvHeC+gfAzb+GGstL0TDwYJKQVtTeSvJIznWzP7g3bAd5gEBlr8+bIxqnWS9VGVWREDhmE8jA==}
+    dev: true
+
+  /@sinclair/typebox/0.25.24:
+    resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==}
 
   /@sindresorhus/is/0.14.0:
     resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
@@ -5770,16 +6030,16 @@ packages:
       lodash.deburr: 4.1.0
     dev: true
 
-  /@sinonjs/commons/1.8.3:
-    resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==}
+  /@sinonjs/commons/2.0.0:
+    resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==}
     dependencies:
       type-detect: 4.0.8
     dev: false
 
-  /@sinonjs/fake-timers/9.1.2:
-    resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==}
+  /@sinonjs/fake-timers/10.0.2:
+    resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==}
     dependencies:
-      '@sinonjs/commons': 1.8.3
+      '@sinonjs/commons': 2.0.0
     dev: false
 
   /@swc/core-android-arm64/1.3.0:
@@ -5924,8 +6184,8 @@ packages:
       '@swc/core-win32-x64-msvc': 1.3.0
     dev: false
 
-  /@swc/helpers/0.4.11:
-    resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==, tarball: https://packages.atlassian.com/api/npm/npm-remote/@swc/helpers/-/helpers-0.4.11.tgz}
+  /@swc/helpers/0.4.14:
+    resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
     dependencies:
       tslib: 2.5.0
     dev: false
@@ -6021,7 +6281,6 @@ packages:
       '@types/babel__generator': 7.6.3
       '@types/babel__template': 7.4.1
       '@types/babel__traverse': 7.14.2
-    dev: true
 
   /@types/babel__generator/7.6.3:
     resolution: {integrity: sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==}
@@ -6054,6 +6313,16 @@ packages:
       '@types/node': 16.11.10
       '@types/responselike': 1.0.0
 
+  /@types/chai-subset/1.3.3:
+    resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==}
+    dependencies:
+      '@types/chai': 4.3.4
+    dev: false
+
+  /@types/chai/4.3.4:
+    resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==}
+    dev: false
+
   /@types/classnames/2.3.1:
     resolution: {integrity: sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==}
     deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.
@@ -6234,12 +6503,12 @@ packages:
     resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==}
     dev: false
 
-  /@types/mini-css-extract-plugin/1.4.3_esbuild@0.16.17:
+  /@types/mini-css-extract-plugin/1.4.3_esbuild@0.17.6:
     resolution: {integrity: sha512-jyOSVaF4ie2jUGr1uohqeyDrp7ktRthdFxDKzTgbPZtl0QI5geEopW7UKD/DEfn0XgV1KEq/RnZlUmnrEAWbmg==}
     dependencies:
       '@types/node': 16.11.10
       tapable: 2.2.1
-      webpack: 5.64.2_esbuild@0.16.17
+      webpack: 5.64.2_esbuild@0.17.6
     transitivePeerDependencies:
       - '@swc/core'
       - esbuild
@@ -6526,13 +6795,13 @@ packages:
     hasBin: true
     dependencies:
       '@mapbox/node-pre-gyp': 1.0.10
-      acorn: 8.8.1
+      acorn: 8.8.2
       async-sema: 3.1.1
       bindings: 1.5.0
       estree-walker: 2.0.2
       glob: 7.2.0
       graceful-fs: 4.2.10
-      micromatch: 4.0.4
+      micromatch: 4.0.5
       node-gyp-build: 4.5.0
       resolve-from: 5.0.0
       rollup-pluginutils: 2.8.2
@@ -6546,13 +6815,13 @@ packages:
     hasBin: true
     dependencies:
       '@mapbox/node-pre-gyp': 1.0.10_supports-color@9.2.3
-      acorn: 8.8.1
+      acorn: 8.8.2
       async-sema: 3.1.1
       bindings: 1.5.0
       estree-walker: 2.0.2
       glob: 7.2.0
       graceful-fs: 4.2.10
-      micromatch: 4.0.4
+      micromatch: 4.0.5
       node-gyp-build: 4.5.0
       resolve-from: 5.0.0
       rollup-pluginutils: 2.8.2
@@ -6561,6 +6830,38 @@ packages:
       - supports-color
     dev: true
 
+  /@vitest/expect/0.28.5:
+    resolution: {integrity: sha512-gqTZwoUTwepwGIatnw4UKpQfnoyV0Z9Czn9+Lo2/jLIt4/AXLTn+oVZxlQ7Ng8bzcNkR+3DqLJ08kNr8jRmdNQ==}
+    dependencies:
+      '@vitest/spy': 0.28.5
+      '@vitest/utils': 0.28.5
+      chai: 4.3.7
+    dev: false
+
+  /@vitest/runner/0.28.5:
+    resolution: {integrity: sha512-NKkHtLB+FGjpp5KmneQjTcPLWPTDfB7ie+MmF1PnUBf/tGe2OjGxWyB62ySYZ25EYp9krR5Bw0YPLS/VWh1QiA==}
+    dependencies:
+      '@vitest/utils': 0.28.5
+      p-limit: 4.0.0
+      pathe: 1.1.0
+    dev: false
+
+  /@vitest/spy/0.28.5:
+    resolution: {integrity: sha512-7if6rsHQr9zbmvxN7h+gGh2L9eIIErgf8nSKYDlg07HHimCxp4H6I/X/DPXktVPPLQfiZ1Cw2cbDIx9fSqDjGw==}
+    dependencies:
+      tinyspy: 1.1.1
+    dev: false
+
+  /@vitest/utils/0.28.5:
+    resolution: {integrity: sha512-UyZdYwdULlOa4LTUSwZ+Paz7nBHGTT72jKwdFSV4IjHF1xsokp+CabMdhjvVhYwkLfO88ylJT46YMilnkSARZA==}
+    dependencies:
+      cli-truncate: 3.1.0
+      diff: 5.1.0
+      loupe: 2.3.6
+      picocolors: 1.0.0
+      pretty-format: 27.5.1
+    dev: false
+
   /@webassemblyjs/ast/1.11.1:
     resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==}
     dependencies:
@@ -6696,7 +6997,7 @@ packages:
     dev: true
 
   /abortcontroller-polyfill/1.7.3:
-    resolution: {integrity: sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==, tarball: https://packages.atlassian.com/api/npm/npm-remote/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz}
+    resolution: {integrity: sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==}
     dev: false
 
   /accepts/1.3.7:
@@ -6709,7 +7010,7 @@ packages:
   /acorn-globals/7.0.1:
     resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==}
     dependencies:
-      acorn: 8.8.1
+      acorn: 8.8.2
       acorn-walk: 8.2.0
     dev: false
 
@@ -6750,6 +7051,11 @@ packages:
     engines: {node: '>=0.4.0'}
     hasBin: true
 
+  /acorn/8.8.2:
+    resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
   /agent-base/6.0.2:
     resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
     engines: {node: '>= 6.0.0'}
@@ -6916,7 +7222,7 @@ packages:
     dev: true
 
   /ansi-regex/2.1.1:
-    resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=}
+    resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
     engines: {node: '>=0.10.0'}
 
   /ansi-regex/3.0.0:
@@ -6934,7 +7240,6 @@ packages:
   /ansi-regex/6.0.1:
     resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
     engines: {node: '>=12'}
-    dev: true
 
   /ansi-styles/1.1.0:
     resolution: {integrity: sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==}
@@ -6965,7 +7270,6 @@ packages:
   /ansi-styles/6.1.1:
     resolution: {integrity: sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==}
     engines: {node: '>=12'}
-    dev: true
 
   /ansi-to-html/0.7.2:
     resolution: {integrity: sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==}
@@ -7003,7 +7307,7 @@ packages:
     engines: {node: '>= 8'}
     dependencies:
       normalize-path: 3.0.0
-      picomatch: 2.3.0
+      picomatch: 2.3.1
 
   /aproba/2.0.0:
     resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
@@ -7142,6 +7446,10 @@ packages:
       object-is: 1.1.5
       util: 0.12.4
 
+  /assertion-error/1.1.0:
+    resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+    dev: false
+
   /assign-symbols/1.0.0:
     resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=}
     engines: {node: '>=0.10.0'}
@@ -7210,17 +7518,17 @@ packages:
       - supports-color
     dev: false
 
-  /babel-jest/29.3.1_@babel+core@7.20.7:
-    resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==}
+  /babel-jest/29.4.3_@babel+core@7.20.7:
+    resolution: {integrity: sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       '@babel/core': ^7.8.0
     dependencies:
       '@babel/core': 7.20.7
-      '@jest/transform': 29.3.1
-      '@types/babel__core': 7.1.19
+      '@jest/transform': 29.4.3
+      '@types/babel__core': 7.1.20
       babel-plugin-istanbul: 6.1.1
-      babel-preset-jest: 29.2.0_@babel+core@7.20.7
+      babel-preset-jest: 29.4.3_@babel+core@7.20.7
       chalk: 4.1.2
       graceful-fs: 4.2.10
       slash: 3.0.0
@@ -7240,7 +7548,7 @@ packages:
       loader-utils: 1.4.0
       make-dir: 3.1.0
       schema-utils: 2.7.1
-      webpack: 5.64.2_webpack-cli@4.9.1
+      webpack: 5.64.2_esbuild@0.17.6
 
   /babel-loader/8.2.3_webpack@5.64.2:
     resolution: {integrity: sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==}
@@ -7290,17 +7598,17 @@ packages:
     dependencies:
       '@babel/template': 7.20.7
       '@babel/types': 7.20.7
-      '@types/babel__core': 7.1.19
+      '@types/babel__core': 7.1.20
       '@types/babel__traverse': 7.14.2
     dev: false
 
-  /babel-plugin-jest-hoist/29.2.0:
-    resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==}
+  /babel-plugin-jest-hoist/29.4.3:
+    resolution: {integrity: sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@babel/template': 7.20.7
       '@babel/types': 7.20.7
-      '@types/babel__core': 7.1.19
+      '@types/babel__core': 7.1.20
       '@types/babel__traverse': 7.14.2
     dev: false
 
@@ -7401,14 +7709,14 @@ packages:
       babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.7
     dev: false
 
-  /babel-preset-jest/29.2.0_@babel+core@7.20.7:
-    resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==}
+  /babel-preset-jest/29.4.3_@babel+core@7.20.7:
+    resolution: {integrity: sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       '@babel/core': ^7.0.0
     dependencies:
       '@babel/core': 7.20.7
-      babel-plugin-jest-hoist: 29.2.0
+      babel-plugin-jest-hoist: 29.4.3
       babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.7
     dev: false
 
@@ -7427,7 +7735,7 @@ packages:
     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
 
   /base-x/3.0.9:
-    resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/base-x/-/base-x-3.0.9.tgz}
+    resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==}
     dependencies:
       safe-buffer: 5.2.1
     dev: false
@@ -7555,7 +7863,7 @@ packages:
       multicast-dns-service-types: 1.1.0
 
   /boolbase/1.0.0:
-    resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=}
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
     dev: false
 
   /boxen/1.3.0:
@@ -7811,6 +8119,11 @@ packages:
     resolution: {integrity: sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==}
     engines: {node: '>= 0.8'}
 
+  /cac/6.7.14:
+    resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+    engines: {node: '>=8'}
+    dev: false
+
   /cache-base/1.0.1:
     resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
     engines: {node: '>=0.10.0'}
@@ -7907,7 +8220,7 @@ packages:
     resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
     dependencies:
       pascal-case: 3.1.2
-      tslib: 2.3.1
+      tslib: 2.5.0
     dev: false
 
   /camelcase-css/2.0.1:
@@ -7924,7 +8237,7 @@ packages:
     dev: false
 
   /camelcase/4.1.0:
-    resolution: {integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=}
+    resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==}
     engines: {node: '>=4'}
     dev: false
 
@@ -7952,6 +8265,19 @@ packages:
     resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==}
     dev: true
 
+  /chai/4.3.7:
+    resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==}
+    engines: {node: '>=4'}
+    dependencies:
+      assertion-error: 1.1.0
+      check-error: 1.0.2
+      deep-eql: 4.1.3
+      get-func-name: 2.0.0
+      loupe: 2.3.6
+      pathval: 1.1.1
+      type-detect: 4.0.8
+    dev: false
+
   /chalk/0.5.1:
     resolution: {integrity: sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==}
     engines: {node: '>=0.10.0'}
@@ -8048,6 +8374,10 @@ packages:
   /chardet/0.7.0:
     resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
 
+  /check-error/1.0.2:
+    resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==}
+    dev: false
+
   /chokidar/2.1.8_supports-color@6.1.0:
     resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==}
     deprecated: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
@@ -8215,6 +8545,14 @@ packages:
       string-width: 1.0.2
     dev: true
 
+  /cli-truncate/3.1.0:
+    resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dependencies:
+      slice-ansi: 5.0.0
+      string-width: 5.1.2
+    dev: false
+
   /cli-width/2.2.1:
     resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==}
     dev: true
@@ -8259,7 +8597,7 @@ packages:
     engines: {node: '>=0.8'}
 
   /clone/2.1.2:
-    resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, tarball: https://packages.atlassian.com/api/npm/npm-remote/clone/-/clone-2.1.2.tgz}
+    resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
     engines: {node: '>=0.8'}
     dev: false
 
@@ -8713,13 +9051,13 @@ packages:
   /css-color-names/0.0.4:
     resolution: {integrity: sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=}
 
-  /css-declaration-sorter/6.1.3_postcss@8.4.16:
+  /css-declaration-sorter/6.1.3_postcss@8.4.21:
     resolution: {integrity: sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==}
     engines: {node: '>= 10'}
     peerDependencies:
       postcss: ^8.0.9
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
       timsort: 0.3.0
     dev: false
 
@@ -8783,42 +9121,42 @@ packages:
     engines: {node: '>=4'}
     hasBin: true
 
-  /cssnano-preset-default/5.1.7_postcss@8.4.16:
+  /cssnano-preset-default/5.1.7_postcss@8.4.21:
     resolution: {integrity: sha512-bWDjtTY+BOqrqBtsSQIbN0RLGD2Yr2CnecpP0ydHNafh9ZUEre8c8VYTaH9FEbyOt0eIfEUAYYk5zj92ioO8LA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      css-declaration-sorter: 6.1.3_postcss@8.4.16
-      cssnano-utils: 2.0.1_postcss@8.4.16
-      postcss: 8.4.16
-      postcss-calc: 8.0.0_postcss@8.4.16
-      postcss-colormin: 5.2.1_postcss@8.4.16
-      postcss-convert-values: 5.0.2_postcss@8.4.16
-      postcss-discard-comments: 5.0.1_postcss@8.4.16
-      postcss-discard-duplicates: 5.0.1_postcss@8.4.16
-      postcss-discard-empty: 5.0.1_postcss@8.4.16
-      postcss-discard-overridden: 5.0.1_postcss@8.4.16
-      postcss-merge-longhand: 5.0.4_postcss@8.4.16
-      postcss-merge-rules: 5.0.3_postcss@8.4.16
-      postcss-minify-font-values: 5.0.1_postcss@8.4.16
-      postcss-minify-gradients: 5.0.3_postcss@8.4.16
-      postcss-minify-params: 5.0.2_postcss@8.4.16
-      postcss-minify-selectors: 5.1.0_postcss@8.4.16
-      postcss-normalize-charset: 5.0.1_postcss@8.4.16
-      postcss-normalize-display-values: 5.0.1_postcss@8.4.16
-      postcss-normalize-positions: 5.0.1_postcss@8.4.16
-      postcss-normalize-repeat-style: 5.0.1_postcss@8.4.16
-      postcss-normalize-string: 5.0.1_postcss@8.4.16
-      postcss-normalize-timing-functions: 5.0.1_postcss@8.4.16
-      postcss-normalize-unicode: 5.0.1_postcss@8.4.16
-      postcss-normalize-url: 5.0.3_postcss@8.4.16
-      postcss-normalize-whitespace: 5.0.1_postcss@8.4.16
-      postcss-ordered-values: 5.0.2_postcss@8.4.16
-      postcss-reduce-initial: 5.0.1_postcss@8.4.16
-      postcss-reduce-transforms: 5.0.1_postcss@8.4.16
-      postcss-svgo: 5.0.3_postcss@8.4.16
-      postcss-unique-selectors: 5.0.2_postcss@8.4.16
+      css-declaration-sorter: 6.1.3_postcss@8.4.21
+      cssnano-utils: 2.0.1_postcss@8.4.21
+      postcss: 8.4.21
+      postcss-calc: 8.0.0_postcss@8.4.21
+      postcss-colormin: 5.2.1_postcss@8.4.21
+      postcss-convert-values: 5.0.2_postcss@8.4.21
+      postcss-discard-comments: 5.0.1_postcss@8.4.21
+      postcss-discard-duplicates: 5.0.1_postcss@8.4.21
+      postcss-discard-empty: 5.0.1_postcss@8.4.21
+      postcss-discard-overridden: 5.0.1_postcss@8.4.21
+      postcss-merge-longhand: 5.0.4_postcss@8.4.21
+      postcss-merge-rules: 5.0.3_postcss@8.4.21
+      postcss-minify-font-values: 5.0.1_postcss@8.4.21
+      postcss-minify-gradients: 5.0.3_postcss@8.4.21
+      postcss-minify-params: 5.0.2_postcss@8.4.21
+      postcss-minify-selectors: 5.1.0_postcss@8.4.21
+      postcss-normalize-charset: 5.0.1_postcss@8.4.21
+      postcss-normalize-display-values: 5.0.1_postcss@8.4.21
+      postcss-normalize-positions: 5.0.1_postcss@8.4.21
+      postcss-normalize-repeat-style: 5.0.1_postcss@8.4.21
+      postcss-normalize-string: 5.0.1_postcss@8.4.21
+      postcss-normalize-timing-functions: 5.0.1_postcss@8.4.21
+      postcss-normalize-unicode: 5.0.1_postcss@8.4.21
+      postcss-normalize-url: 5.0.3_postcss@8.4.21
+      postcss-normalize-whitespace: 5.0.1_postcss@8.4.21
+      postcss-ordered-values: 5.0.2_postcss@8.4.21
+      postcss-reduce-initial: 5.0.1_postcss@8.4.21
+      postcss-reduce-transforms: 5.0.1_postcss@8.4.21
+      postcss-svgo: 5.0.3_postcss@8.4.21
+      postcss-unique-selectors: 5.0.2_postcss@8.4.21
     dev: false
 
   /cssnano-preset-simple/3.0.0_postcss@8.2.15:
@@ -8840,25 +9178,25 @@ packages:
       cssnano-preset-simple: 3.0.0_postcss@8.2.15
       postcss: 8.2.15
 
-  /cssnano-utils/2.0.1_postcss@8.4.16:
+  /cssnano-utils/2.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
     dev: false
 
-  /cssnano/5.0.11_postcss@8.4.16:
+  /cssnano/5.0.11_postcss@8.4.21:
     resolution: {integrity: sha512-5SHM31NAAe29jvy0MJqK40zZ/8dGlnlzcfHKw00bWMVFp8LWqtuyPSFwbaoIoxvt71KWJOfg8HMRGrBR3PExCg==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      cssnano-preset-default: 5.1.7_postcss@8.4.16
+      cssnano-preset-default: 5.1.7_postcss@8.4.21
       is-resolvable: 1.1.0
       lilconfig: 2.0.4
-      postcss: 8.4.16
+      postcss: 8.4.21
       yaml: 1.10.2
     dev: false
 
@@ -9144,6 +9482,13 @@ packages:
     resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
     dev: false
 
+  /deep-eql/4.1.3:
+    resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
+    engines: {node: '>=6'}
+    dependencies:
+      type-detect: 4.0.8
+    dev: false
+
   /deep-equal/1.1.1:
     resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==}
     dependencies:
@@ -9355,8 +9700,8 @@ packages:
     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
     dependencies:
       is-url: 1.2.4
-      postcss: 8.4.16
-      postcss-values-parser: 6.0.2_postcss@8.4.16
+      postcss: 8.4.21
+      postcss-values-parser: 6.0.2_postcss@8.4.21
     dev: true
 
   /detective-sass/4.0.1:
@@ -9416,8 +9761,8 @@ packages:
   /didyoumean/1.2.2:
     resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
 
-  /diff-sequences/29.3.1:
-    resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==}
+  /diff-sequences/29.4.3:
+    resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dev: false
 
@@ -9425,6 +9770,11 @@ packages:
     resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
     engines: {node: '>=0.3.1'}
 
+  /diff/5.1.0:
+    resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
+    engines: {node: '>=0.3.1'}
+    dev: false
+
   /diffie-hellman/5.0.3:
     resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
     dependencies:
@@ -9519,7 +9869,7 @@ packages:
     resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
     dependencies:
       no-case: 3.0.4
-      tslib: 2.3.1
+      tslib: 2.5.0
     dev: false
 
   /dot-prop/5.3.0:
@@ -9544,7 +9894,7 @@ packages:
     dev: true
 
   /dotenv-expand/5.1.0:
-    resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/dotenv-expand/-/dotenv-expand-5.1.0.tgz}
+    resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==}
     dev: false
 
   /dotenv/16.0.2:
@@ -9553,7 +9903,7 @@ packages:
     dev: true
 
   /dotenv/7.0.0:
-    resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==, tarball: https://packages.atlassian.com/api/npm/npm-remote/dotenv/-/dotenv-7.0.0.tgz}
+    resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==}
     engines: {node: '>=6'}
     dev: false
 
@@ -9588,7 +9938,6 @@ packages:
 
   /eastasianwidth/0.2.0:
     resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
-    dev: true
 
   /ecdsa-sig-formatter/1.0.11:
     resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
@@ -9631,7 +9980,6 @@ packages:
 
   /emoji-regex/9.2.2:
     resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
-    dev: true
 
   /emojis-list/2.1.0:
     resolution: {integrity: sha1-TapNnbAPmBmIDHn6RXrlsJof04k=}
@@ -9681,7 +10029,7 @@ packages:
     resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
 
   /entities/3.0.1:
-    resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==, tarball: https://packages.atlassian.com/api/npm/npm-remote/entities/-/entities-3.0.1.tgz}
+    resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==}
     engines: {node: '>=0.12'}
     dev: false
 
@@ -9939,6 +10287,36 @@ packages:
       '@esbuild/win32-arm64': 0.16.17
       '@esbuild/win32-ia32': 0.16.17
       '@esbuild/win32-x64': 0.16.17
+    dev: false
+
+  /esbuild/0.17.6:
+    resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/android-arm': 0.17.6
+      '@esbuild/android-arm64': 0.17.6
+      '@esbuild/android-x64': 0.17.6
+      '@esbuild/darwin-arm64': 0.17.6
+      '@esbuild/darwin-x64': 0.17.6
+      '@esbuild/freebsd-arm64': 0.17.6
+      '@esbuild/freebsd-x64': 0.17.6
+      '@esbuild/linux-arm': 0.17.6
+      '@esbuild/linux-arm64': 0.17.6
+      '@esbuild/linux-ia32': 0.17.6
+      '@esbuild/linux-loong64': 0.17.6
+      '@esbuild/linux-mips64el': 0.17.6
+      '@esbuild/linux-ppc64': 0.17.6
+      '@esbuild/linux-riscv64': 0.17.6
+      '@esbuild/linux-s390x': 0.17.6
+      '@esbuild/linux-x64': 0.17.6
+      '@esbuild/netbsd-x64': 0.17.6
+      '@esbuild/openbsd-x64': 0.17.6
+      '@esbuild/sunos-x64': 0.17.6
+      '@esbuild/win32-arm64': 0.17.6
+      '@esbuild/win32-ia32': 0.17.6
+      '@esbuild/win32-x64': 0.17.6
 
   /escalade/3.1.1:
     resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
@@ -10064,7 +10442,7 @@ packages:
     dev: true
 
   /execa/0.7.0:
-    resolution: {integrity: sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=}
+    resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==}
     engines: {node: '>=4'}
     dependencies:
       cross-spawn: 5.1.0
@@ -10169,11 +10547,22 @@ packages:
     resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/expect-utils': 29.3.1
-      jest-get-type: 29.2.0
-      jest-matcher-utils: 29.3.1
-      jest-message-util: 29.3.1
-      jest-util: 29.3.1
+      '@jest/expect-utils': 29.4.3
+      jest-get-type: 29.4.3
+      jest-matcher-utils: 29.4.3
+      jest-message-util: 29.4.3
+      jest-util: 29.4.3
+    dev: false
+
+  /expect/29.4.3:
+    resolution: {integrity: sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/expect-utils': 29.4.3
+      jest-get-type: 29.4.3
+      jest-matcher-utils: 29.4.3
+      jest-message-util: 29.4.3
+      jest-util: 29.4.3
     dev: false
 
   /express-logging/1.1.1:
@@ -10660,7 +11049,7 @@ packages:
   /find-yarn-workspace-root2/1.2.16:
     resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==}
     dependencies:
-      micromatch: 4.0.4
+      micromatch: 4.0.5
       pkg-dir: 4.2.0
     dev: false
 
@@ -10873,6 +11262,10 @@ packages:
     resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
     engines: {node: 6.* || 8.* || >= 10.*}
 
+  /get-func-name/2.0.0:
+    resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==}
+    dev: false
+
   /get-intrinsic/1.1.1:
     resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==}
     dependencies:
@@ -11059,7 +11452,7 @@ packages:
     engines: {node: '>=4'}
 
   /globals/13.20.0:
-    resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/globals/-/globals-13.20.0.tgz}
+    resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
     engines: {node: '>=8'}
     dependencies:
       type-fest: 0.20.2
@@ -11573,8 +11966,8 @@ packages:
       webpack: 5.64.2_webpack-cli@4.9.1
     dev: false
 
-  /htmlnano/2.0.3_vwmyjx2libiymgyhlnwgrk2lbe:
-    resolution: {integrity: sha512-S4PGGj9RbdgW8LhbILNK7W9JhmYP8zmDY7KDV/8eCiJBQJlbmltp5I0gv8c5ntLljfdxxfmJ+UJVSqyH4mb41A==, tarball: https://packages.atlassian.com/api/npm/npm-remote/htmlnano/-/htmlnano-2.0.3.tgz}
+  /htmlnano/2.0.3_wrp22lcif6dxv2jmykrhdclx6y:
+    resolution: {integrity: sha512-S4PGGj9RbdgW8LhbILNK7W9JhmYP8zmDY7KDV/8eCiJBQJlbmltp5I0gv8c5ntLljfdxxfmJ+UJVSqyH4mb41A==}
     peerDependencies:
       cssnano: ^5.0.11
       postcss: ^8.3.11
@@ -11603,8 +11996,8 @@ packages:
         optional: true
     dependencies:
       cosmiconfig: 7.0.1
-      cssnano: 5.0.11_postcss@8.4.16
-      postcss: 8.4.16
+      cssnano: 5.0.11_postcss@8.4.21
+      postcss: 8.4.21
       posthtml: 0.16.6
       svgo: 2.8.0
       timsort: 0.3.0
@@ -11620,7 +12013,7 @@ packages:
     dev: false
 
   /htmlparser2/7.2.0:
-    resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==, tarball: https://packages.atlassian.com/api/npm/npm-remote/htmlparser2/-/htmlparser2-7.2.0.tgz}
+    resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==}
     dependencies:
       domelementtype: 2.2.0
       domhandler: 4.2.2
@@ -11712,7 +12105,7 @@ packages:
       http-proxy: 1.18.1
       is-glob: 4.0.3
       is-plain-obj: 3.0.0
-      micromatch: 4.0.4
+      micromatch: 4.0.5
     transitivePeerDependencies:
       - debug
     dev: false
@@ -11730,7 +12123,7 @@ packages:
       http-proxy: 1.18.1_debug@4.3.4
       is-glob: 4.0.3
       is-plain-obj: 3.0.0
-      micromatch: 4.0.4
+      micromatch: 4.0.5
     transitivePeerDependencies:
       - debug
     dev: true
@@ -11908,7 +12301,7 @@ packages:
       wrappy: 1.0.2
 
   /inherits/2.0.3:
-    resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=}
+    resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
 
   /inherits/2.0.4:
     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@@ -12029,7 +12422,7 @@ packages:
       has-tostringtag: 1.0.0
 
   /is-arrayish/0.2.1:
-    resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=}
+    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
 
   /is-arrayish/0.3.2:
     resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
@@ -12173,7 +12566,7 @@ packages:
     dev: true
 
   /is-fullwidth-code-point/2.0.0:
-    resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=}
+    resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==}
     engines: {node: '>=4'}
 
   /is-fullwidth-code-point/3.0.0:
@@ -12183,7 +12576,6 @@ packages:
   /is-fullwidth-code-point/4.0.0:
     resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
     engines: {node: '>=12'}
-    dev: true
 
   /is-generator-fn/2.1.0:
     resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
@@ -12232,7 +12624,7 @@ packages:
     dev: true
 
   /is-json/2.0.1:
-    resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/is-json/-/is-json-2.0.1.tgz}
+    resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==}
     dev: false
 
   /is-lower-case/1.1.3:
@@ -12562,43 +12954,43 @@ packages:
     resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==}
     dev: false
 
-  /jest-changed-files/29.2.0:
-    resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==}
+  /jest-changed-files/29.4.3:
+    resolution: {integrity: sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       execa: 5.1.1
       p-limit: 3.1.0
     dev: false
 
-  /jest-circus/29.3.1:
-    resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==}
+  /jest-circus/29.4.3:
+    resolution: {integrity: sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/environment': 29.3.1
-      '@jest/expect': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/environment': 29.4.3
+      '@jest/expect': 29.4.3
+      '@jest/test-result': 29.4.3
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
       chalk: 4.1.2
       co: 4.6.0
       dedent: 0.7.0
       is-generator-fn: 2.1.0
-      jest-each: 29.3.1
-      jest-matcher-utils: 29.3.1
-      jest-message-util: 29.3.1
-      jest-runtime: 29.3.1
-      jest-snapshot: 29.3.1
-      jest-util: 29.3.1
+      jest-each: 29.4.3
+      jest-matcher-utils: 29.4.3
+      jest-message-util: 29.4.3
+      jest-runtime: 29.4.3
+      jest-snapshot: 29.4.3
+      jest-util: 29.4.3
       p-limit: 3.1.0
-      pretty-format: 29.3.1
+      pretty-format: 29.4.3
       slash: 3.0.0
       stack-utils: 2.0.5
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /jest-cli/29.3.1_ts-node@10.9.1:
-    resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==}
+  /jest-cli/29.4.3_ts-node@10.9.1:
+    resolution: {integrity: sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
     peerDependencies:
@@ -12607,16 +12999,16 @@ packages:
       node-notifier:
         optional: true
     dependencies:
-      '@jest/core': 29.3.1_ts-node@10.9.1
-      '@jest/test-result': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/core': 29.4.3_ts-node@10.9.1
+      '@jest/test-result': 29.4.3
+      '@jest/types': 29.4.3
       chalk: 4.1.2
       exit: 0.1.2
       graceful-fs: 4.2.10
       import-local: 3.0.3
-      jest-config: 29.3.1_ts-node@10.9.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
+      jest-config: 29.4.3_ts-node@10.9.1
+      jest-util: 29.4.3
+      jest-validate: 29.4.3
       prompts: 2.4.2
       yargs: 17.5.1
     transitivePeerDependencies:
@@ -12625,8 +13017,8 @@ packages:
       - ts-node
     dev: false
 
-  /jest-config/29.3.1_dzldzuw4l36u5566gumx6niqti:
-    resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==}
+  /jest-config/29.4.3_dzldzuw4l36u5566gumx6niqti:
+    resolution: {integrity: sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       '@types/node': '*'
@@ -12638,26 +13030,26 @@ packages:
         optional: true
     dependencies:
       '@babel/core': 7.20.7
-      '@jest/test-sequencer': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/test-sequencer': 29.4.3
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
-      babel-jest: 29.3.1_@babel+core@7.20.7
+      babel-jest: 29.4.3_@babel+core@7.20.7
       chalk: 4.1.2
       ci-info: 3.3.0
       deepmerge: 4.2.2
       glob: 7.2.0
       graceful-fs: 4.2.10
-      jest-circus: 29.3.1
-      jest-environment-node: 29.3.1
-      jest-get-type: 29.2.0
-      jest-regex-util: 29.2.0
-      jest-resolve: 29.3.1
-      jest-runner: 29.3.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      micromatch: 4.0.4
+      jest-circus: 29.4.3
+      jest-environment-node: 29.4.3
+      jest-get-type: 29.4.3
+      jest-regex-util: 29.4.3
+      jest-resolve: 29.4.3
+      jest-runner: 29.4.3
+      jest-util: 29.4.3
+      jest-validate: 29.4.3
+      micromatch: 4.0.5
       parse-json: 5.2.0
-      pretty-format: 29.3.1
+      pretty-format: 29.4.3
       slash: 3.0.0
       strip-json-comments: 3.1.1
       ts-node: 10.9.1_djsbtcegmovallx2poba2t3laq
@@ -12665,8 +13057,8 @@ packages:
       - supports-color
     dev: false
 
-  /jest-config/29.3.1_ts-node@10.9.1:
-    resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==}
+  /jest-config/29.4.3_ts-node@10.9.1:
+    resolution: {integrity: sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       '@types/node': '*'
@@ -12678,25 +13070,25 @@ packages:
         optional: true
     dependencies:
       '@babel/core': 7.20.7
-      '@jest/test-sequencer': 29.3.1
-      '@jest/types': 29.3.1
-      babel-jest: 29.3.1_@babel+core@7.20.7
+      '@jest/test-sequencer': 29.4.3
+      '@jest/types': 29.4.3
+      babel-jest: 29.4.3_@babel+core@7.20.7
       chalk: 4.1.2
       ci-info: 3.3.0
       deepmerge: 4.2.2
       glob: 7.2.0
       graceful-fs: 4.2.10
-      jest-circus: 29.3.1
-      jest-environment-node: 29.3.1
-      jest-get-type: 29.2.0
-      jest-regex-util: 29.2.0
-      jest-resolve: 29.3.1
-      jest-runner: 29.3.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      micromatch: 4.0.4
+      jest-circus: 29.4.3
+      jest-environment-node: 29.4.3
+      jest-get-type: 29.4.3
+      jest-regex-util: 29.4.3
+      jest-resolve: 29.4.3
+      jest-runner: 29.4.3
+      jest-util: 29.4.3
+      jest-validate: 29.4.3
+      micromatch: 4.0.5
       parse-json: 5.2.0
-      pretty-format: 29.3.1
+      pretty-format: 29.4.3
       slash: 3.0.0
       strip-json-comments: 3.1.1
       ts-node: 10.9.1_djsbtcegmovallx2poba2t3laq
@@ -12704,36 +13096,36 @@ packages:
       - supports-color
     dev: false
 
-  /jest-diff/29.3.1:
-    resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==}
+  /jest-diff/29.4.3:
+    resolution: {integrity: sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       chalk: 4.1.2
-      diff-sequences: 29.3.1
-      jest-get-type: 29.2.0
-      pretty-format: 29.3.1
+      diff-sequences: 29.4.3
+      jest-get-type: 29.4.3
+      pretty-format: 29.4.3
     dev: false
 
-  /jest-docblock/29.2.0:
-    resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==}
+  /jest-docblock/29.4.3:
+    resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       detect-newline: 3.1.0
     dev: false
 
-  /jest-each/29.3.1:
-    resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==}
+  /jest-each/29.4.3:
+    resolution: {integrity: sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 29.3.1
+      '@jest/types': 29.4.3
       chalk: 4.1.2
-      jest-get-type: 29.2.0
-      jest-util: 29.3.1
-      pretty-format: 29.3.1
+      jest-get-type: 29.4.3
+      jest-util: 29.4.3
+      pretty-format: 29.4.3
     dev: false
 
-  /jest-environment-jsdom/29.3.1:
-    resolution: {integrity: sha512-G46nKgiez2Gy4zvYNhayfMEAFlVHhWfncqvqS6yCd0i+a4NsSUD2WtrKSaYQrYiLQaupHXxCRi8xxVL2M9PbhA==}
+  /jest-environment-jsdom/29.4.3:
+    resolution: {integrity: sha512-rFjf8JXrw3OjUzzmSE5l0XjMj0/MSVEUMCSXBGPDkfwb1T03HZI7iJSL0cGctZApPSyJxbjyKDVxkZuyhHkuTw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
       canvas: ^2.5.0
@@ -12741,13 +13133,13 @@ packages:
       canvas:
         optional: true
     dependencies:
-      '@jest/environment': 29.3.1
-      '@jest/fake-timers': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/environment': 29.4.3
+      '@jest/fake-timers': 29.4.3
+      '@jest/types': 29.4.3
       '@types/jsdom': 20.0.1
       '@types/node': 16.11.10
-      jest-mock: 29.3.1
-      jest-util: 29.3.1
+      jest-mock: 29.4.3
+      jest-util: 29.4.3
       jsdom: 20.0.3
     transitivePeerDependencies:
       - bufferutil
@@ -12755,16 +13147,16 @@ packages:
       - utf-8-validate
     dev: false
 
-  /jest-environment-node/29.3.1:
-    resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==}
+  /jest-environment-node/29.4.3:
+    resolution: {integrity: sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/environment': 29.3.1
-      '@jest/fake-timers': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/environment': 29.4.3
+      '@jest/fake-timers': 29.4.3
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
-      jest-mock: 29.3.1
-      jest-util: 29.3.1
+      jest-mock: 29.4.3
+      jest-util: 29.4.3
     dev: false
 
   /jest-get-type/25.2.6:
@@ -12777,8 +13169,8 @@ packages:
     engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
     dev: true
 
-  /jest-get-type/29.2.0:
-    resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==}
+  /jest-get-type/29.4.3:
+    resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dev: false
 
@@ -12796,7 +13188,7 @@ packages:
       jest-serializer: 27.0.6
       jest-util: 27.3.1
       jest-worker: 27.3.1
-      micromatch: 4.0.4
+      micromatch: 4.0.5
       walker: 1.0.8
     optionalDependencies:
       fsevents: 2.3.2
@@ -12806,63 +13198,83 @@ packages:
     resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 29.3.1
+      '@jest/types': 29.4.3
       '@types/graceful-fs': 4.1.5
       '@types/node': 16.11.10
       anymatch: 3.1.2
       fb-watchman: 2.0.1
       graceful-fs: 4.2.10
       jest-regex-util: 29.2.0
-      jest-util: 29.3.1
+      jest-util: 29.4.3
       jest-worker: 29.3.1
       micromatch: 4.0.4
       walker: 1.0.8
     optionalDependencies:
       fsevents: 2.3.2
+    dev: true
 
-  /jest-leak-detector/29.3.1:
-    resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==}
+  /jest-haste-map/29.4.3:
+    resolution: {integrity: sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      jest-get-type: 29.2.0
-      pretty-format: 29.3.1
+      '@jest/types': 29.4.3
+      '@types/graceful-fs': 4.1.5
+      '@types/node': 16.11.10
+      anymatch: 3.1.2
+      fb-watchman: 2.0.1
+      graceful-fs: 4.2.10
+      jest-regex-util: 29.4.3
+      jest-util: 29.4.3
+      jest-worker: 29.4.3
+      micromatch: 4.0.5
+      walker: 1.0.8
+    optionalDependencies:
+      fsevents: 2.3.2
     dev: false
 
-  /jest-matcher-utils/29.3.1:
-    resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==}
+  /jest-leak-detector/29.4.3:
+    resolution: {integrity: sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      jest-get-type: 29.4.3
+      pretty-format: 29.4.3
+    dev: false
+
+  /jest-matcher-utils/29.4.3:
+    resolution: {integrity: sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       chalk: 4.1.2
-      jest-diff: 29.3.1
-      jest-get-type: 29.2.0
-      pretty-format: 29.3.1
+      jest-diff: 29.4.3
+      jest-get-type: 29.4.3
+      pretty-format: 29.4.3
     dev: false
 
-  /jest-message-util/29.3.1:
-    resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==}
+  /jest-message-util/29.4.3:
+    resolution: {integrity: sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@babel/code-frame': 7.18.6
-      '@jest/types': 29.3.1
+      '@jest/types': 29.4.3
       '@types/stack-utils': 2.0.1
       chalk: 4.1.2
       graceful-fs: 4.2.10
-      micromatch: 4.0.4
-      pretty-format: 29.3.1
+      micromatch: 4.0.5
+      pretty-format: 29.4.3
       slash: 3.0.0
       stack-utils: 2.0.5
     dev: false
 
-  /jest-mock/29.3.1:
-    resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==}
+  /jest-mock/29.4.3:
+    resolution: {integrity: sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 29.3.1
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
-      jest-util: 29.3.1
+      jest-util: 29.4.3
     dev: false
 
-  /jest-pnp-resolver/1.2.2_jest-resolve@29.3.1:
+  /jest-pnp-resolver/1.2.2_jest-resolve@29.4.3:
     resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==}
     engines: {node: '>=6'}
     peerDependencies:
@@ -12871,7 +13283,7 @@ packages:
       jest-resolve:
         optional: true
     dependencies:
-      jest-resolve: 29.3.1
+      jest-resolve: 29.4.3
     dev: false
 
   /jest-regex-util/27.0.6:
@@ -12882,85 +13294,91 @@ packages:
   /jest-regex-util/29.2.0:
     resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dev: true
+
+  /jest-regex-util/29.4.3:
+    resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dev: false
 
-  /jest-resolve-dependencies/29.3.1:
-    resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==}
+  /jest-resolve-dependencies/29.4.3:
+    resolution: {integrity: sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      jest-regex-util: 29.2.0
-      jest-snapshot: 29.3.1
+      jest-regex-util: 29.4.3
+      jest-snapshot: 29.4.3
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /jest-resolve/29.3.1:
-    resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==}
+  /jest-resolve/29.4.3:
+    resolution: {integrity: sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       chalk: 4.1.2
       graceful-fs: 4.2.10
-      jest-haste-map: 29.3.1
-      jest-pnp-resolver: 1.2.2_jest-resolve@29.3.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      resolve: 1.20.0
-      resolve.exports: 1.1.0
+      jest-haste-map: 29.4.3
+      jest-pnp-resolver: 1.2.2_jest-resolve@29.4.3
+      jest-util: 29.4.3
+      jest-validate: 29.4.3
+      resolve: 1.22.1
+      resolve.exports: 2.0.0
       slash: 3.0.0
     dev: false
 
-  /jest-runner/29.3.1:
-    resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==}
+  /jest-runner/29.4.3:
+    resolution: {integrity: sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/console': 29.3.1
-      '@jest/environment': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/console': 29.4.3
+      '@jest/environment': 29.4.3
+      '@jest/test-result': 29.4.3
+      '@jest/transform': 29.4.3
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
       chalk: 4.1.2
       emittery: 0.13.1
       graceful-fs: 4.2.10
-      jest-docblock: 29.2.0
-      jest-environment-node: 29.3.1
-      jest-haste-map: 29.3.1
-      jest-leak-detector: 29.3.1
-      jest-message-util: 29.3.1
-      jest-resolve: 29.3.1
-      jest-runtime: 29.3.1
-      jest-util: 29.3.1
-      jest-watcher: 29.3.1
-      jest-worker: 29.3.1
+      jest-docblock: 29.4.3
+      jest-environment-node: 29.4.3
+      jest-haste-map: 29.4.3
+      jest-leak-detector: 29.4.3
+      jest-message-util: 29.4.3
+      jest-resolve: 29.4.3
+      jest-runtime: 29.4.3
+      jest-util: 29.4.3
+      jest-watcher: 29.4.3
+      jest-worker: 29.4.3
       p-limit: 3.1.0
       source-map-support: 0.5.13
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /jest-runtime/29.3.1:
-    resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==}
+  /jest-runtime/29.4.3:
+    resolution: {integrity: sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/environment': 29.3.1
-      '@jest/fake-timers': 29.3.1
-      '@jest/globals': 29.3.1
-      '@jest/source-map': 29.2.0
-      '@jest/test-result': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/environment': 29.4.3
+      '@jest/fake-timers': 29.4.3
+      '@jest/globals': 29.4.3
+      '@jest/source-map': 29.4.3
+      '@jest/test-result': 29.4.3
+      '@jest/transform': 29.4.3
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
       chalk: 4.1.2
       cjs-module-lexer: 1.2.2
       collect-v8-coverage: 1.0.1
       glob: 7.2.0
       graceful-fs: 4.2.10
-      jest-haste-map: 29.3.1
-      jest-message-util: 29.3.1
-      jest-mock: 29.3.1
-      jest-regex-util: 29.2.0
-      jest-resolve: 29.3.1
-      jest-snapshot: 29.3.1
-      jest-util: 29.3.1
+      jest-haste-map: 29.4.3
+      jest-message-util: 29.4.3
+      jest-mock: 29.4.3
+      jest-regex-util: 29.4.3
+      jest-resolve: 29.4.3
+      jest-snapshot: 29.4.3
+      jest-util: 29.4.3
       slash: 3.0.0
       strip-bom: 4.0.0
     transitivePeerDependencies:
@@ -12975,8 +13393,8 @@ packages:
       graceful-fs: 4.2.10
     dev: false
 
-  /jest-snapshot/29.3.1:
-    resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==}
+  /jest-snapshot/29.4.3:
+    resolution: {integrity: sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@babel/core': 7.20.7
@@ -12985,23 +13403,23 @@ packages:
       '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.7
       '@babel/traverse': 7.20.10
       '@babel/types': 7.20.7
-      '@jest/expect-utils': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/expect-utils': 29.4.3
+      '@jest/transform': 29.4.3
+      '@jest/types': 29.4.3
       '@types/babel__traverse': 7.14.2
       '@types/prettier': 2.4.2
       babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.7
       chalk: 4.1.2
-      expect: 29.3.1
+      expect: 29.4.3
       graceful-fs: 4.2.10
-      jest-diff: 29.3.1
-      jest-get-type: 29.2.0
-      jest-haste-map: 29.3.1
-      jest-matcher-utils: 29.3.1
-      jest-message-util: 29.3.1
-      jest-util: 29.3.1
+      jest-diff: 29.4.3
+      jest-get-type: 29.4.3
+      jest-haste-map: 29.4.3
+      jest-matcher-utils: 29.4.3
+      jest-message-util: 29.4.3
+      jest-util: 29.4.3
       natural-compare: 1.4.0
-      pretty-format: 29.3.1
+      pretty-format: 29.4.3
       semver: 7.3.7
     transitivePeerDependencies:
       - supports-color
@@ -13016,19 +13434,31 @@ packages:
       chalk: 4.1.2
       ci-info: 3.3.0
       graceful-fs: 4.2.10
-      picomatch: 2.3.0
+      picomatch: 2.3.1
     dev: false
 
   /jest-util/29.3.1:
     resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 29.3.1
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
       chalk: 4.1.2
       ci-info: 3.3.0
       graceful-fs: 4.2.10
       picomatch: 2.3.0
+    dev: true
+
+  /jest-util/29.4.3:
+    resolution: {integrity: sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/types': 29.4.3
+      '@types/node': 16.11.10
+      chalk: 4.1.2
+      ci-info: 3.3.0
+      graceful-fs: 4.2.10
+      picomatch: 2.3.1
 
   /jest-validate/25.5.0:
     resolution: {integrity: sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==}
@@ -13054,29 +13484,29 @@ packages:
       pretty-format: 27.5.1
     dev: true
 
-  /jest-validate/29.3.1:
-    resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==}
+  /jest-validate/29.4.3:
+    resolution: {integrity: sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/types': 29.3.1
+      '@jest/types': 29.4.3
       camelcase: 6.2.1
       chalk: 4.1.2
-      jest-get-type: 29.2.0
+      jest-get-type: 29.4.3
       leven: 3.1.0
-      pretty-format: 29.3.1
+      pretty-format: 29.4.3
     dev: false
 
-  /jest-watcher/29.3.1:
-    resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==}
+  /jest-watcher/29.4.3:
+    resolution: {integrity: sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/test-result': 29.3.1
-      '@jest/types': 29.3.1
+      '@jest/test-result': 29.4.3
+      '@jest/types': 29.4.3
       '@types/node': 16.11.10
       ansi-escapes: 4.3.2
       chalk: 4.1.2
       emittery: 0.13.1
-      jest-util: 29.3.1
+      jest-util: 29.4.3
       string-length: 4.0.2
     dev: false
 
@@ -13110,12 +13540,23 @@ packages:
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
       '@types/node': 16.11.10
-      jest-util: 29.3.1
+      jest-util: 29.4.3
       merge-stream: 2.0.0
       supports-color: 8.1.1
+    dev: true
 
-  /jest/29.3.1_ts-node@10.9.1:
-    resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==}
+  /jest-worker/29.4.3:
+    resolution: {integrity: sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@types/node': 16.11.10
+      jest-util: 29.4.3
+      merge-stream: 2.0.0
+      supports-color: 8.1.1
+    dev: false
+
+  /jest/29.4.3_ts-node@10.9.1:
+    resolution: {integrity: sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     hasBin: true
     peerDependencies:
@@ -13124,10 +13565,10 @@ packages:
       node-notifier:
         optional: true
     dependencies:
-      '@jest/core': 29.3.1_ts-node@10.9.1
-      '@jest/types': 29.3.1
+      '@jest/core': 29.4.3_ts-node@10.9.1
+      '@jest/types': 29.4.3
       import-local: 3.0.3
-      jest-cli: 29.3.1_ts-node@10.9.1
+      jest-cli: 29.4.3_ts-node@10.9.1
     transitivePeerDependencies:
       - '@types/node'
       - supports-color
@@ -13171,7 +13612,7 @@ packages:
         optional: true
     dependencies:
       abab: 2.0.6
-      acorn: 8.8.1
+      acorn: 8.8.2
       acorn-globals: 7.0.1
       cssom: 0.5.0
       cssstyle: 2.3.0
@@ -13400,8 +13841,8 @@ packages:
       prelude-ls: 1.1.2
       type-check: 0.3.2
 
-  /lightningcss-darwin-arm64/1.16.0:
-    resolution: {integrity: sha512-gIhz6eZFwsC4oVMjBGQ3QWDdLQY7vcXFyM/x91PilgHqu63B9uBa10EZA75YoTEkbKhoz0uDCqyHh/EoF1GrkQ==}
+  /lightningcss-darwin-arm64/1.19.0:
+    resolution: {integrity: sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [darwin]
@@ -13409,8 +13850,8 @@ packages:
     dev: false
     optional: true
 
-  /lightningcss-darwin-x64/1.16.0:
-    resolution: {integrity: sha512-kLPi+OEpDj3UGY6DC8TfjbcULJDKMP+TVKSlrEkNGn8t1YRzi2g4oy7UVTSB5AnSbT0CusUItzdVjHQ49EdoNA==}
+  /lightningcss-darwin-x64/1.19.0:
+    resolution: {integrity: sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [darwin]
@@ -13418,8 +13859,8 @@ packages:
     dev: false
     optional: true
 
-  /lightningcss-linux-arm-gnueabihf/1.16.0:
-    resolution: {integrity: sha512-oSwEbvXUPr//H/ainBRJXTxHerlheee/KgkTTmAQWiVnt8HV+bRohTBWWPBy5ZArgiGLwj7ogv45istgljPN2Q==}
+  /lightningcss-linux-arm-gnueabihf/1.19.0:
+    resolution: {integrity: sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==}
     engines: {node: '>= 12.0.0'}
     cpu: [arm]
     os: [linux]
@@ -13427,48 +13868,44 @@ packages:
     dev: false
     optional: true
 
-  /lightningcss-linux-arm64-gnu/1.16.0:
-    resolution: {integrity: sha512-Drq9BSVIvmV9zsDJbCZWCulMvKMQWFIlYXPCKV/iwRj+ZAJ1BRngma0cNHB6uW7Wac8Jg04CJN5IA4ELE3J+cQ==}
+  /lightningcss-linux-arm64-gnu/1.19.0:
+    resolution: {integrity: sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [glibc]
     requiresBuild: true
     dev: false
     optional: true
 
-  /lightningcss-linux-arm64-musl/1.16.0:
-    resolution: {integrity: sha512-1QXWStnTEo4RFQf0mfGhRyNUeEHilCZ0NA97XgwKwrYr/M7sYKU/1HWY00dPxFJ6GITR2pfJGo9xi3ScSSBxbA==}
+  /lightningcss-linux-arm64-musl/1.19.0:
+    resolution: {integrity: sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [linux]
-    libc: [musl]
     requiresBuild: true
     dev: false
     optional: true
 
-  /lightningcss-linux-x64-gnu/1.16.0:
-    resolution: {integrity: sha512-gD2eQYD5OFs1p83R0TcMCEc5HRyJES4lR4THmclv7khm3dc9vc+2VT0kFBPxO1L2AwlZuvXaaMan7X1Ul7uSfA==}
+  /lightningcss-linux-x64-gnu/1.19.0:
+    resolution: {integrity: sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [glibc]
     requiresBuild: true
     dev: false
     optional: true
 
-  /lightningcss-linux-x64-musl/1.16.0:
-    resolution: {integrity: sha512-HJsKeYxloEvg2WCQhtYPqzZUliLu9JBJNeI5y9cPQeDR/7ayGGLbVhJaotPtzJkElOFL/SaXsS+FRuH4w+yafg==}
+  /lightningcss-linux-x64-musl/1.19.0:
+    resolution: {integrity: sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [linux]
-    libc: [musl]
     requiresBuild: true
     dev: false
     optional: true
 
-  /lightningcss-win32-x64-msvc/1.16.0:
-    resolution: {integrity: sha512-h4ayyAlOMLUHV9NdofcIu79aEjmly93adVxcg5wDJpkvMiwDTufEN30M8G4gGcjo1JE5jFjAcyQcRpXYkYcemA==}
+  /lightningcss-win32-x64-msvc/1.19.0:
+    resolution: {integrity: sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [win32]
@@ -13476,24 +13913,29 @@ packages:
     dev: false
     optional: true
 
-  /lightningcss/1.16.0:
-    resolution: {integrity: sha512-5+ZS9h+xeADcJTF2oRCT3yNZBlDYyOgQSdrWNBCqsIwm8ucKbF061OBVv/WHP4Zk8FToNhwFklk/hMuOngqsIg==, tarball: https://packages.atlassian.com/api/npm/npm-remote/lightningcss/-/lightningcss-1.16.0.tgz}
+  /lightningcss/1.19.0:
+    resolution: {integrity: sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==}
     engines: {node: '>= 12.0.0'}
     dependencies:
       detect-libc: 1.0.3
     optionalDependencies:
-      lightningcss-darwin-arm64: 1.16.0
-      lightningcss-darwin-x64: 1.16.0
-      lightningcss-linux-arm-gnueabihf: 1.16.0
-      lightningcss-linux-arm64-gnu: 1.16.0
-      lightningcss-linux-arm64-musl: 1.16.0
-      lightningcss-linux-x64-gnu: 1.16.0
-      lightningcss-linux-x64-musl: 1.16.0
-      lightningcss-win32-x64-msvc: 1.16.0
+      lightningcss-darwin-arm64: 1.19.0
+      lightningcss-darwin-x64: 1.19.0
+      lightningcss-linux-arm-gnueabihf: 1.19.0
+      lightningcss-linux-arm64-gnu: 1.19.0
+      lightningcss-linux-arm64-musl: 1.19.0
+      lightningcss-linux-x64-gnu: 1.19.0
+      lightningcss-linux-x64-musl: 1.19.0
+      lightningcss-win32-x64-msvc: 1.19.0
+    dev: false
+
+  /lilconfig/2.0.4:
+    resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==}
+    engines: {node: '>=10'}
     dev: false
 
-  /lilconfig/2.0.4:
-    resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==}
+  /lilconfig/2.0.6:
+    resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==}
     engines: {node: '>=10'}
 
   /lines-and-columns/1.2.4:
@@ -13605,6 +14047,11 @@ packages:
       emojis-list: 3.0.0
       json5: 2.2.1
 
+  /local-pkg/0.4.3:
+    resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
+    engines: {node: '>=14'}
+    dev: false
+
   /locate-path/3.0.0:
     resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
     engines: {node: '>=6'}
@@ -13782,6 +14229,12 @@ packages:
     dependencies:
       js-tokens: 4.0.0
 
+  /loupe/2.3.6:
+    resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==}
+    dependencies:
+      get-func-name: 2.0.0
+    dev: false
+
   /lower-case-first/1.0.2:
     resolution: {integrity: sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=}
     dependencies:
@@ -13795,7 +14248,7 @@ packages:
   /lower-case/2.0.2:
     resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
     dependencies:
-      tslib: 2.3.1
+      tslib: 2.5.0
     dev: false
 
   /lowercase-keys/1.0.0:
@@ -14206,6 +14659,13 @@ packages:
       braces: 3.0.2
       picomatch: 2.3.0
 
+  /micromatch/4.0.5:
+    resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+    engines: {node: '>=8.6'}
+    dependencies:
+      braces: 3.0.2
+      picomatch: 2.3.1
+
   /miller-rabin/4.0.1:
     resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
     hasBin: true
@@ -14901,7 +15361,7 @@ packages:
     resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
     dependencies:
       lower-case: 2.0.2
-      tslib: 2.3.1
+      tslib: 2.5.0
     dev: false
 
   /node-addon-api/3.2.1:
@@ -15030,7 +15490,7 @@ packages:
     resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
     dependencies:
       hosted-git-info: 2.8.9
-      resolve: 1.20.0
+      resolve: 1.22.1
       semver: 5.7.1
       validate-npm-package-license: 3.0.4
 
@@ -15045,7 +15505,7 @@ packages:
     dev: true
 
   /normalize-path/2.1.1:
-    resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=}
+    resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==}
     engines: {node: '>=0.10.0'}
     dependencies:
       remove-trailing-separator: 1.1.0
@@ -15413,7 +15873,6 @@ packages:
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
     dependencies:
       yocto-queue: 1.0.0
-    dev: true
 
   /p-locate/3.0.0:
     resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
@@ -15551,7 +16010,7 @@ packages:
     resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
     dependencies:
       dot-case: 3.0.4
-      tslib: 2.3.1
+      tslib: 2.5.0
     dev: false
 
   /parent-module/1.0.1:
@@ -15653,7 +16112,7 @@ packages:
     resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
     dependencies:
       no-case: 3.0.4
-      tslib: 2.3.1
+      tslib: 2.5.0
     dev: false
 
   /pascalcase/0.1.1:
@@ -15673,7 +16132,7 @@ packages:
     resolution: {integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=}
 
   /path-exists/3.0.0:
-    resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=}
+    resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
     engines: {node: '>=4'}
 
   /path-exists/4.0.0:
@@ -15740,6 +16199,10 @@ packages:
     resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==}
     dev: false
 
+  /pathval/1.1.1:
+    resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+    dev: false
+
   /pbkdf2/3.1.2:
     resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
     engines: {node: '>=0.12'}
@@ -15761,6 +16224,10 @@ packages:
     resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==}
     engines: {node: '>=8.6'}
 
+  /picomatch/2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
   /pify/2.3.0:
     resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=}
     engines: {node: '>=0.10.0'}
@@ -15855,17 +16322,17 @@ packages:
     resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=}
     engines: {node: '>=0.10.0'}
 
-  /postcss-calc/8.0.0_postcss@8.4.16:
+  /postcss-calc/8.0.0_postcss@8.4.21:
     resolution: {integrity: sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==}
     peerDependencies:
       postcss: ^8.2.2
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
       postcss-selector-parser: 6.0.6
-      postcss-value-parser: 4.1.0
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-colormin/5.2.1_postcss@8.4.16:
+  /postcss-colormin/5.2.1_postcss@8.4.21:
     resolution: {integrity: sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
@@ -15874,54 +16341,54 @@ packages:
       browserslist: 4.21.4
       caniuse-api: 3.0.0
       colord: 2.9.1
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-convert-values/5.0.2_postcss@8.4.16:
+  /postcss-convert-values/5.0.2_postcss@8.4.21:
     resolution: {integrity: sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-discard-comments/5.0.1_postcss@8.4.16:
+  /postcss-discard-comments/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
     dev: false
 
-  /postcss-discard-duplicates/5.0.1_postcss@8.4.16:
+  /postcss-discard-duplicates/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
     dev: false
 
-  /postcss-discard-empty/5.0.1_postcss@8.4.16:
+  /postcss-discard-empty/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
     dev: false
 
-  /postcss-discard-overridden/5.0.1_postcss@8.4.16:
+  /postcss-discard-overridden/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
     dev: false
 
   /postcss-js/3.0.3:
@@ -15929,7 +16396,7 @@ packages:
     engines: {node: '>=10.0'}
     dependencies:
       camelcase-css: 2.0.1
-      postcss: 8.4.16
+      postcss: 8.4.21
 
   /postcss-load-config/3.1.0:
     resolution: {integrity: sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==}
@@ -15941,21 +16408,21 @@ packages:
         optional: true
     dependencies:
       import-cwd: 3.0.0
-      lilconfig: 2.0.4
+      lilconfig: 2.0.6
       yaml: 1.10.2
 
-  /postcss-merge-longhand/5.0.4_postcss@8.4.16:
+  /postcss-merge-longhand/5.0.4_postcss@8.4.21:
     resolution: {integrity: sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
-      stylehacks: 5.0.1_postcss@8.4.16
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
+      stylehacks: 5.0.1_postcss@8.4.21
     dev: false
 
-  /postcss-merge-rules/5.0.3_postcss@8.4.16:
+  /postcss-merge-rules/5.0.3_postcss@8.4.21:
     resolution: {integrity: sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
@@ -15963,34 +16430,34 @@ packages:
     dependencies:
       browserslist: 4.21.4
       caniuse-api: 3.0.0
-      cssnano-utils: 2.0.1_postcss@8.4.16
-      postcss: 8.4.16
+      cssnano-utils: 2.0.1_postcss@8.4.21
+      postcss: 8.4.21
       postcss-selector-parser: 6.0.6
     dev: false
 
-  /postcss-minify-font-values/5.0.1_postcss@8.4.16:
+  /postcss-minify-font-values/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-minify-gradients/5.0.3_postcss@8.4.16:
+  /postcss-minify-gradients/5.0.3_postcss@8.4.21:
     resolution: {integrity: sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
       colord: 2.9.1
-      cssnano-utils: 2.0.1_postcss@8.4.16
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      cssnano-utils: 2.0.1_postcss@8.4.21
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-minify-params/5.0.2_postcss@8.4.16:
+  /postcss-minify-params/5.0.2_postcss@8.4.21:
     resolution: {integrity: sha512-qJAPuBzxO1yhLad7h2Dzk/F7n1vPyfHfCCh5grjGfjhi1ttCnq4ZXGIW77GSrEbh9Hus9Lc/e/+tB4vh3/GpDg==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
@@ -15998,19 +16465,19 @@ packages:
     dependencies:
       alphanum-sort: 1.0.2
       browserslist: 4.21.4
-      cssnano-utils: 2.0.1_postcss@8.4.16
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      cssnano-utils: 2.0.1_postcss@8.4.21
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-minify-selectors/5.1.0_postcss@8.4.16:
+  /postcss-minify-selectors/5.1.0_postcss@8.4.21:
     resolution: {integrity: sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
       alphanum-sort: 1.0.2
-      postcss: 8.4.16
+      postcss: 8.4.21
       postcss-selector-parser: 6.0.6
     dev: false
 
@@ -16059,80 +16526,80 @@ packages:
     dependencies:
       postcss-selector-parser: 6.0.6
 
-  /postcss-normalize-charset/5.0.1_postcss@8.4.16:
+  /postcss-normalize-charset/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
+      postcss: 8.4.21
     dev: false
 
-  /postcss-normalize-display-values/5.0.1_postcss@8.4.16:
+  /postcss-normalize-display-values/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      cssnano-utils: 2.0.1_postcss@8.4.16
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      cssnano-utils: 2.0.1_postcss@8.4.21
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-normalize-positions/5.0.1_postcss@8.4.16:
+  /postcss-normalize-positions/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-normalize-repeat-style/5.0.1_postcss@8.4.16:
+  /postcss-normalize-repeat-style/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      cssnano-utils: 2.0.1_postcss@8.4.16
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      cssnano-utils: 2.0.1_postcss@8.4.21
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-normalize-string/5.0.1_postcss@8.4.16:
+  /postcss-normalize-string/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-normalize-timing-functions/5.0.1_postcss@8.4.16:
+  /postcss-normalize-timing-functions/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      cssnano-utils: 2.0.1_postcss@8.4.16
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      cssnano-utils: 2.0.1_postcss@8.4.21
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-normalize-unicode/5.0.1_postcss@8.4.16:
+  /postcss-normalize-unicode/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
       browserslist: 4.21.4
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-normalize-url/5.0.3_postcss@8.4.16:
+  /postcss-normalize-url/5.0.3_postcss@8.4.21:
     resolution: {integrity: sha512-qWiUMbvkRx3kc1Dp5opzUwc7MBWZcSDK2yofCmdvFBCpx+zFPkxBC1FASQ59Pt+flYfj/nTZSkmF56+XG5elSg==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
@@ -16140,32 +16607,32 @@ packages:
     dependencies:
       is-absolute-url: 3.0.3
       normalize-url: 6.1.0
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-normalize-whitespace/5.0.1_postcss@8.4.16:
+  /postcss-normalize-whitespace/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-ordered-values/5.0.2_postcss@8.4.16:
+  /postcss-ordered-values/5.0.2_postcss@8.4.21:
     resolution: {integrity: sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      cssnano-utils: 2.0.1_postcss@8.4.16
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      cssnano-utils: 2.0.1_postcss@8.4.21
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
-  /postcss-reduce-initial/5.0.1_postcss@8.4.16:
+  /postcss-reduce-initial/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
@@ -16173,18 +16640,18 @@ packages:
     dependencies:
       browserslist: 4.21.4
       caniuse-api: 3.0.0
-      postcss: 8.4.16
+      postcss: 8.4.21
     dev: false
 
-  /postcss-reduce-transforms/5.0.1_postcss@8.4.16:
+  /postcss-reduce-transforms/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      cssnano-utils: 2.0.1_postcss@8.4.16
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      cssnano-utils: 2.0.1_postcss@8.4.21
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
     dev: false
 
   /postcss-selector-parser/6.0.6:
@@ -16194,25 +16661,25 @@ packages:
       cssesc: 3.0.0
       util-deprecate: 1.0.2
 
-  /postcss-svgo/5.0.3_postcss@8.4.16:
+  /postcss-svgo/5.0.3_postcss@8.4.21:
     resolution: {integrity: sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
-      postcss: 8.4.16
-      postcss-value-parser: 4.1.0
+      postcss: 8.4.21
+      postcss-value-parser: 4.2.0
       svgo: 2.8.0
     dev: false
 
-  /postcss-unique-selectors/5.0.2_postcss@8.4.16:
+  /postcss-unique-selectors/5.0.2_postcss@8.4.21:
     resolution: {integrity: sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
       alphanum-sort: 1.0.2
-      postcss: 8.4.16
+      postcss: 8.4.21
       postcss-selector-parser: 6.0.6
     dev: false
 
@@ -16223,10 +16690,10 @@ packages:
     resolution: {integrity: sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==}
 
   /postcss-value-parser/4.2.0:
-    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz}
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
     dev: false
 
-  /postcss-values-parser/6.0.2_postcss@8.4.16:
+  /postcss-values-parser/6.0.2_postcss@8.4.21:
     resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==}
     engines: {node: '>=10'}
     peerDependencies:
@@ -16234,7 +16701,7 @@ packages:
     dependencies:
       color-name: 1.1.4
       is-url-superb: 4.0.0
-      postcss: 8.4.16
+      postcss: 8.4.21
       quote-unquote: 1.0.0
     dev: true
 
@@ -16254,29 +16721,37 @@ packages:
       picocolors: 1.0.0
       source-map-js: 1.0.2
 
+  /postcss/8.4.21:
+    resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.4
+      picocolors: 1.0.0
+      source-map-js: 1.0.2
+
   /posthtml-parser/0.10.2:
-    resolution: {integrity: sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==, tarball: https://packages.atlassian.com/api/npm/npm-remote/posthtml-parser/-/posthtml-parser-0.10.2.tgz}
+    resolution: {integrity: sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==}
     engines: {node: '>=12'}
     dependencies:
       htmlparser2: 7.2.0
     dev: false
 
   /posthtml-parser/0.11.0:
-    resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==, tarball: https://packages.atlassian.com/api/npm/npm-remote/posthtml-parser/-/posthtml-parser-0.11.0.tgz}
+    resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==}
     engines: {node: '>=12'}
     dependencies:
       htmlparser2: 7.2.0
     dev: false
 
   /posthtml-render/3.0.0:
-    resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==, tarball: https://packages.atlassian.com/api/npm/npm-remote/posthtml-render/-/posthtml-render-3.0.0.tgz}
+    resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==}
     engines: {node: '>=12'}
     dependencies:
       is-json: 2.0.1
     dev: false
 
   /posthtml/0.16.6:
-    resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/posthtml/-/posthtml-0.16.6.tgz}
+    resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==}
     engines: {node: '>=12.0.0'}
     dependencies:
       posthtml-parser: 0.11.0
@@ -16394,13 +16869,21 @@ packages:
       ansi-regex: 5.0.1
       ansi-styles: 5.2.0
       react-is: 17.0.2
-    dev: true
 
   /pretty-format/29.3.1:
     resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     dependencies:
-      '@jest/schemas': 29.0.0
+      '@jest/schemas': 29.4.3
+      ansi-styles: 5.2.0
+      react-is: 18.2.0
+    dev: false
+
+  /pretty-format/29.4.3:
+    resolution: {integrity: sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/schemas': 29.4.3
       ansi-styles: 5.2.0
       react-is: 18.2.0
     dev: false
@@ -16505,7 +16988,7 @@ packages:
     resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==}
 
   /punycode/1.4.1:
-    resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=}
+    resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
     dev: false
 
   /punycode/2.1.1:
@@ -16525,7 +17008,7 @@ packages:
     dependencies:
       commander: 6.2.1
       glob: 7.2.0
-      postcss: 8.4.16
+      postcss: 8.4.21
       postcss-selector-parser: 6.0.6
 
   /qs/6.11.0:
@@ -16645,7 +17128,7 @@ packages:
     dev: false
 
   /react-error-overlay/6.0.9:
-    resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==, tarball: https://packages.atlassian.com/api/npm/npm-remote/react-error-overlay/-/react-error-overlay-6.0.9.tgz}
+    resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==}
     dev: false
 
   /react-head/3.4.0_sfoxds7t5ydpegc3knd667wn6m:
@@ -16674,7 +17157,7 @@ packages:
     engines: {node: '>=0.10.0'}
 
   /react-refresh/0.9.0:
-    resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==, tarball: https://packages.atlassian.com/api/npm/npm-remote/react-refresh/-/react-refresh-0.9.0.tgz}
+    resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==}
     engines: {node: '>=0.10.0'}
     dev: false
 
@@ -16862,7 +17345,7 @@ packages:
     resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==}
     engines: {node: '>= 0.10'}
     dependencies:
-      resolve: 1.20.0
+      resolve: 1.22.1
 
   /redent/3.0.0:
     resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
@@ -17090,7 +17573,7 @@ packages:
     dev: true
 
   /require-directory/2.1.1:
-    resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=}
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
     engines: {node: '>=0.10.0'}
 
   /require-from-string/2.0.2:
@@ -17128,7 +17611,7 @@ packages:
       resolve-from: 5.0.0
 
   /resolve-from/3.0.0:
-    resolution: {integrity: sha1-six699nWiBvItuZTM17rywoYh0g=}
+    resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==}
     engines: {node: '>=4'}
 
   /resolve-from/4.0.0:
@@ -17152,12 +17635,25 @@ packages:
     engines: {node: '>=10'}
     dev: false
 
+  /resolve.exports/2.0.0:
+    resolution: {integrity: sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==}
+    engines: {node: '>=10'}
+    dev: false
+
   /resolve/1.20.0:
     resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==}
     dependencies:
       is-core-module: 2.10.0
       path-parse: 1.0.7
 
+  /resolve/1.22.1:
+    resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
+    hasBin: true
+    dependencies:
+      is-core-module: 2.10.0
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+
   /resolve/2.0.0-next.4:
     resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
     hasBin: true
@@ -17260,7 +17756,7 @@ packages:
       '@babel/code-frame': 7.18.6
     dev: false
 
-  /rollup-plugin-esbuild/4.9.1_uiao7appyg7pvh5lt4amcal6cy:
+  /rollup-plugin-esbuild/4.9.1_72vqmc7tx7ptj43i3kyzp2skqu:
     resolution: {integrity: sha512-qn/x7Wz9p3Xnva99qcb+nopH0d2VJwVnsxJTGEg+Sh2Z3tqQl33MhOwzekVo1YTKgv+yAmosjcBRJygMfGrtLw==}
     engines: {node: '>=12'}
     peerDependencies:
@@ -17270,7 +17766,7 @@ packages:
       '@rollup/pluginutils': 4.2.1
       debug: 4.3.4
       es-module-lexer: 0.9.3
-      esbuild: 0.16.17
+      esbuild: 0.17.6
       joycon: 3.1.1
       jsonc-parser: 3.0.0
       rollup: 2.79.1
@@ -17300,6 +17796,14 @@ packages:
     optionalDependencies:
       fsevents: 2.3.2
 
+  /rollup/3.17.2:
+    resolution: {integrity: sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA==}
+    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+    hasBin: true
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: false
+
   /run-async/2.4.1:
     resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
     engines: {node: '>=0.12.0'}
@@ -17611,6 +18115,10 @@ packages:
       get-intrinsic: 1.1.1
       object-inspect: 1.11.0
 
+  /siginfo/2.0.0:
+    resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+    dev: false
+
   /signal-exit/3.0.7:
     resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
 
@@ -17656,7 +18164,6 @@ packages:
     dependencies:
       ansi-styles: 6.1.1
       is-fullwidth-code-point: 4.0.0
-    dev: true
 
   /smartwrap/1.2.5:
     resolution: {integrity: sha512-bzWRwHwu0RnWjwU7dFy7tF68pDAx/zMSu3g7xr9Nx5J0iSImYInglwEVExyHLxXljy6PWMjkSAbwF7t2mPnRmg==}
@@ -17905,8 +18412,14 @@ packages:
   /sprintf-js/1.0.3:
     resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
 
+  /srcset/4.0.0:
+    resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==}
+    engines: {node: '>=12'}
+    dev: false
+
   /stable/0.1.8:
     resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
+    deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
     dev: false
 
   /stack-generator/2.0.10:
@@ -17926,6 +18439,10 @@ packages:
       escape-string-regexp: 2.0.0
     dev: false
 
+  /stackback/0.0.2:
+    resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+    dev: false
+
   /stackframe/1.3.4:
     resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
     dev: true
@@ -17968,6 +18485,10 @@ packages:
     resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=}
     engines: {node: '>= 0.6'}
 
+  /std-env/3.3.2:
+    resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==}
+    dev: false
+
   /stream-browserify/3.0.0:
     resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
     dependencies:
@@ -18054,7 +18575,6 @@ packages:
       eastasianwidth: 0.2.0
       emoji-regex: 9.2.2
       strip-ansi: 7.0.1
-    dev: true
 
   /string.prototype.trimend/1.0.4:
     resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==}
@@ -18119,7 +18639,6 @@ packages:
     engines: {node: '>=12'}
     dependencies:
       ansi-regex: 6.0.1
-    dev: true
 
   /strip-bom-string/1.0.0:
     resolution: {integrity: sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=}
@@ -18127,7 +18646,7 @@ packages:
     dev: true
 
   /strip-bom/3.0.0:
-    resolution: {integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=}
+    resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
     engines: {node: '>=4'}
     dev: false
 
@@ -18171,6 +18690,12 @@ packages:
     engines: {node: '>=8'}
     dev: false
 
+  /strip-literal/1.0.1:
+    resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==}
+    dependencies:
+      acorn: 8.8.2
+    dev: false
+
   /strip-outer/1.0.1:
     resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==}
     engines: {node: '>=0.10.0'}
@@ -18186,7 +18711,7 @@ packages:
     dependencies:
       loader-utils: 2.0.2
       schema-utils: 3.1.1
-      webpack: 5.64.2_esbuild@0.16.17
+      webpack: 5.64.2_esbuild@0.17.6
     dev: false
 
   /style-to-object/0.3.0:
@@ -18236,14 +18761,14 @@ packages:
       stylis-rule-sheet: 0.0.10_stylis@3.5.4
     dev: false
 
-  /stylehacks/5.0.1_postcss@8.4.16:
+  /stylehacks/5.0.1_postcss@8.4.21:
     resolution: {integrity: sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==}
     engines: {node: ^10 || ^12 || >=14.0}
     peerDependencies:
       postcss: ^8.2.15
     dependencies:
       browserslist: 4.21.4
-      postcss: 8.4.16
+      postcss: 8.4.21
       postcss-selector-parser: 6.0.6
     dev: false
 
@@ -18308,7 +18833,6 @@ packages:
   /supports-preserve-symlinks-flag/1.0.0:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
-    dev: true
 
   /svgo/2.8.0:
     resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
@@ -18472,7 +18996,7 @@ packages:
       supports-hyperlinks: 2.2.0
     dev: true
 
-  /terser-webpack-plugin/5.2.5_3unswyumjlk6wqviopuozqbhqm:
+  /terser-webpack-plugin/5.2.5_dhjlflamz74snw5vqhz4pqvd2u:
     resolution: {integrity: sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==}
     engines: {node: '>= 10.13.0'}
     peerDependencies:
@@ -18488,14 +19012,13 @@ packages:
       uglify-js:
         optional: true
     dependencies:
-      esbuild: 0.16.17
+      esbuild: 0.17.6
       jest-worker: 27.3.1
       schema-utils: 3.1.1
       serialize-javascript: 6.0.0
       source-map: 0.6.1
       terser: 5.10.0
-      webpack: 5.64.2_esbuild@0.16.17
-    dev: false
+      webpack: 5.64.2_esbuild@0.17.6
 
   /terser-webpack-plugin/5.2.5_webpack@5.64.2:
     resolution: {integrity: sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==}
@@ -18518,7 +19041,7 @@ packages:
       serialize-javascript: 6.0.0
       source-map: 0.6.1
       terser: 5.10.0
-      webpack: 5.64.2
+      webpack: 5.64.2_webpack-cli@4.9.1
 
   /terser/5.10.0:
     resolution: {integrity: sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==}
@@ -18528,7 +19051,7 @@ packages:
       acorn:
         optional: true
     dependencies:
-      acorn: 8.8.1
+      acorn: 8.8.2
       commander: 2.20.3
       source-map: 0.7.3
       source-map-support: 0.5.21
@@ -18594,7 +19117,7 @@ packages:
       setimmediate: 1.0.5
 
   /timsort/0.3.0:
-    resolution: {integrity: sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=}
+    resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==}
     dev: false
 
   /tiny-invariant/1.2.0:
@@ -18605,6 +19128,20 @@ packages:
     resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
     dev: false
 
+  /tinybench/2.3.1:
+    resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==}
+    dev: false
+
+  /tinypool/0.3.1:
+    resolution: {integrity: sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==}
+    engines: {node: '>=14.0.0'}
+    dev: false
+
+  /tinyspy/1.1.1:
+    resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==}
+    engines: {node: '>=14.0.0'}
+    dev: false
+
   /title-case/2.1.1:
     resolution: {integrity: sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=}
     dependencies:
@@ -18827,12 +19364,8 @@ packages:
     resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
     dev: true
 
-  /tslib/2.3.1:
-    resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==}
-    dev: false
-
   /tslib/2.5.0:
-    resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==, tarball: https://packages.atlassian.com/api/npm/npm-remote/tslib/-/tslib-2.5.0.tgz}
+    resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
     dev: false
 
   /tsutils/3.21.0_typescript@4.9.4:
@@ -19418,6 +19951,52 @@ packages:
       vfile-message: 2.0.4
     dev: true
 
+  /vite-node/0.28.5:
+    resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==}
+    engines: {node: '>=v14.16.0'}
+    hasBin: true
+    dependencies:
+      cac: 6.7.14
+      debug: 4.3.4
+      mlly: 1.1.0
+      pathe: 1.1.0
+      picocolors: 1.0.0
+      source-map: 0.6.1
+      source-map-support: 0.5.21
+      vite: 4.1.4
+    transitivePeerDependencies:
+      - '@types/node'
+      - less
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+    dev: false
+
+  /vite-node/0.28.5_@types+node@16.11.10:
+    resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==}
+    engines: {node: '>=v14.16.0'}
+    hasBin: true
+    dependencies:
+      cac: 6.7.14
+      debug: 4.3.4
+      mlly: 1.1.0
+      pathe: 1.1.0
+      picocolors: 1.0.0
+      source-map: 0.6.1
+      source-map-support: 0.5.21
+      vite: 4.1.4_@types+node@16.11.10
+    transitivePeerDependencies:
+      - '@types/node'
+      - less
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+    dev: false
+
   /vite/2.7.2:
     resolution: {integrity: sha512-wMffVVdKZRZP/HwW3yttKL8X+IJePz7bUcnGm0vqljffpVwHpjWC3duZtJQHAGvy+wrTjmwU7vkULpZ1dVXY6w==}
     engines: {node: '>=12.2.0'}
@@ -19435,12 +20014,134 @@ packages:
         optional: true
     dependencies:
       esbuild: 0.13.15
-      postcss: 8.4.16
-      resolve: 1.20.0
+      postcss: 8.4.21
+      resolve: 1.22.1
       rollup: 2.79.1
     optionalDependencies:
       fsevents: 2.3.2
 
+  /vite/4.1.4:
+    resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': '>= 14'
+      less: '*'
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+    dependencies:
+      esbuild: 0.16.17
+      postcss: 8.4.21
+      resolve: 1.22.1
+      rollup: 3.17.2
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: false
+
+  /vite/4.1.4_@types+node@16.11.10:
+    resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': '>= 14'
+      less: '*'
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+    dependencies:
+      '@types/node': 16.11.10
+      esbuild: 0.16.17
+      postcss: 8.4.21
+      resolve: 1.22.1
+      rollup: 3.17.2
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: false
+
+  /vitest/0.28.5:
+    resolution: {integrity: sha512-pyCQ+wcAOX7mKMcBNkzDwEHRGqQvHUl0XnoHR+3Pb1hytAHISgSxv9h0gUiSiYtISXUU3rMrKiKzFYDrI6ZIHA==}
+    engines: {node: '>=v14.16.0'}
+    hasBin: true
+    peerDependencies:
+      '@edge-runtime/vm': '*'
+      '@vitest/browser': '*'
+      '@vitest/ui': '*'
+      happy-dom: '*'
+      jsdom: '*'
+    peerDependenciesMeta:
+      '@edge-runtime/vm':
+        optional: true
+      '@vitest/browser':
+        optional: true
+      '@vitest/ui':
+        optional: true
+      happy-dom:
+        optional: true
+      jsdom:
+        optional: true
+    dependencies:
+      '@types/chai': 4.3.4
+      '@types/chai-subset': 1.3.3
+      '@types/node': 16.11.10
+      '@vitest/expect': 0.28.5
+      '@vitest/runner': 0.28.5
+      '@vitest/spy': 0.28.5
+      '@vitest/utils': 0.28.5
+      acorn: 8.8.2
+      acorn-walk: 8.2.0
+      cac: 6.7.14
+      chai: 4.3.7
+      debug: 4.3.4
+      local-pkg: 0.4.3
+      pathe: 1.1.0
+      picocolors: 1.0.0
+      source-map: 0.6.1
+      std-env: 3.3.2
+      strip-literal: 1.0.1
+      tinybench: 2.3.1
+      tinypool: 0.3.1
+      tinyspy: 1.1.1
+      vite: 4.1.4_@types+node@16.11.10
+      vite-node: 0.28.5_@types+node@16.11.10
+      why-is-node-running: 2.2.2
+    transitivePeerDependencies:
+      - less
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+    dev: false
+
   /vm-browserify/1.1.2:
     resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
 
@@ -19703,7 +20404,7 @@ packages:
       strip-ansi: 3.0.1
       supports-color: 6.1.0
       url: 0.11.0
-      webpack: 5.64.2_esbuild@0.16.17
+      webpack: 5.64.2_esbuild@0.17.6
       webpack-dev-middleware: 3.7.3_webpack@5.64.2
       webpack-log: 2.0.0
       ws: 6.2.2
@@ -19779,8 +20480,9 @@ packages:
       - '@swc/core'
       - esbuild
       - uglify-js
+    dev: true
 
-  /webpack/5.64.2_esbuild@0.16.17:
+  /webpack/5.64.2_esbuild@0.17.6:
     resolution: {integrity: sha512-4KGc0+Ozi0aS3EaLNRvEppfZUer+CaORKqL6OBjDLZOPf9YfN8leagFzwe6/PoBdHFxc/utKArl8LMC0Ivtmdg==}
     engines: {node: '>=10.13.0'}
     hasBin: true
@@ -19811,14 +20513,13 @@ packages:
       neo-async: 2.6.2
       schema-utils: 3.1.1
       tapable: 2.2.1
-      terser-webpack-plugin: 5.2.5_3unswyumjlk6wqviopuozqbhqm
+      terser-webpack-plugin: 5.2.5_dhjlflamz74snw5vqhz4pqvd2u
       watchpack: 2.3.0
       webpack-sources: 3.2.2
     transitivePeerDependencies:
       - '@swc/core'
       - esbuild
       - uglify-js
-    dev: false
 
   /webpack/5.64.2_webpack-cli@4.9.1:
     resolution: {integrity: sha512-4KGc0+Ozi0aS3EaLNRvEppfZUer+CaORKqL6OBjDLZOPf9YfN8leagFzwe6/PoBdHFxc/utKArl8LMC0Ivtmdg==}
@@ -19954,6 +20655,15 @@ packages:
     dependencies:
       isexe: 2.0.0
 
+  /why-is-node-running/2.2.2:
+    resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==}
+    engines: {node: '>=8'}
+    hasBin: true
+    dependencies:
+      siginfo: 2.0.0
+      stackback: 0.0.2
+    dev: false
+
   /wide-align/1.1.5:
     resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
     dependencies:
@@ -20239,7 +20949,6 @@ packages:
   /yocto-queue/1.0.0:
     resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
     engines: {node: '>=12.20'}
-    dev: true
 
   /zip-stream/4.1.0:
     resolution: {integrity: sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==}


Test patch:
diff --git a/packages/integration/src/addFileScope.test.ts b/packages/integration/src/addFileScope.test.ts
index 36517c3..3dc96be 100644
--- a/packages/integration/src/addFileScope.test.ts
+++ b/packages/integration/src/addFileScope.test.ts
@@ -18,12 +18,46 @@ describe('ESM', () => {
       }),
     ).toMatchInlineSnapshot(`
       "
+            
             import { setFileScope, endFileScope } from "@vanilla-extract/css/fileScope";
             setFileScope("app/app.css.ts", "my-package");
             import {style} from '@vanilla-extract/css';
 
       export const myStyle = style({});
             endFileScope();
+            
+          "
+    `);
+  });
+
+  test('should add global adapter setup when "globalAdapterIdentifier" is provided', () => {
+    const source = outdent`
+    import {style} from '@vanilla-extract/css';
+
+    export const myStyle = style({});
+    `;
+
+    expect(
+      addFileScope({
+        source,
+        rootPath: '/the-root',
+        filePath: '/the-root/app/app.css.ts',
+        packageName: 'my-package',
+        globalAdapterIdentifier: 'MY_GLOBAL_ADAPTER',
+      }),
+    ).toMatchInlineSnapshot(`
+      "
+            
+              import * as __vanilla_css_adapter__ from "@vanilla-extract/css/adapter";
+              __vanilla_css_adapter__.setAdapter(MY_GLOBAL_ADAPTER);
+            
+            import { setFileScope, endFileScope } from "@vanilla-extract/css/fileScope";
+            setFileScope("app/app.css.ts", "my-package");
+            import {style} from '@vanilla-extract/css';
+
+      export const myStyle = style({});
+            endFileScope();
+            __vanilla_css_adapter__.removeAdapter();
           "
     `);
   });
@@ -116,7 +150,37 @@ describe('ESM', () => {
 describe('CJS', () => {
   test('should add missing fileScope', () => {
     const source = outdent`
-    const _css require('@vanilla-extract/css');
+    const _css = require('@vanilla-extract/css');
+
+    var myStyle = _css.style({});
+    exports.myStyle = myStyle;
+    `;
+
+    expect(
+      addFileScope({
+        source,
+        rootPath: '/the-root',
+        filePath: '/the-root/app/app.css.ts',
+        packageName: 'my-package',
+      }),
+    ).toMatchInlineSnapshot(`
+      "
+          
+          const __vanilla_filescope__ = require("@vanilla-extract/css/fileScope");
+          __vanilla_filescope__.setFileScope("app/app.css.ts", "my-package");
+          const _css = require('@vanilla-extract/css');
+
+      var myStyle = _css.style({});
+      exports.myStyle = myStyle;
+          __vanilla_filescope__.endFileScope();
+          ;
+        "
+    `);
+  });
+
+  test('should add global adapter setup when "globalAdapterIdentifier" is provided', () => {
+    const source = outdent`
+    const _css = require('@vanilla-extract/css');
 
     var myStyle = _css.style({});
     exports.myStyle = myStyle;
@@ -128,16 +192,22 @@ describe('CJS', () => {
         rootPath: '/the-root',
         filePath: '/the-root/app/app.css.ts',
         packageName: 'my-package',
+        globalAdapterIdentifier: 'MY_GLOBAL_ADAPTER',
       }),
     ).toMatchInlineSnapshot(`
       "
+          
+            const __vanilla_css_adapter__ = require("@vanilla-extract/css/adapter");
+            __vanilla_css_adapter__.setAdapter(MY_GLOBAL_ADAPTER);
+          
           const __vanilla_filescope__ = require("@vanilla-extract/css/fileScope");
           __vanilla_filescope__.setFileScope("app/app.css.ts", "my-package");
-          const _css require('@vanilla-extract/css');
+          const _css = require('@vanilla-extract/css');
 
       var myStyle = _css.style({});
       exports.myStyle = myStyle;
           __vanilla_filescope__.endFileScope();
+          __vanilla_css_adapter__.removeAdapter();;
         "
     `);
   });
diff --git a/test-helpers/package.json b/test-helpers/package.json
index 063fa5e..8ada3e8 100644
--- a/test-helpers/package.json
+++ b/test-helpers/package.json
@@ -18,13 +18,14 @@
     "@types/mini-css-extract-plugin": "^1.2.2",
     "@types/webpack-dev-server": "^3.11.1",
     "@vanilla-extract/esbuild-plugin": "*",
+    "@vanilla-extract/esbuild-plugin-next": "*",
     "@vanilla-extract/parcel-transformer": "*",
     "@vanilla-extract/vite-plugin": "*",
     "@vanilla-extract/webpack-plugin": "*",
     "babel-loader": "^8.2.2",
     "css-loader": "^5.2.4",
     "cssnano": "^5.0.8",
-    "esbuild": "^0.16.3",
+    "esbuild": "0.17.6",
     "got": "^11.8.2",
     "html-webpack-plugin": "^5.3.1",
     "mini-css-extract-plugin": "^1.5.1",
@@ -35,7 +36,7 @@
     "prettier": "^2.8.1",
     "serve-handler": "^6.1.3",
     "style-loader": "^2.0.0",
-    "vite": "^2.7.0",
+    "vite": "npm:vite@^2.7.0",
     "webpack": "^5.36.1",
     "webpack-dev-server": "^3.11.2",
     "webpack-merge": "^5.7.3"
diff --git a/test-helpers/src/startFixture/esbuild.ts b/test-helpers/src/startFixture/esbuild.ts
index 3baeebf..cb2280b 100644
--- a/test-helpers/src/startFixture/esbuild.ts
+++ b/test-helpers/src/startFixture/esbuild.ts
@@ -2,12 +2,13 @@ import path from 'path';
 import { existsSync, promises as fs } from 'fs';
 
 import { vanillaExtractPlugin } from '@vanilla-extract/esbuild-plugin';
-import { serve } from 'esbuild';
+import { vanillaExtractPlugin as vanillaExtractPluginNext } from '@vanilla-extract/esbuild-plugin-next';
+import * as esbuild from 'esbuild';
 
 import { TestServer } from './types';
 
 export interface EsbuildFixtureOptions {
-  type: 'esbuild' | 'esbuild-runtime';
+  type: 'esbuild' | 'esbuild-runtime' | 'esbuild-next' | 'esbuild-next-runtime';
   mode?: 'development' | 'production';
   port: number;
 }
@@ -15,6 +16,9 @@ export const startEsbuildFixture = async (
   fixtureName: string,
   { type, mode = 'development', port = 3000 }: EsbuildFixtureOptions,
 ): Promise<TestServer> => {
+  const plugin = type.includes('next')
+    ? vanillaExtractPluginNext
+    : vanillaExtractPlugin;
   const entry = require.resolve(`@fixtures/${fixtureName}/src/index.ts`);
   const absWorkingDir = path.dirname(
     require.resolve(`@fixtures/${fixtureName}/package.json`),
@@ -27,23 +31,22 @@ export const startEsbuildFixture = async (
 
   await fs.mkdir(outdir, { recursive: true });
 
-  const server = await serve(
-    { servedir: outdir, port },
-    {
-      entryPoints: [entry],
-      metafile: true,
-      platform: 'browser',
-      bundle: true,
-      minify: mode === 'production',
-      plugins: [
-        vanillaExtractPlugin({
-          runtime: type === 'esbuild-runtime',
-        }),
-      ],
-      absWorkingDir,
-      outdir,
-    },
-  );
+  const ctx = await esbuild.context({
+    entryPoints: [entry],
+    metafile: true,
+    platform: 'browser',
+    bundle: true,
+    minify: mode === 'production',
+    plugins: [
+      plugin({
+        runtime: type.includes('runtime'),
+      }),
+    ],
+    absWorkingDir,
+    outdir,
+  });
+
+  const server = await ctx.serve({ servedir: outdir, port });
 
   await fs.writeFile(
     path.join(outdir, 'index.html'),
@@ -66,7 +69,7 @@ export const startEsbuildFixture = async (
     url: `http://${server.host}:${port}`,
     stylesheet: 'index.css',
     close: () => {
-      server.stop();
+      ctx.dispose();
 
       return Promise.resolve();
     },
diff --git a/test-helpers/src/startFixture/index.ts b/test-helpers/src/startFixture/index.ts
index 8ee4f64..755aa4d 100644
--- a/test-helpers/src/startFixture/index.ts
+++ b/test-helpers/src/startFixture/index.ts
@@ -10,7 +10,9 @@ type BuildType =
   | 'mini-css-extract'
   | 'style-loader'
   | 'esbuild'
+  | 'esbuild-next'
   | 'esbuild-runtime'
+  | 'esbuild-next-runtime'
   | 'vite'
   | 'parcel';
 
@@ -50,7 +52,12 @@ export async function startFixture(
     ].join('\n'),
   );
 
-  if (type === 'esbuild' || type === 'esbuild-runtime') {
+  if (
+    type === 'esbuild' ||
+    type === 'esbuild-runtime' ||
+    type === 'esbuild-next' ||
+    type === 'esbuild-next-runtime'
+  ) {
     return startEsbuildFixture(fixtureName, {
       type,
       port,
diff --git a/tests/compiler/compiler.vitest.test.ts b/tests/compiler/compiler.vitest.test.ts
new file mode 100644
index 0000000..4c1a892
--- /dev/null
+++ b/tests/compiler/compiler.vitest.test.ts
@@ -0,0 +1,279 @@
+import { describe, beforeAll, afterAll, test, expect } from 'vitest';
+import path from 'path';
+import { createCompiler } from '@vanilla-extract/integration';
+
+function toPosix(filePath: string) {
+  return filePath.split(path.sep).join(path.posix.sep);
+}
+
+function getLocalFiles(files: Set<string>) {
+  const posixDirname = toPosix(__dirname);
+
+  return [...files]
+    .map(toPosix)
+    .filter((file) => file.startsWith(posixDirname))
+    .map((file) => file.replace(posixDirname, ''));
+}
+
+describe('compiler', () => {
+  let compilers: Record<
+    'default' | 'cssImportSpecifier' | 'shortIdentifiers',
+    ReturnType<typeof createCompiler>
+  >;
+
+  beforeAll(async () => {
+    compilers = {
+      default: createCompiler({
+        root: __dirname,
+      }),
+
+      cssImportSpecifier: createCompiler({
+        root: __dirname,
+        cssImportSpecifier: (filePath) => filePath + '.custom-extension.css',
+      }),
+
+      shortIdentifiers: createCompiler({
+        root: __dirname,
+        identifiers: 'short',
+      }),
+    };
+  });
+
+  test('absolute paths', async () => {
+    const compiler = compilers.default;
+
+    const cssPath = path.join(
+      __dirname,
+      'fixtures/class-composition/styles.css.ts',
+    );
+    const sharedCssPath = path.join(
+      __dirname,
+      'fixtures/class-composition/shared.css.ts',
+    );
+
+    const output = await compiler.processVanillaFile(cssPath);
+    expect(output.source).toMatchInlineSnapshot(`
+      "import 'fixtures/class-composition/shared.css.ts.vanilla.css';
+      import 'fixtures/class-composition/styles.css.ts.vanilla.css';
+      export var className = 'styles_className__q7x3ow0 shared_shared__16bmd920';"
+    `);
+    const localWatchFiles = getLocalFiles(output.watchFiles);
+    expect(localWatchFiles).toMatchInlineSnapshot(`
+      [
+        "/fixtures/class-composition/styles.css.ts",
+        "/fixtures/class-composition/shared.css.ts",
+      ]
+    `);
+
+    await (async () => {
+      const { css, filePath } = await compiler.getCssForFile(cssPath);
+      expect(css).toMatchInlineSnapshot(`
+        ".styles_className__q7x3ow0 {
+          color: red;
+        }"
+      `);
+      expect(toPosix(filePath)).toBe(
+        'fixtures/class-composition/styles.css.ts',
+      );
+    })();
+
+    await (async () => {
+      const { css, filePath } = await compiler.getCssForFile(sharedCssPath);
+      expect(css).toMatchInlineSnapshot(`
+        ".shared_shared__16bmd920 {
+          background: blue;
+        }"
+      `);
+      expect(toPosix(filePath)).toBe(
+        'fixtures/class-composition/shared.css.ts',
+      );
+    })();
+  });
+
+  test('root relative paths', async () => {
+    const compiler = compilers.default;
+
+    const cssPath = 'fixtures/class-composition/styles.css.ts';
+    const sharedCssPath = 'fixtures/class-composition/shared.css.ts';
+
+    const output = await compiler.processVanillaFile(cssPath);
+    expect(output.source).toMatchInlineSnapshot(`
+      "import 'fixtures/class-composition/shared.css.ts.vanilla.css';
+      import 'fixtures/class-composition/styles.css.ts.vanilla.css';
+      export var className = 'styles_className__q7x3ow0 shared_shared__16bmd920';"
+    `);
+
+    const localWatchFiles = getLocalFiles(output.watchFiles);
+    expect(localWatchFiles).toMatchInlineSnapshot(`
+      [
+        "/fixtures/class-composition/styles.css.ts",
+        "/fixtures/class-composition/shared.css.ts",
+      ]
+    `);
+
+    await (async () => {
+      const { css, filePath } = await compiler.getCssForFile(cssPath);
+      expect(css).toMatchInlineSnapshot(`
+        ".styles_className__q7x3ow0 {
+          color: red;
+        }"
+      `);
+      expect(toPosix(filePath)).toBe(
+        'fixtures/class-composition/styles.css.ts',
+      );
+    })();
+
+    await (async () => {
+      const { css, filePath } = await compiler.getCssForFile(sharedCssPath);
+      expect(css).toMatchInlineSnapshot(`
+        ".shared_shared__16bmd920 {
+          background: blue;
+        }"
+      `);
+      expect(toPosix(filePath)).toBe(
+        'fixtures/class-composition/shared.css.ts',
+      );
+    })();
+  });
+
+  test('root relative paths starting with dot', async () => {
+    const compiler = compilers.default;
+
+    const cssPath = './fixtures/class-composition/styles.css.ts';
+    const sharedCssPath = './fixtures/class-composition/shared.css.ts';
+
+    const output = await compiler.processVanillaFile(cssPath);
+    expect(output.source).toMatchInlineSnapshot(`
+      "import 'fixtures/class-composition/shared.css.ts.vanilla.css';
+      import 'fixtures/class-composition/styles.css.ts.vanilla.css';
+      export var className = 'styles_className__q7x3ow0 shared_shared__16bmd920';"
+    `);
+
+    const localWatchFiles = getLocalFiles(output.watchFiles);
+    expect(localWatchFiles).toMatchInlineSnapshot(`
+      [
+        "/fixtures/class-composition/styles.css.ts",
+        "/fixtures/class-composition/shared.css.ts",
+      ]
+    `);
+
+    await (async () => {
+      const { css, filePath } = await compiler.getCssForFile(cssPath);
+      expect(css).toMatchInlineSnapshot(`
+        ".styles_className__q7x3ow0 {
+          color: red;
+        }"
+      `);
+      expect(toPosix(filePath)).toBe(
+        'fixtures/class-composition/styles.css.ts',
+      );
+    })();
+
+    await (async () => {
+      const { css, filePath } = await compiler.getCssForFile(sharedCssPath);
+      expect(css).toMatchInlineSnapshot(`
+        ".shared_shared__16bmd920 {
+          background: blue;
+        }"
+      `);
+      expect(toPosix(filePath)).toBe(
+        'fixtures/class-composition/shared.css.ts',
+      );
+    })();
+  });
+
+  test('throws on getCssForFile when file does not exist', async () => {
+    const compiler = compilers.default;
+    let error: Error | undefined;
+
+    try {
+      await compiler.getCssForFile('does-not-exist.css.ts');
+    } catch (_error) {
+      error = _error as Error;
+    }
+
+    expect(
+      toPosix(error?.message.replace(__dirname, '{{__dirname}}') ?? ''),
+    ).toMatchInlineSnapshot(
+      `"No CSS for file: {{__dirname}}/does-not-exist.css.ts"`,
+    );
+  });
+
+  test('short identifiers', async () => {
+    const compiler = compilers.shortIdentifiers;
+
+    const cssPath = path.join(
+      __dirname,
+      'fixtures/class-composition/styles.css.ts',
+    );
+    const output = await compiler.processVanillaFile(cssPath);
+    expect(output.source).toMatchInlineSnapshot(`
+      "import 'fixtures/class-composition/shared.css.ts.vanilla.css';
+      import 'fixtures/class-composition/styles.css.ts.vanilla.css';
+      export var className = 'q7x3ow0 _16bmd920';"
+    `);
+    const { css } = await compiler.getCssForFile(cssPath);
+    expect(css).toMatchInlineSnapshot(`
+      ".q7x3ow0 {
+        color: red;
+      }"
+    `);
+  });
+
+  test('custom cssImportSpecifier', async () => {
+    const compiler = compilers.cssImportSpecifier;
+
+    const cssPath = path.join(
+      __dirname,
+      'fixtures/class-composition/styles.css.ts',
+    );
+    const output = await compiler.processVanillaFile(cssPath);
+    expect(output.source).toMatchInlineSnapshot(`
+      "import 'fixtures/class-composition/shared.css.ts.custom-extension.css';
+      import 'fixtures/class-composition/styles.css.ts.custom-extension.css';
+      export var className = 'styles_className__q7x3ow0 shared_shared__16bmd920';"
+    `);
+  });
+
+  test('does not remove unused composition classes', async () => {
+    const compiler = compilers.default;
+
+    const cssPathA = './fixtures/unused-compositions/styles_a.css.ts';
+    const cssPathB = './fixtures/unused-compositions/styles_b.css.ts';
+    const sharedCssPath = './fixtures/unused-compositions/shared.css.ts';
+
+    // Process the file multiple times with different args to test caching
+    await compiler.processVanillaFile(cssPathA, { outputCss: false });
+    const outputA = await compiler.processVanillaFile(cssPathA);
+
+    // The `root` className string should be a composition of multiple classes:
+    expect(outputA.source).toMatchInlineSnapshot(`
+      "import 'fixtures/unused-compositions/shared.css.ts.vanilla.css';
+      export var root = 'styles_a_root__mh4uy80 shared_shared__5i7sy00';"
+    `);
+
+    // Process the file multiple times with different args to test caching
+    await compiler.processVanillaFile(cssPathB, { outputCss: false });
+    const outputB = await compiler.processVanillaFile(cssPathB);
+
+    // The `root` className string should be a composition of multiple classes:
+    expect(outputB.source).toMatchInlineSnapshot(`
+      "import 'fixtures/unused-compositions/shared.css.ts.vanilla.css';
+      export var root = 'styles_b_root__1k6843p0 shared_shared__5i7sy00';"
+    `);
+
+    const { css } = await compiler.getCssForFile(sharedCssPath);
+    expect(css).toMatchInlineSnapshot(`
+      ".shared_shared__5i7sy00 {
+        padding: 20px;
+        background: peachpuff;
+      }"
+    `);
+  });
+
+  afterAll(async () => {
+    await Promise.allSettled(
+      Object.values(compilers).map((compiler) => compiler.close()),
+    );
+  });
+});
diff --git a/tests/compiler/fixtures/class-composition/shared.css.ts b/tests/compiler/fixtures/class-composition/shared.css.ts
new file mode 100644
index 0000000..d18c3db
--- /dev/null
+++ b/tests/compiler/fixtures/class-composition/shared.css.ts
@@ -0,0 +1,3 @@
+import { style } from '@vanilla-extract/css';
+
+export const shared = style({ background: 'blue' });
diff --git a/tests/compiler/fixtures/class-composition/styles.css.ts b/tests/compiler/fixtures/class-composition/styles.css.ts
new file mode 100644
index 0000000..e68766e
--- /dev/null
+++ b/tests/compiler/fixtures/class-composition/styles.css.ts
@@ -0,0 +1,4 @@
+import { style } from '@vanilla-extract/css';
+import { shared } from './shared.css';
+
+export const className = style([shared, { color: 'red' }]);
diff --git a/tests/compiler/fixtures/unused-compositions/shared.css.ts b/tests/compiler/fixtures/unused-compositions/shared.css.ts
new file mode 100644
index 0000000..12f1a43
--- /dev/null
+++ b/tests/compiler/fixtures/unused-compositions/shared.css.ts
@@ -0,0 +1,6 @@
+import { style } from '@vanilla-extract/css';
+
+export const shared = style({
+  padding: '20px',
+  background: 'peachpuff',
+});
diff --git a/tests/compiler/fixtures/unused-compositions/styles_a.css.ts b/tests/compiler/fixtures/unused-compositions/styles_a.css.ts
new file mode 100644
index 0000000..95cf920
--- /dev/null
+++ b/tests/compiler/fixtures/unused-compositions/styles_a.css.ts
@@ -0,0 +1,4 @@
+import { style } from '@vanilla-extract/css';
+import { shared } from './shared.css';
+
+export const root = style([shared]);
diff --git a/tests/compiler/fixtures/unused-compositions/styles_b.css.ts b/tests/compiler/fixtures/unused-compositions/styles_b.css.ts
new file mode 100644
index 0000000..95cf920
--- /dev/null
+++ b/tests/compiler/fixtures/unused-compositions/styles_b.css.ts
@@ -0,0 +1,4 @@
+import { style } from '@vanilla-extract/css';
+import { shared } from './shared.css';
+
+export const root = style([shared]);
diff --git a/tests/e2e/features.playwright.ts b/tests/e2e/features.playwright.ts
index 65c4d3c..12781a0 100644
--- a/tests/e2e/features.playwright.ts
+++ b/tests/e2e/features.playwright.ts
@@ -15,6 +15,10 @@ const testCases = [
   { type: 'esbuild', mode: 'production', snapshotCss: true },
   { type: 'esbuild-runtime', mode: 'development', snapshotCss: false },
   { type: 'esbuild-runtime', mode: 'production', snapshotCss: false },
+  { type: 'esbuild-next', mode: 'development', snapshotCss: true },
+  { type: 'esbuild-next', mode: 'production', snapshotCss: true },
+  { type: 'esbuild-next-runtime', mode: 'development', snapshotCss: false },
+  { type: 'esbuild-next-runtime', mode: 'production', snapshotCss: false },
   { type: 'vite', mode: 'development', snapshotCss: false },
   { type: 'vite', mode: 'production', snapshotCss: true },
   { type: 'parcel', mode: 'development', snapshotCss: true },
diff --git a/tests/e2e/features.playwright.ts-snapshots/features-esbuild-next--development.css b/tests/e2e/features.playwright.ts-snapshots/features-esbuild-next--development.css
new file mode 100644
index 0000000..202bc43
--- /dev/null
+++ b/tests/e2e/features.playwright.ts-snapshots/features-esbuild-next--development.css
@@ -0,0 +1,51 @@
+.features_mergedStyle__1o6ek500 {
+  height: 50px;
+}
+.features_mergedStyle__1o6ek500:after {
+  content: "Below 700px";
+  display: block;
+}
+.features_styleWithComposition__1o6ek501 {
+  background-color: #b0e0e6;
+}
+.features_styleWithComposition__1o6ek501:hover {
+  background-color: #708090;
+}
+.features_styleVariantsWithComposition_variant__1o6ek502 {
+  background-color: #b0e0e6;
+}
+.features_styleVariantsWithComposition_variant__1o6ek502:hover {
+  background-color: #708090;
+}
+.features_styleVariantsWithMappedComposition_variant__1o6ek503 {
+  background-color: #b0e0e6;
+}
+.features_styleVariantsWithMappedComposition_variant__1o6ek503:hover {
+  background-color: #708090;
+}
+.features_styleCompositionInSelector__1o6ek505 {
+  color: #fff;
+}
+.features_styleCompositionInSelector__1o6ek506 {
+  background-color: #000;
+}
+body .features_styleCompositionInSelector__1o6ek507 {
+  font-size: 24px;
+}
+.features_styleVariantsCompositionInSelector_variant__1o6ek508 {
+  color: #fff;
+}
+.features_styleVariantsCompositionInSelector_variant__1o6ek509 {
+  background-color: #000;
+}
+body .features_styleVariantsCompositionInSelector_variant__1o6ek50a {
+  font-size: 24px;
+}
+@media screen and (min-width: 700px) {
+  .features_mergedStyle__1o6ek500 {
+    color: plum;
+  }
+  .features_mergedStyle__1o6ek500:after {
+    content: "Above 700px";
+  }
+}
diff --git a/tests/e2e/features.playwright.ts-snapshots/features-esbuild-next--production.css b/tests/e2e/features.playwright.ts-snapshots/features-esbuild-next--production.css
new file mode 100644
index 0000000..17c7bea
--- /dev/null
+++ b/tests/e2e/features.playwright.ts-snapshots/features-esbuild-next--production.css
@@ -0,0 +1,51 @@
+._1o6ek500 {
+  height: 50px;
+}
+._1o6ek500:after {
+  content: "Below 700px";
+  display: block;
+}
+._1o6ek501 {
+  background-color: #b0e0e6;
+}
+._1o6ek501:hover {
+  background-color: #708090;
+}
+._1o6ek502 {
+  background-color: #b0e0e6;
+}
+._1o6ek502:hover {
+  background-color: #708090;
+}
+._1o6ek503 {
+  background-color: #b0e0e6;
+}
+._1o6ek503:hover {
+  background-color: #708090;
+}
+._1o6ek505 {
+  color: #fff;
+}
+._1o6ek506 {
+  background-color: #000;
+}
+body ._1o6ek507 {
+  font-size: 24px;
+}
+._1o6ek508 {
+  color: #fff;
+}
+._1o6ek509 {
+  background-color: #000;
+}
+body ._1o6ek50a {
+  font-size: 24px;
+}
+@media screen and (min-width: 700px) {
+  ._1o6ek500 {
+    color: plum;
+  }
+  ._1o6ek500:after {
+    content: "Above 700px";
+  }
+}
diff --git a/tests/e2e/low-level.playwright.ts b/tests/e2e/low-level.playwright.ts
index 287a9d8..ea82fe3 100644
--- a/tests/e2e/low-level.playwright.ts
+++ b/tests/e2e/low-level.playwright.ts
@@ -15,6 +15,10 @@ const testCases = [
   { type: 'esbuild', mode: 'production', snapshotCss: true },
   { type: 'esbuild-runtime', mode: 'development', snapshotCss: false },
   { type: 'esbuild-runtime', mode: 'production', snapshotCss: false },
+  { type: 'esbuild-next', mode: 'development', snapshotCss: true },
+  { type: 'esbuild-next', mode: 'production', snapshotCss: true },
+  { type: 'esbuild-next-runtime', mode: 'development', snapshotCss: false },
+  { type: 'esbuild-next-runtime', mode: 'production', snapshotCss: false },
   { type: 'vite', mode: 'development', snapshotCss: false },
   { type: 'vite', mode: 'production', snapshotCss: true },
   { type: 'parcel', mode: 'development', snapshotCss: true },
diff --git a/tests/e2e/low-level.playwright.ts-snapshots/low-level-esbuild-next--development.css b/tests/e2e/low-level.playwright.ts-snapshots/low-level-esbuild-next--development.css
new file mode 100644
index 0000000..ff452bc
--- /dev/null
+++ b/tests/e2e/low-level.playwright.ts-snapshots/low-level-esbuild-next--development.css
@@ -0,0 +1,17 @@
+.styles_container__1amv5mo2 {
+  container-type: size;
+  container-name: styles_my-container__1amv5mo1;
+  width: 500px;
+}
+.styles_block__1amv5mo3 {
+  --color__1amv5mo0: blue;
+  background-color: var(--color__1amv5mo0);
+  padding: 20px;
+}
+@media screen and (min-width: 200px) {
+  @container styles_my-container__1amv5mo1 (min-width: 400px) {
+    .styles_block__1amv5mo3 {
+      color: #fff;
+    }
+  }
+}
diff --git a/tests/e2e/low-level.playwright.ts-snapshots/low-level-esbuild-next--production.css b/tests/e2e/low-level.playwright.ts-snapshots/low-level-esbuild-next--production.css
new file mode 100644
index 0000000..8d635f9
--- /dev/null
+++ b/tests/e2e/low-level.playwright.ts-snapshots/low-level-esbuild-next--production.css
@@ -0,0 +1,17 @@
+._1amv5mo2 {
+  container-type: size;
+  container-name: _1amv5mo1;
+  width: 500px;
+}
+._1amv5mo3 {
+  --_1amv5mo0: blue;
+  background-color: var(--_1amv5mo0);
+  padding: 20px;
+}
+@media screen and (min-width: 200px) {
+  @container _1amv5mo1 (min-width: 400px) {
+    ._1amv5mo3 {
+      color: #fff;
+    }
+  }
+}
diff --git a/tests/e2e/recipes.playwright.ts b/tests/e2e/recipes.playwright.ts
index 870d2ca..43a487e 100644
--- a/tests/e2e/recipes.playwright.ts
+++ b/tests/e2e/recipes.playwright.ts
@@ -15,6 +15,10 @@ const testCases = [
   { type: 'esbuild', mode: 'production', snapshotCss: true },
   { type: 'esbuild-runtime', mode: 'development', snapshotCss: false },
   { type: 'esbuild-runtime', mode: 'production', snapshotCss: false },
+  { type: 'esbuild-next', mode: 'development', snapshotCss: true },
+  { type: 'esbuild-next', mode: 'production', snapshotCss: true },
+  { type: 'esbuild-next-runtime', mode: 'development', snapshotCss: false },
+  { type: 'esbuild-next-runtime', mode: 'production', snapshotCss: false },
   { type: 'vite', mode: 'development', snapshotCss: false },
   { type: 'vite', mode: 'production', snapshotCss: true },
   { type: 'parcel', mode: 'development', snapshotCss: true },
diff --git a/tests/e2e/recipes.playwright.ts-snapshots/recipes-esbuild-next--development.css b/tests/e2e/recipes.playwright.ts-snapshots/recipes-esbuild-next--development.css
new file mode 100644
index 0000000..3a4efb1
--- /dev/null
+++ b/tests/e2e/recipes.playwright.ts-snapshots/recipes-esbuild-next--development.css
@@ -0,0 +1,50 @@
+.styles_calm__103pmpm2 {
+  --bg__103pmpm0: #b0e0e6;
+  --fg__103pmpm1: #fff;
+}
+.styles_angry__103pmpm3 {
+  --bg__103pmpm0: crimson;
+  --fg__103pmpm1: #000;
+}
+.styles_reset__103pmpm4 {
+  border: 0;
+}
+.styles_button__103pmpm5 {
+  background: var(--bg__103pmpm0);
+  border-radius: 6px;
+  color: var(--fg__103pmpm1);
+  transition: all 0.2s ease;
+}
+.styles_button__103pmpm5:hover {
+  transform: translateY(-3px);
+}
+.styles_button_size_small__103pmpm6 {
+  font-size: 16px;
+  line-height: 24px;
+}
+.styles_button_size_standard__103pmpm7 {
+  font-size: 24px;
+  line-height: 40px;
+}
+.styles_button_tone_angry__103pmpm9:hover {
+  box-shadow: 0 10px 6px -6px #777;
+}
+.styles_button_bold_true__103pmpma {
+  font-weight: 700;
+}
+.styles_stack__103pmpmc {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+}
+.styles_stack_space_medium__103pmpmd {
+  gap: 20px;
+}
+@media only screen and (min-width: 600px) {
+  .styles_button_compound_0__103pmpmb {
+    border: 2px solid green;
+  }
+  .styles_stack_space_medium__103pmpmd {
+    gap: 30px;
+  }
+}
diff --git a/tests/e2e/recipes.playwright.ts-snapshots/recipes-esbuild-next--production.css b/tests/e2e/recipes.playwright.ts-snapshots/recipes-esbuild-next--production.css
new file mode 100644
index 0000000..11a7d33
--- /dev/null
+++ b/tests/e2e/recipes.playwright.ts-snapshots/recipes-esbuild-next--production.css
@@ -0,0 +1,50 @@
+._103pmpm2 {
+  --_103pmpm0: #b0e0e6;
+  --_103pmpm1: #fff;
+}
+._103pmpm3 {
+  --_103pmpm0: crimson;
+  --_103pmpm1: #000;
+}
+._103pmpm4 {
+  border: 0;
+}
+._103pmpm5 {
+  background: var(--_103pmpm0);
+  border-radius: 6px;
+  color: var(--_103pmpm1);
+  transition: all 0.2s ease;
+}
+._103pmpm5:hover {
+  transform: translateY(-3px);
+}
+._103pmpm6 {
+  font-size: 16px;
+  line-height: 24px;
+}
+._103pmpm7 {
+  font-size: 24px;
+  line-height: 40px;
+}
+._103pmpm9:hover {
+  box-shadow: 0 10px 6px -6px #777;
+}
+._103pmpma {
+  font-weight: 700;
+}
+._103pmpmc {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+}
+._103pmpmd {
+  gap: 20px;
+}
+@media only screen and (min-width: 600px) {
+  ._103pmpmb {
+    border: 2px solid green;
+  }
+  ._103pmpmd {
+    gap: 30px;
+  }
+}
diff --git a/tests/e2e/sprinkles.playwright.ts b/tests/e2e/sprinkles.playwright.ts
index 3143579..9a68e02 100644
--- a/tests/e2e/sprinkles.playwright.ts
+++ b/tests/e2e/sprinkles.playwright.ts
@@ -15,6 +15,10 @@ const testCases = [
   { type: 'esbuild', mode: 'production', snapshotCss: true },
   { type: 'esbuild-runtime', mode: 'development', snapshotCss: false },
   { type: 'esbuild-runtime', mode: 'production', snapshotCss: false },
+  { type: 'esbuild-next', mode: 'development', snapshotCss: true },
+  { type: 'esbuild-next', mode: 'production', snapshotCss: true },
+  { type: 'esbuild-next-runtime', mode: 'development', snapshotCss: false },
+  { type: 'esbuild-next-runtime', mode: 'production', snapshotCss: false },
   { type: 'vite', mode: 'development', snapshotCss: false },
   { type: 'vite', mode: 'production', snapshotCss: true },
   { type: 'parcel', mode: 'development', snapshotCss: true },
diff --git a/tests/e2e/sprinkles.playwright.ts-snapshots/sprinkles-esbuild-next--development.css b/tests/e2e/sprinkles.playwright.ts-snapshots/sprinkles-esbuild-next--development.css
new file mode 100644
index 0000000..c1ae0eb
--- /dev/null
+++ b/tests/e2e/sprinkles.playwright.ts-snapshots/sprinkles-esbuild-next--development.css
@@ -0,0 +1,154 @@
+.styles_container__1j5zl923 {
+  container-name: styles_containerName__1j5zl922;
+  container-type: size;
+}
+.styles_display_flex_mobile__1j5zl924 {
+  display: flex;
+}
+.styles_display_none_mobile__1j5zl928 {
+  display: none;
+}
+.styles_display_block_mobile__1j5zl92c {
+  display: block;
+}
+.styles_paddingTop_small_mobile__1j5zl92g {
+  padding-top: 10px;
+}
+.styles_paddingTop_medium_mobile__1j5zl92k {
+  padding-top: 20px;
+}
+.styles_background_red_mobile__1j5zl92o {
+  --alpha__1j5zl920: 1;
+  background: rgba(255, 0, 0, var(--alpha__1j5zl920));
+}
+.styles_backgroundOpacity_1_mobile__1j5zl92s {
+  --alpha__1j5zl920: 1;
+}
+.styles_backgroundOpacity_0\.1_mobile__1j5zl92w {
+  --alpha__1j5zl920: 0.1;
+}
+.styles_backgroundOpacity_0\.2_mobile__1j5zl9210 {
+  --alpha__1j5zl920: 0.2;
+}
+.styles_backgroundOpacity_0\.3_mobile__1j5zl9214 {
+  --alpha__1j5zl920: 0.3;
+}
+.styles_color_red__1j5zl9218 {
+  --textAlpha__1j5zl921: 1;
+  color: rgba(255, 0, 0, var(--textAlpha__1j5zl921));
+}
+.styles_textOpacity_1__1j5zl9219 {
+  --textAlpha__1j5zl921: 1;
+}
+.styles_textOpacity_0\.8__1j5zl921a {
+  --textAlpha__1j5zl921: 0.8;
+}
+body {
+  margin: 0;
+}
+body .styles__1j5zl921c {
+  background: red;
+}
+@media screen and (min-width: 768px) {
+  @container styles_containerName__1j5zl922 (min-width: 768px) {
+    .styles_display_flex_tablet__1j5zl925 {
+      display: flex;
+    }
+    .styles_display_none_tablet__1j5zl929 {
+      display: none;
+    }
+    .styles_display_block_tablet__1j5zl92d {
+      display: block;
+    }
+    .styles_paddingTop_small_tablet__1j5zl92h {
+      padding-top: 10px;
+    }
+    .styles_paddingTop_medium_tablet__1j5zl92l {
+      padding-top: 20px;
+    }
+    .styles_background_red_tablet__1j5zl92p {
+      --alpha__1j5zl920: 1;
+      background: rgba(255, 0, 0, var(--alpha__1j5zl920));
+    }
+    .styles_backgroundOpacity_1_tablet__1j5zl92t {
+      --alpha__1j5zl920: 1;
+    }
+    .styles_backgroundOpacity_0\.1_tablet__1j5zl92x {
+      --alpha__1j5zl920: 0.1;
+    }
+    .styles_backgroundOpacity_0\.2_tablet__1j5zl9211 {
+      --alpha__1j5zl920: 0.2;
+    }
+    .styles_backgroundOpacity_0\.3_tablet__1j5zl9215 {
+      --alpha__1j5zl920: 0.3;
+    }
+  }
+}
+@media screen and (min-width: 1024px) {
+  @container styles_containerName__1j5zl922 (min-width: 1024px) {
+    .styles_display_flex_desktop__1j5zl926 {
+      display: flex;
+    }
+    .styles_display_none_desktop__1j5zl92a {
+      display: none;
+    }
+    .styles_display_block_desktop__1j5zl92e {
+      display: block;
+    }
+    .styles_paddingTop_small_desktop__1j5zl92i {
+      padding-top: 10px;
+    }
+    .styles_paddingTop_medium_desktop__1j5zl92m {
+      padding-top: 20px;
+    }
+    .styles_background_red_desktop__1j5zl92q {
+      --alpha__1j5zl920: 1;
+      background: rgba(255, 0, 0, var(--alpha__1j5zl920));
+    }
+    .styles_backgroundOpacity_1_desktop__1j5zl92u {
+      --alpha__1j5zl920: 1;
+    }
+    .styles_backgroundOpacity_0\.1_desktop__1j5zl92y {
+      --alpha__1j5zl920: 0.1;
+    }
+    .styles_backgroundOpacity_0\.2_desktop__1j5zl9212 {
+      --alpha__1j5zl920: 0.2;
+    }
+    .styles_backgroundOpacity_0\.3_desktop__1j5zl9216 {
+      --alpha__1j5zl920: 0.3;
+    }
+  }
+  @supports not (display: grid) {
+    [data-dark-mode] .styles_display_flex_darkDesktop__1j5zl927 {
+      display: flex;
+    }
+    [data-dark-mode] .styles_display_none_darkDesktop__1j5zl92b {
+      display: none;
+    }
+    [data-dark-mode] .styles_display_block_darkDesktop__1j5zl92f {
+      display: block;
+    }
+    [data-dark-mode] .styles_paddingTop_small_darkDesktop__1j5zl92j {
+      padding-top: 10px;
+    }
+    [data-dark-mode] .styles_paddingTop_medium_darkDesktop__1j5zl92n {
+      padding-top: 20px;
+    }
+    [data-dark-mode] .styles_background_red_darkDesktop__1j5zl92r {
+      --alpha__1j5zl920: 1;
+      background: rgba(255, 0, 0, var(--alpha__1j5zl920));
+    }
+    [data-dark-mode] .styles_backgroundOpacity_1_darkDesktop__1j5zl92v {
+      --alpha__1j5zl920: 1;
+    }
+    [data-dark-mode] .styles_backgroundOpacity_0\.1_darkDesktop__1j5zl92z {
+      --alpha__1j5zl920: 0.1;
+    }
+    [data-dark-mode] .styles_backgroundOpacity_0\.2_darkDesktop__1j5zl9213 {
+      --alpha__1j5zl920: 0.2;
+    }
+    [data-dark-mode] .styles_backgroundOpacity_0\.3_darkDesktop__1j5zl9217 {
+      --alpha__1j5zl920: 0.3;
+    }
+  }
+}
diff --git a/tests/e2e/sprinkles.playwright.ts-snapshots/sprinkles-esbuild-next--production.css b/tests/e2e/sprinkles.playwright.ts-snapshots/sprinkles-esbuild-next--production.css
new file mode 100644
index 0000000..f090da5
--- /dev/null
+++ b/tests/e2e/sprinkles.playwright.ts-snapshots/sprinkles-esbuild-next--production.css
@@ -0,0 +1,154 @@
+._1j5zl923 {
+  container-name: _1j5zl922;
+  container-type: size;
+}
+._1j5zl924 {
+  display: flex;
+}
+._1j5zl928 {
+  display: none;
+}
+._1j5zl92c {
+  display: block;
+}
+._1j5zl92g {
+  padding-top: 10px;
+}
+._1j5zl92k {
+  padding-top: 20px;
+}
+._1j5zl92o {
+  background: rgba(255, 0, 0, var(--_1j5zl920));
+}
+._1j5zl92o,
+._1j5zl92s {
+  --_1j5zl920: 1;
+}
+._1j5zl92w {
+  --_1j5zl920: 0.1;
+}
+._1j5zl9210 {
+  --_1j5zl920: 0.2;
+}
+._1j5zl9214 {
+  --_1j5zl920: 0.3;
+}
+._1j5zl9218 {
+  color: rgba(255, 0, 0, var(--_1j5zl921));
+}
+._1j5zl9218,
+._1j5zl9219 {
+  --_1j5zl921: 1;
+}
+._1j5zl921a {
+  --_1j5zl921: 0.8;
+}
+body {
+  margin: 0;
+}
+body ._1j5zl921c {
+  background: red;
+}
+@media screen and (min-width: 768px) {
+  @container _1j5zl922 (min-width: 768px) {
+    ._1j5zl925 {
+      display: flex;
+    }
+    ._1j5zl929 {
+      display: none;
+    }
+    ._1j5zl92d {
+      display: block;
+    }
+    ._1j5zl92h {
+      padding-top: 10px;
+    }
+    ._1j5zl92l {
+      padding-top: 20px;
+    }
+    ._1j5zl92p {
+      background: rgba(255, 0, 0, var(--_1j5zl920));
+    }
+    ._1j5zl92p,
+    ._1j5zl92t {
+      --_1j5zl920: 1;
+    }
+    ._1j5zl92x {
+      --_1j5zl920: 0.1;
+    }
+    ._1j5zl9211 {
+      --_1j5zl920: 0.2;
+    }
+    ._1j5zl9215 {
+      --_1j5zl920: 0.3;
+    }
+  }
+}
+@media screen and (min-width: 1024px) {
+  @container _1j5zl922 (min-width: 1024px) {
+    ._1j5zl926 {
+      display: flex;
+    }
+    ._1j5zl92a {
+      display: none;
+    }
+    ._1j5zl92e {
+      display: block;
+    }
+    ._1j5zl92i {
+      padding-top: 10px;
+    }
+    ._1j5zl92m {
+      padding-top: 20px;
+    }
+    ._1j5zl92q {
+      background: rgba(255, 0, 0, var(--_1j5zl920));
+    }
+    ._1j5zl92q,
+    ._1j5zl92u {
+      --_1j5zl920: 1;
+    }
+    ._1j5zl92y {
+      --_1j5zl920: 0.1;
+    }
+    ._1j5zl9212 {
+      --_1j5zl920: 0.2;
+    }
+    ._1j5zl9216 {
+      --_1j5zl920: 0.3;
+    }
+  }
+  @supports not (display: grid) {
+    [data-dark-mode] ._1j5zl927 {
+      display: flex;
+    }
+    [data-dark-mode] ._1j5zl92b {
+      display: none;
+    }
+    [data-dark-mode] ._1j5zl92f {
+      display: block;
+    }
+    [data-dark-mode] ._1j5zl92j {
+      padding-top: 10px;
+    }
+    [data-dark-mode] ._1j5zl92n {
+      padding-top: 20px;
+    }
+    [data-dark-mode] ._1j5zl92r {
+      --_1j5zl920: 1;
+      background: rgba(255, 0, 0, var(--_1j5zl920));
+    }
+    [data-dark-mode] ._1j5zl92v {
+      --_1j5zl920: 1;
+    }
+    [data-dark-mode] ._1j5zl92z {
+      --_1j5zl920: 0.1;
+    }
+    [data-dark-mode] ._1j5zl9213 {
+      --_1j5zl920: 0.2;
+    }
+    [data-dark-mode] ._1j5zl9217 {
+      --_1j5zl920: 0.3;
+    }
+  }
+}
diff --git a/tests/e2e/themed.playwright.ts b/tests/e2e/themed.playwright.ts
index ab95ae9..08a2733 100644
--- a/tests/e2e/themed.playwright.ts
+++ b/tests/e2e/themed.playwright.ts
@@ -15,6 +15,10 @@ const testCases = [
   { type: 'esbuild', mode: 'production', snapshotCss: true },
   { type: 'esbuild-runtime', mode: 'development', snapshotCss: false },
   { type: 'esbuild-runtime', mode: 'production', snapshotCss: false },
+  { type: 'esbuild-next', mode: 'development', snapshotCss: true },
+  { type: 'esbuild-next', mode: 'production', snapshotCss: true },
+  { type: 'esbuild-next-runtime', mode: 'development', snapshotCss: false },
+  { type: 'esbuild-next-runtime', mode: 'production', snapshotCss: false },
   { type: 'vite', mode: 'development', snapshotCss: false },
   { type: 'vite', mode: 'production', snapshotCss: true },
   { type: 'parcel', mode: 'development', snapshotCss: true },
diff --git a/tests/e2e/themed.playwright.ts-snapshots/themed-esbuild-next--development.css b/tests/e2e/themed.playwright.ts-snapshots/themed-esbuild-next--development.css
new file mode 100644
index 0000000..93d90cc
--- /dev/null
+++ b/tests/e2e/themed.playwright.ts-snapshots/themed-esbuild-next--development.css
@@ -0,0 +1,90 @@
+.themes_theme__cvta170,
+:root {
+  --colors-backgroundColor__cvta171: blue;
+  --colors-text__cvta172: #fff;
+  --space-1__cvta173: 4px;
+  --space-2__cvta174: 8px;
+  --space-3__cvta175: 12px;
+}
+.themes_altTheme__cvta176 {
+  --colors-backgroundColor__cvta171: green;
+  --colors-text__cvta172: #fff;
+  --space-1__cvta173: 8px;
+  --space-2__cvta174: 12px;
+  --space-3__cvta175: 16px;
+}
+.themes_responsiveTheme__cvta177 {
+  --colors-backgroundColor__cvta171: pink;
+  --colors-text__cvta172: purple;
+  --space-1__cvta173: 6px;
+  --space-2__cvta174: 12px;
+  --space-3__cvta175: 18px;
+}
+@media screen and (min-width: 768px) {
+  .themes_responsiveTheme__cvta177 {
+    --colors-backgroundColor__cvta171: purple;
+    --colors-text__cvta172: pink;
+  }
+}
+.shared_shadow__4dtfen0 {
+  box-shadow: 0 0 5px red;
+}
+body {
+  background-color: skyblue;
+}
+@font-face {
+  font-family: styles_impact__jteyb10;
+  src: local("Impact");
+}
+@font-face {
+  font-family: MyGlobalComicSans;
+  src: local("Comic Sans MS");
+}
+.styles_container__jteyb11 {
+  display: flex;
+  flex-direction: column;
+  gap: var(--space-2__cvta174);
+  padding: var(--space-3__cvta175);
+}
+.styles_iDunno__jteyb12 {
+  position: relative;
+  z-index: 1;
+}
+.styles_button__jteyb13 {
+  background-color: var(
+    --colors-backgroundColor__cvta171,
+    "THIS FALLBACK VALUE SHOULD NEVER BE USED"
+  );
+  border-radius: 9999px;
+  color: var(--colors-text__cvta172);
+  font-family: styles_impact__jteyb10;
+}
+.themes_altTheme__cvta176
+  .themes_theme__cvta170
+  .styles_container__jteyb11
+  .styles_button__jteyb13 {
+  font-family: MyGlobalComicSans;
+  outline: 5px solid red;
+}
+body .styles_iDunno__jteyb12:after {
+  content: "I am content";
+}
+html .styles_opacity_1\/2__jteyb16 {
+  opacity: var(--blankVar1__jteyb14, 0.5);
+}
+html .styles_opacity_1\/4__jteyb17 {
+  opacity: var(--blankVar1__jteyb14, var(--blankVar2__jteyb15, 0.25));
+}
+@media only screen and (min-width: 500px) {
+  .styles_container__jteyb11 {
+    border: 1px solid var(--colors-backgroundColor__cvta171);
+  }
+  .styles_button__jteyb13 {
+    padding: var(--space-1__cvta173);
+  }
+}
+@media only screen and (min-width: 1000px) {
+  .styles_button__jteyb13 {
+    padding: var(--space-2__cvta174);
+  }
+}
diff --git a/tests/e2e/themed.playwright.ts-snapshots/themed-esbuild-next--production.css b/tests/e2e/themed.playwright.ts-snapshots/themed-esbuild-next--production.css
new file mode 100644
index 0000000..2f1848c
--- /dev/null
+++ b/tests/e2e/themed.playwright.ts-snapshots/themed-esbuild-next--production.css
@@ -0,0 +1,84 @@
+.cvta170,
+:root {
+  --cvta171: blue;
+  --cvta172: #fff;
+  --cvta173: 4px;
+  --cvta174: 8px;
+  --cvta175: 12px;
+}
+.cvta176 {
+  --cvta171: green;
+  --cvta172: #fff;
+  --cvta173: 8px;
+  --cvta174: 12px;
+  --cvta175: 16px;
+}
+.cvta177 {
+  --cvta171: pink;
+  --cvta172: purple;
+  --cvta173: 6px;
+  --cvta174: 12px;
+  --cvta175: 18px;
+}
+@media screen and (min-width: 768px) {
+  .cvta177 {
+    --cvta171: purple;
+    --cvta172: pink;
+  }
+}
+._4dtfen0 {
+  box-shadow: 0 0 5px red;
+}
+body {
+  background-color: #87ceeb;
+}
+@font-face {
+  font-family: jteyb10;
+  src: local("Impact");
+}
+@font-face {
+  font-family: MyGlobalComicSans;
+  src: local("Comic Sans MS");
+}
+.jteyb11 {
+  display: flex;
+  flex-direction: column;
+  gap: var(--cvta174);
+  padding: var(--cvta175);
+}
+.jteyb12 {
+  position: relative;
+  z-index: 1;
+}
+.jteyb13 {
+  background-color: var(--cvta171, "THIS FALLBACK VALUE SHOULD NEVER BE USED");
+  border-radius: 9999px;
+  color: var(--cvta172);
+  font-family: jteyb10;
+}
+.cvta176 .cvta170 .jteyb11 .jteyb13 {
+  font-family: MyGlobalComicSans;
+  outline: 5px solid red;
+}
+body .jteyb12:after {
+  content: "I am content";
+}
+html .jteyb16 {
+  opacity: var(--jteyb14, 0.5);
+}
+html .jteyb17 {
+  opacity: var(--jteyb14, var(--jteyb15, 0.25));
+}
+@media only screen and (min-width: 500px) {
+  .jteyb11 {
+    border: 1px solid var(--cvta171);
+  }
+  .jteyb13 {
+    padding: var(--cvta173);
+  }
+}
+@media only screen and (min-width: 1000px) {
+  .jteyb13 {
+    padding: var(--cvta174);
+  }
+}
diff --git a/tests/package.json b/tests/package.json
index d43dcb2..192300a 100644
--- a/tests/package.json
+++ b/tests/package.json
@@ -11,6 +11,7 @@
     "@vanilla-extract-private/test-helpers": "*",
     "@vanilla-extract/css": "*",
     "@vanilla-extract/dynamic": "*",
+    "@vanilla-extract/integration": "*",
     "@vanilla-extract/recipes": "*",
     "@vanilla-extract/sprinkles": "*"
   }
diff --git a/vitest.config.ts b/vitest.config.ts
new file mode 100644
index 0000000..59922da
--- /dev/null
+++ b/vitest.config.ts
@@ -0,0 +1,14 @@
+import { defineConfig } from 'vitest/config';
+import { join, dirname, basename } from 'path';
+
+export default defineConfig({
+  test: {
+    include: ['**/*.vitest.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
+    resolveSnapshotPath: (testPath, snapExtension) => {
+      return join(
+        join(dirname(testPath), '__vitestSnapshots__'),
+        `${basename(testPath)}${snapExtension}`,
+      );
+    },
+  },
+});