🏡 index : ~doyle/chartered.git

author Jordan Doyle <jordan@doyle.la> 2022-09-02 1:59:19.0 +01:00:00
committer Jordan Doyle <jordan@doyle.la> 2022-09-07 1:50:01.0 +01:00:00
commit
6aa4df1a6a7fbcf5dc1b2877cd05d6e1b0b657a4 [patch]
tree
7b903aa20b11d5c73c35229e44c7327b7ebd38b9
parent
f9cf79c81fe92272b517ae9a6be1adedaa4355e2
download
6aa4df1a6a7fbcf5dc1b2877cd05d6e1b0b657a4.tar.gz

Migrate away from React frontend to svelte



Diff

 chartered-frontend/.eslintignore                                                       |   13 +++++++++++++
 chartered-frontend/.eslintrc.cjs                                                       |   20 ++++++++++++++++++++
 chartered-frontend/.gitignore                                                          |   14 +++++++++-----
 chartered-frontend/.npmrc                                                              |    1 +
 chartered-frontend/.parcelrc                                                           |    3 ---
 chartered-frontend/.prettierignore                                                     |   15 +++++++++++++--
 chartered-frontend/.prettierrc                                                         |    9 +++++++++
 chartered-frontend/.prettierrc.json                                                    |    1 -
 chartered-frontend/Dockerfile                                                          |   14 ++++++++------
 chartered-frontend/README.md                                                           |   23 +++++++++++++++++++++++
 chartered-frontend/index.html                                                          |   13 -------------
 chartered-frontend/package-lock.json                                                   | 9001 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/package.json                                                        |   92 ++++++++++++++++++++++++++++++++++++++++++++++----------------------------------
 chartered-frontend/playwright.config.ts                                                |   10 ++++++++++
 chartered-frontend/postcss.config.cjs                                                  |    6 ++++++
 chartered-frontend/svelte.config.js                                                    |   20 ++++++++++++++++++++
 chartered-frontend/tailwind.config.cjs                                                 |   20 ++++++++++++++++++++
 chartered-frontend/tsconfig.json                                                       |   21 +++++++++++++++------
 chartered-frontend/vite.config.ts                                                      |    8 ++++++++
 chartered-frontend/yarn.lock                                                           | 6207 --------------------------------------------------------------------------------
 chartered-frontend/src/app.d.ts                                                        |    8 ++++++++
 chartered-frontend/src/app.html                                                        |   12 ++++++++++++
 chartered-frontend/src/app.pcss                                                        |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/dark.sass                                                       |  133 --------------------------------------------------------------------------------
 chartered-frontend/src/index.sass                                                      |   66 ------------------------------------------------------------------
 chartered-frontend/src/index.tsx                                                       |  123 --------------------------------------------------------------------------------
 chartered-frontend/src/overscrollColourFixer.ts                                        |   33 ---------------------------------
 chartered-frontend/src/useAuth.tsx                                                     |  247 --------------------------------------------------------------------------------
 chartered-frontend/src/util.tsx                                                        |  154 --------------------------------------------------------------------------------
 chartered-frontend/static/favicon.png                                                  |    0 
 chartered-frontend/tests/test.ts                                                       |    6 ++++++
 chartered-frontend/src/components/ErrorAlert.svelte                                    |   31 +++++++++++++++++++++++++++++++
 chartered-frontend/src/components/FeaturedCrate.svelte                                 |   23 +++++++++++++++++++++++
 chartered-frontend/src/components/Icon.svelte                                          |   35 +++++++++++++++++++++++++++++++++++
 chartered-frontend/src/components/Nav.svelte                                           |  150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/components/NavItem.svelte                                       |   40 ++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/components/RelativeTime.svelte                                  |   11 +++++++++++
 chartered-frontend/src/components/Spinner.svelte                                       |   22 ++++++++++++++++++++++
 chartered-frontend/src/img/rust.svg                                                    |   61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/pages/Dashboard.tsx                                             |  189 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/ErrorPage.tsx                                             |    9 ---------
 chartered-frontend/src/pages/Loading.tsx                                               |   19 -------------------
 chartered-frontend/src/pages/Login.tsx                                                 |  260 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/NotFound.tsx                                              |   32 --------------------------------
 chartered-frontend/src/pages/Register.tsx                                              |  194 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/Search.tsx                                                |  217 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/User.tsx                                                  |  168 --------------------------------------------------------------------------------
 chartered-frontend/src/routes/+error.svelte                                            |    8 ++++++++
 chartered-frontend/src/routes/+layout.svelte                                           |    5 +++++
 chartered-frontend/src/routes/+layout.ts                                               |    5 +++++
 chartered-frontend/src/sections/Nav.tsx                                                |  124 --------------------------------------------------------------------------------
 chartered-frontend/src/stores/auth.ts                                                  |  259 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/types/crate.ts                                                  |   31 +++++++++++++++++++++++++++++++
 chartered-frontend/src/types/featured_crate.ts                                         |   16 ++++++++++++++++
 chartered-frontend/src/types/organisations.ts                                          |   25 +++++++++++++++++++++++++
 chartered-frontend/src/types/sessions.ts                                               |   11 +++++++++++
 chartered-frontend/src/types/ssh_keys.ts                                               |   31 +++++++++++++++++++++++++++++++
 chartered-frontend/src/types/user.ts                                                   |    9 +++++++++
 chartered-frontend/src/pages/crate/CrateView.tsx                                       |  554 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/crate/Members.tsx                                         |  490 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/crate/OrganisationView.tsx                                |  303 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/organisations/CreateOrganisation.tsx                      |  147 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/organisations/ListOrganisations.tsx                       |   95 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/sessions/ListSessions.tsx                                 |  206 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/ssh-keys/AddSshKeys.tsx                                   |  110 --------------------------------------------------------------------------------
 chartered-frontend/src/pages/ssh-keys/ListSshKeys.tsx                                  |  253 --------------------------------------------------------------------------------
 chartered-frontend/src/routes/(authed)/+layout.svelte                                  |   20 ++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/+page.svelte                                    |   94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(unauthed)/+layout.svelte                                |   29 +++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/organisations/+page.svelte                      |    5 +++++
 chartered-frontend/src/routes/(authed)/search/+page.svelte                             |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/ssh-keys/+page.svelte                           |   72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/ssh-keys/CreateKeyForm.svelte                   |  104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/ssh-keys/DeleteSshKeyModal.svelte               |  151 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/ssh-keys/SingleSshKey.svelte                    |   42 ++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/crates/[organisation]/+page.svelte              |  176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/crates/[organisation]/AddMember.svelte          |   94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/crates/[organisation]/Member.svelte             |  144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/organisations/create/+page.svelte               |  135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/organisations/list/+page.svelte                 |   67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/sessions/list/+page.svelte                      |   97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/sessions/list/DeleteSessionModal.svelte         |  144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/users/[uuid]/+page.svelte                       |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(unauthed)/auth/login/+page.svelte                       |  144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(unauthed)/auth/register/+page.svelte                    |   93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/+page.svelte      |  145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/Dependency.svelte |   29 +++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/MemberTab.svelte  |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/VersionTab.svelte |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 89 files changed, 12098 insertions(+), 10415 deletions(-)

diff --git a/chartered-frontend/.eslintignore b/chartered-frontend/.eslintignore
new file mode 100644
index 0000000..3897265 100644
--- /dev/null
+++ a/chartered-frontend/.eslintignore
@@ -1,0 +1,13 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example

# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock
diff --git a/chartered-frontend/.eslintrc.cjs b/chartered-frontend/.eslintrc.cjs
new file mode 100644
index 0000000..dc1500d 100644
--- /dev/null
+++ a/chartered-frontend/.eslintrc.cjs
@@ -1,0 +1,20 @@
module.exports = {
    root: true,
    parser: '@typescript-eslint/parser',
    extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'],
    plugins: ['svelte3', '@typescript-eslint'],
    ignorePatterns: ['*.cjs'],
    overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }],
    settings: {
        'svelte3/typescript': () => require('typescript'),
    },
    parserOptions: {
        sourceType: 'module',
        ecmaVersion: 2020,
    },
    env: {
        browser: true,
        es2017: true,
        node: true,
    },
};
diff --git a/chartered-frontend/.gitignore b/chartered-frontend/.gitignore
index 9ed8fa0..d6d92d4 100644
--- a/chartered-frontend/.gitignore
+++ a/chartered-frontend/.gitignore
@@ -1,5 +1,9 @@
node_modules/
.parcel-cache/
.cache/
dist/
parcel-bundle-reports/
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
/.vite
diff --git a/chartered-frontend/.npmrc b/chartered-frontend/.npmrc
new file mode 100644
index 0000000..b6f27f1 100644
--- /dev/null
+++ a/chartered-frontend/.npmrc
@@ -1,0 +1,1 @@
engine-strict=true
diff --git a/chartered-frontend/.parcelrc b/chartered-frontend/.parcelrc
deleted file mode 100644
index 47d1b5e..0000000 100644
--- a/chartered-frontend/.parcelrc
+++ /dev/null
@@ -1,3 +1,0 @@
{
  "extends": "@parcel/config-default"
}
diff --git a/chartered-frontend/.prettierignore b/chartered-frontend/.prettierignore
index ba70f38..3897265 100644
--- a/chartered-frontend/.prettierignore
+++ a/chartered-frontend/.prettierignore
@@ -1,2 +1,13 @@
.cache
dist
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example

# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock
diff --git a/chartered-frontend/.prettierrc b/chartered-frontend/.prettierrc
new file mode 100644
index 0000000..6148af6 100644
--- /dev/null
+++ a/chartered-frontend/.prettierrc
@@ -1,0 +1,9 @@
{
    "useTabs": false,
    "tabWidth": 4,
    "singleQuote": true,
    "trailingComma": "all",
    "printWidth": 120,
    "pluginSearchDirs": ["."],
    "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
}
diff --git a/chartered-frontend/.prettierrc.json b/chartered-frontend/.prettierrc.json
deleted file mode 100644
index 0967ef4..0000000 100644
--- a/chartered-frontend/.prettierrc.json
+++ /dev/null
@@ -1,1 +1,0 @@
{}
diff --git a/chartered-frontend/Dockerfile b/chartered-frontend/Dockerfile
index 308c0f0..2f95fa6 100644
--- a/chartered-frontend/Dockerfile
+++ a/chartered-frontend/Dockerfile
@@ -1,12 +1,14 @@
FROM node AS builder
ARG BASE_URL
RUN ["/bin/bash", "-c", ": ${BASE_URL:?BASE_URL must be set to the public URL that chartered-web can be reached by passing --build-arg to docker build.}"]
ARG CHARTERED_WEB_URL
RUN ["/bin/bash", "-c", ": ${CHARTERED_WEB_URL:?CHARTERED_WEB_URL must be set to the public URL that chartered-web can be reached by passing --build-arg to docker build.}"]
WORKDIR /app
COPY . /app
RUN yarn install && yarn build
RUN npm install -D && npm run build
RUN echo '{"type": "module"}' > /app/build/package.json
ENTRYPOINT [ "/bin/sh" ]

FROM joseluisq/static-web-server
ENV SERVER_LOG_LEVEL=info SERVER_ERROR_PAGE_404=./index.html SERVER_ROOT=. SERVER_SECURITY_HEADERS=true
FROM node
WORKDIR /app
COPY --from=builder /app/dist .
COPY --from=builder /app/build .
EXPOSE 3000
CMD [ "node", "/app/index.js" ]
diff --git a/chartered-frontend/README.md b/chartered-frontend/README.md
new file mode 100644
index 0000000..860d947 100644
--- /dev/null
+++ a/chartered-frontend/README.md
@@ -1,0 +1,23 @@
# chartered-frontend

Everything Chartered frontend lives here, this is what users will typically
interact with on a day-to-day basis on the web.

## Developing

Once you've installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:

```bash

npm run dev

# or start the server and open the app in a new browser tab
npm run dev -- --open
```


## Building

To create a production version of chartered-frontend:

```bash

docker build . --build-arg CHARTERED_WEB_URL=http://127.0.0.1:3000
```

diff --git a/chartered-frontend/index.html b/chartered-frontend/index.html
deleted file mode 100644
index bcbcc34..0000000 100644
--- a/chartered-frontend/index.html
+++ /dev/null
@@ -1,13 +1,0 @@
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>chartered</title>
  </head>

  <body class="min-vh-100">
    <div id="root"></div>
    <script src="./src/index.tsx" type="module"></script>
  </body>
</html>
diff --git a/chartered-frontend/package-lock.json b/chartered-frontend/package-lock.json
new file mode 100644
index 0000000..a518a13 100644
--- /dev/null
+++ a/chartered-frontend/package-lock.json
@@ -1,0 +1,9001 @@
{
    "name": "chartered-frontend-svelte",
    "version": "0.0.1",
    "lockfileVersion": 2,
    "requires": true,
    "packages": {
        "": {
            "name": "chartered-frontend-svelte",
            "version": "0.0.1",
            "dependencies": {
                "@sveltejs/adapter-node": "^1.0.0-next.88",
                "lodash": "^4.17.21",
                "svelte-markdown": "^0.2.3"
            },

            "devDependencies": {
                "@playwright/test": "^1.25.0",
                "@sveltejs/adapter-auto": "^1.0.0-next.71",
                "@sveltejs/kit": "next",
                "@tailwindcss/forms": "^0.5.3",
                "@tailwindcss/typography": "^0.5.7",
                "@types/feather-icons": "^4.7.0",
                "@types/lodash": "^4.14.184",
                "@types/luxon": "^3.0.1",
                "@typescript-eslint/eslint-plugin": "^5.27.0",
                "@typescript-eslint/parser": "^5.27.0",
                "autoprefixer": "^10.4.8",
                "eslint": "^8.16.0",
                "eslint-config-prettier": "^8.3.0",
                "eslint-plugin-svelte3": "^4.0.0",
                "feather-icons": "^4.29.0",
                "luxon": "^3.0.3",
                "postcss": "^8.4.16",
                "prettier": "^2.6.2",
                "prettier-plugin-svelte": "^2.7.0",
                "svelte": "^3.44.0",
                "svelte-check": "^2.7.1",
                "svelte-preprocess": "^4.10.6",
                "tailwindcss": "^3.1.8",
                "tslib": "^2.3.1",
                "typescript": "^4.7.4",
                "vite": "^3.1.0-beta.1"
            }

        },

        "node_modules/@cloudflare/workers-types": {
            "version": "3.16.0",
            "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-3.16.0.tgz",
            "integrity": "sha512-gaBUSaKS65mN3iKZEgichbXYEmAa/pXkc5Gbt+1BptYphdGkj09ggdsiE4w8g0F/uI1g36QaTKrzVnBAWMipvQ==",
            "dev": true
        },

        "node_modules/@esbuild/linux-loong64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.7.tgz",
            "integrity": "sha512-IKznSJOsVUuyt7cDzzSZyqBEcZe+7WlBqTVXiF1OXP/4Nm387ToaXZ0fyLwI1iBlI/bzpxVq411QE2/Bt2XWWw==",
            "cpu": [
                "loong64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@eslint/eslintrc": {
            "version": "1.3.1",
            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz",
            "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==",
            "dev": true,
            "dependencies": {
                "ajv": "^6.12.4",
                "debug": "^4.3.2",
                "espree": "^9.4.0",
                "globals": "^13.15.0",
                "ignore": "^5.2.0",
                "import-fresh": "^3.2.1",
                "js-yaml": "^4.1.0",
                "minimatch": "^3.1.2",
                "strip-json-comments": "^3.1.1"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "url": "https://opencollective.com/eslint"
            }

        },

        "node_modules/@humanwhocodes/config-array": {
            "version": "0.10.4",
            "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz",
            "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==",
            "dev": true,
            "dependencies": {
                "@humanwhocodes/object-schema": "^1.2.1",
                "debug": "^4.1.1",
                "minimatch": "^3.0.4"
            },

            "engines": {
                "node": ">=10.10.0"
            }

        },

        "node_modules/@humanwhocodes/gitignore-to-minimatch": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz",
            "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==",
            "dev": true,
            "funding": {
                "type": "github",
                "url": "https://github.com/sponsors/nzakas"
            }

        },

        "node_modules/@humanwhocodes/module-importer": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
            "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
            "dev": true,
            "engines": {
                "node": ">=12.22"
            },

            "funding": {
                "type": "github",
                "url": "https://github.com/sponsors/nzakas"
            }

        },

        "node_modules/@humanwhocodes/object-schema": {
            "version": "1.2.1",
            "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
            "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
            "dev": true
        },

        "node_modules/@iarna/toml": {
            "version": "2.2.5",
            "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz",
            "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
            "dev": true
        },

        "node_modules/@jridgewell/resolve-uri": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
            "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
            "dev": true,
            "engines": {
                "node": ">=6.0.0"
            }

        },

        "node_modules/@jridgewell/sourcemap-codec": {
            "version": "1.4.14",
            "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
            "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
            "dev": true
        },

        "node_modules/@jridgewell/trace-mapping": {
            "version": "0.3.15",
            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
            "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
            "dev": true,
            "dependencies": {
                "@jridgewell/resolve-uri": "^3.0.3",
                "@jridgewell/sourcemap-codec": "^1.4.10"
            }

        },

        "node_modules/@mapbox/node-pre-gyp": {
            "version": "1.0.10",
            "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
            "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==",
            "dev": true,
            "dependencies": {
                "detect-libc": "^2.0.0",
                "https-proxy-agent": "^5.0.0",
                "make-dir": "^3.1.0",
                "node-fetch": "^2.6.7",
                "nopt": "^5.0.0",
                "npmlog": "^5.0.1",
                "rimraf": "^3.0.2",
                "semver": "^7.3.5",
                "tar": "^6.1.11"
            },

            "bin": {
                "node-pre-gyp": "bin/node-pre-gyp"
            }

        },

        "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": {
            "version": "2.6.7",
            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
            "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
            "dev": true,
            "dependencies": {
                "whatwg-url": "^5.0.0"
            },

            "engines": {
                "node": "4.x || >=6.0.0"
            },

            "peerDependencies": {
                "encoding": "^0.1.0"
            },

            "peerDependenciesMeta": {
                "encoding": {
                    "optional": true
                }

            }

        },

        "node_modules/@nodelib/fs.scandir": {
            "version": "2.1.5",
            "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
            "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
            "dev": true,
            "dependencies": {
                "@nodelib/fs.stat": "2.0.5",
                "run-parallel": "^1.1.9"
            },

            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/@nodelib/fs.stat": {
            "version": "2.0.5",
            "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
            "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
            "dev": true,
            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/@nodelib/fs.walk": {
            "version": "1.2.8",
            "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
            "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
            "dev": true,
            "dependencies": {
                "@nodelib/fs.scandir": "2.1.5",
                "fastq": "^1.6.0"
            },

            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/@playwright/test": {
            "version": "1.25.1",
            "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.25.1.tgz",
            "integrity": "sha512-IJ4X0yOakXtwkhbnNzKkaIgXe6df7u3H3FnuhI9Jqh+CdO0e/lYQlDLYiyI9cnXK8E7UAppAWP+VqAv6VX7HQg==",
            "dev": true,
            "dependencies": {
                "@types/node": "*",
                "playwright-core": "1.25.1"
            },

            "bin": {
                "playwright": "cli.js"
            },

            "engines": {
                "node": ">=14"
            }

        },

        "node_modules/@polka/url": {
            "version": "1.0.0-next.21",
            "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
            "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
            "dev": true
        },

        "node_modules/@rollup/pluginutils": {
            "version": "4.2.1",
            "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
            "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
            "dev": true,
            "dependencies": {
                "estree-walker": "^2.0.1",
                "picomatch": "^2.2.2"
            },

            "engines": {
                "node": ">= 8.0.0"
            }

        },

        "node_modules/@sveltejs/adapter-auto": {
            "version": "1.0.0-next.71",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-1.0.0-next.71.tgz",
            "integrity": "sha512-Qsl82HcehWJbZztXgmU/nTPDeeIaB4jrOQpSvy3Pi8octs+rEf/CO87Wk06EP+M/zUzEHDNENMOx0DgWuHpj7Q==",
            "dev": true,
            "dependencies": {
                "@sveltejs/adapter-cloudflare": "1.0.0-next.32",
                "@sveltejs/adapter-netlify": "1.0.0-next.76",
                "@sveltejs/adapter-vercel": "1.0.0-next.72"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare": {
            "version": "1.0.0-next.32",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-cloudflare/-/adapter-cloudflare-1.0.0-next.32.tgz",
            "integrity": "sha512-tzkUsdQlBk9xUjcGUOBYos4HKaeaXvz9v4TQ1QS2yIHEtL5xvMEDPZ94/DB2gPL4LZCnYbdY2lsy5HCsoN0hkQ==",
            "dev": true,
            "dependencies": {
                "@cloudflare/workers-types": "^3.14.0",
                "esbuild": "^0.14.48",
                "worktop": "0.8.0-next.14"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/@esbuild/linux-loong64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
            "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
            "cpu": [
                "loong64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
            "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
            "dev": true,
            "hasInstallScript": true,
            "bin": {
                "esbuild": "bin/esbuild"
            },

            "engines": {
                "node": ">=12"
            },

            "optionalDependencies": {
                "@esbuild/linux-loong64": "0.14.54",
                "esbuild-android-64": "0.14.54",
                "esbuild-android-arm64": "0.14.54",
                "esbuild-darwin-64": "0.14.54",
                "esbuild-darwin-arm64": "0.14.54",
                "esbuild-freebsd-64": "0.14.54",
                "esbuild-freebsd-arm64": "0.14.54",
                "esbuild-linux-32": "0.14.54",
                "esbuild-linux-64": "0.14.54",
                "esbuild-linux-arm": "0.14.54",
                "esbuild-linux-arm64": "0.14.54",
                "esbuild-linux-mips64le": "0.14.54",
                "esbuild-linux-ppc64le": "0.14.54",
                "esbuild-linux-riscv64": "0.14.54",
                "esbuild-linux-s390x": "0.14.54",
                "esbuild-netbsd-64": "0.14.54",
                "esbuild-openbsd-64": "0.14.54",
                "esbuild-sunos-64": "0.14.54",
                "esbuild-windows-32": "0.14.54",
                "esbuild-windows-64": "0.14.54",
                "esbuild-windows-arm64": "0.14.54"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-android-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
            "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-android-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
            "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-darwin-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
            "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-darwin-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
            "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-freebsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
            "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-freebsd-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
            "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-linux-32": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
            "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
            "cpu": [
                "ia32"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-linux-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
            "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-linux-arm": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
            "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
            "cpu": [
                "arm"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-linux-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
            "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-linux-mips64le": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
            "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
            "cpu": [
                "mips64el"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-linux-ppc64le": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
            "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
            "cpu": [
                "ppc64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-linux-riscv64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
            "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
            "cpu": [
                "riscv64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-linux-s390x": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
            "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
            "cpu": [
                "s390x"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-netbsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
            "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "netbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-openbsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
            "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "openbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-sunos-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
            "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "sunos"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-windows-32": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
            "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
            "cpu": [
                "ia32"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-windows-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
            "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-cloudflare/node_modules/esbuild-windows-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
            "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify": {
            "version": "1.0.0-next.76",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-netlify/-/adapter-netlify-1.0.0-next.76.tgz",
            "integrity": "sha512-XC33i13N+zkDP1rKrssQ55TPzt4DkLjKux6g1xW2MB+5KxnC9PP2rIkocKxFw/pK2XU8cUIgmOJ1y5PQrHaiKg==",
            "dev": true,
            "dependencies": {
                "@iarna/toml": "^2.2.5",
                "esbuild": "^0.14.48",
                "set-cookie-parser": "^2.4.8",
                "tiny-glob": "^0.2.9"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/@esbuild/linux-loong64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
            "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
            "cpu": [
                "loong64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
            "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
            "dev": true,
            "hasInstallScript": true,
            "bin": {
                "esbuild": "bin/esbuild"
            },

            "engines": {
                "node": ">=12"
            },

            "optionalDependencies": {
                "@esbuild/linux-loong64": "0.14.54",
                "esbuild-android-64": "0.14.54",
                "esbuild-android-arm64": "0.14.54",
                "esbuild-darwin-64": "0.14.54",
                "esbuild-darwin-arm64": "0.14.54",
                "esbuild-freebsd-64": "0.14.54",
                "esbuild-freebsd-arm64": "0.14.54",
                "esbuild-linux-32": "0.14.54",
                "esbuild-linux-64": "0.14.54",
                "esbuild-linux-arm": "0.14.54",
                "esbuild-linux-arm64": "0.14.54",
                "esbuild-linux-mips64le": "0.14.54",
                "esbuild-linux-ppc64le": "0.14.54",
                "esbuild-linux-riscv64": "0.14.54",
                "esbuild-linux-s390x": "0.14.54",
                "esbuild-netbsd-64": "0.14.54",
                "esbuild-openbsd-64": "0.14.54",
                "esbuild-sunos-64": "0.14.54",
                "esbuild-windows-32": "0.14.54",
                "esbuild-windows-64": "0.14.54",
                "esbuild-windows-arm64": "0.14.54"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-android-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
            "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-android-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
            "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-darwin-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
            "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-darwin-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
            "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-freebsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
            "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-freebsd-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
            "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-linux-32": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
            "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
            "cpu": [
                "ia32"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-linux-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
            "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-linux-arm": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
            "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
            "cpu": [
                "arm"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-linux-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
            "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-linux-mips64le": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
            "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
            "cpu": [
                "mips64el"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-linux-ppc64le": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
            "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
            "cpu": [
                "ppc64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-linux-riscv64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
            "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
            "cpu": [
                "riscv64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-linux-s390x": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
            "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
            "cpu": [
                "s390x"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-netbsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
            "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "netbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-openbsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
            "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "openbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-sunos-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
            "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "sunos"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-windows-32": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
            "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
            "cpu": [
                "ia32"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-windows-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
            "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-netlify/node_modules/esbuild-windows-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
            "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node": {
            "version": "1.0.0-next.88",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-1.0.0-next.88.tgz",
            "integrity": "sha512-N75E0tbq1+70/8lYUbttj7ry+5PDl7DB29aJqYIQQdnWMkIv0CPnH5ux4fwDuQJuhR7k1lfUbLd96JWwPBHvIg==",
            "dependencies": {
                "esbuild": "^0.14.48"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/@esbuild/linux-loong64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
            "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
            "cpu": [
                "loong64"
            ],

            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
            "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
            "hasInstallScript": true,
            "bin": {
                "esbuild": "bin/esbuild"
            },

            "engines": {
                "node": ">=12"
            },

            "optionalDependencies": {
                "@esbuild/linux-loong64": "0.14.54",
                "esbuild-android-64": "0.14.54",
                "esbuild-android-arm64": "0.14.54",
                "esbuild-darwin-64": "0.14.54",
                "esbuild-darwin-arm64": "0.14.54",
                "esbuild-freebsd-64": "0.14.54",
                "esbuild-freebsd-arm64": "0.14.54",
                "esbuild-linux-32": "0.14.54",
                "esbuild-linux-64": "0.14.54",
                "esbuild-linux-arm": "0.14.54",
                "esbuild-linux-arm64": "0.14.54",
                "esbuild-linux-mips64le": "0.14.54",
                "esbuild-linux-ppc64le": "0.14.54",
                "esbuild-linux-riscv64": "0.14.54",
                "esbuild-linux-s390x": "0.14.54",
                "esbuild-netbsd-64": "0.14.54",
                "esbuild-openbsd-64": "0.14.54",
                "esbuild-sunos-64": "0.14.54",
                "esbuild-windows-32": "0.14.54",
                "esbuild-windows-64": "0.14.54",
                "esbuild-windows-arm64": "0.14.54"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-android-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
            "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
            "cpu": [
                "x64"
            ],

            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-android-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
            "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
            "cpu": [
                "arm64"
            ],

            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-darwin-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
            "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
            "cpu": [
                "x64"
            ],

            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-darwin-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
            "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
            "cpu": [
                "arm64"
            ],

            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-freebsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
            "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
            "cpu": [
                "x64"
            ],

            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-freebsd-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
            "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
            "cpu": [
                "arm64"
            ],

            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-linux-32": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
            "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
            "cpu": [
                "ia32"
            ],

            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-linux-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
            "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
            "cpu": [
                "x64"
            ],

            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-linux-arm": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
            "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
            "cpu": [
                "arm"
            ],

            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-linux-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
            "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
            "cpu": [
                "arm64"
            ],

            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-linux-mips64le": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
            "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
            "cpu": [
                "mips64el"
            ],

            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-linux-ppc64le": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
            "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
            "cpu": [
                "ppc64"
            ],

            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-linux-riscv64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
            "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
            "cpu": [
                "riscv64"
            ],

            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-linux-s390x": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
            "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
            "cpu": [
                "s390x"
            ],

            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-netbsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
            "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
            "cpu": [
                "x64"
            ],

            "optional": true,
            "os": [
                "netbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-openbsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
            "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
            "cpu": [
                "x64"
            ],

            "optional": true,
            "os": [
                "openbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-sunos-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
            "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
            "cpu": [
                "x64"
            ],

            "optional": true,
            "os": [
                "sunos"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-windows-32": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
            "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
            "cpu": [
                "ia32"
            ],

            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-windows-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
            "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
            "cpu": [
                "x64"
            ],

            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-node/node_modules/esbuild-windows-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
            "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
            "cpu": [
                "arm64"
            ],

            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel": {
            "version": "1.0.0-next.72",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-vercel/-/adapter-vercel-1.0.0-next.72.tgz",
            "integrity": "sha512-oNs8FQaYC2NnwDcvX/jc9MDNqXc9HxwGPQNkd+1vBpFVWZl9mShQgCcOMzfTOIH0ka984jYNa0ZawYYHex79xg==",
            "dev": true,
            "dependencies": {
                "@vercel/nft": "^0.22.0",
                "esbuild": "^0.14.48"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/@esbuild/linux-loong64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
            "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
            "cpu": [
                "loong64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
            "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
            "dev": true,
            "hasInstallScript": true,
            "bin": {
                "esbuild": "bin/esbuild"
            },

            "engines": {
                "node": ">=12"
            },

            "optionalDependencies": {
                "@esbuild/linux-loong64": "0.14.54",
                "esbuild-android-64": "0.14.54",
                "esbuild-android-arm64": "0.14.54",
                "esbuild-darwin-64": "0.14.54",
                "esbuild-darwin-arm64": "0.14.54",
                "esbuild-freebsd-64": "0.14.54",
                "esbuild-freebsd-arm64": "0.14.54",
                "esbuild-linux-32": "0.14.54",
                "esbuild-linux-64": "0.14.54",
                "esbuild-linux-arm": "0.14.54",
                "esbuild-linux-arm64": "0.14.54",
                "esbuild-linux-mips64le": "0.14.54",
                "esbuild-linux-ppc64le": "0.14.54",
                "esbuild-linux-riscv64": "0.14.54",
                "esbuild-linux-s390x": "0.14.54",
                "esbuild-netbsd-64": "0.14.54",
                "esbuild-openbsd-64": "0.14.54",
                "esbuild-sunos-64": "0.14.54",
                "esbuild-windows-32": "0.14.54",
                "esbuild-windows-64": "0.14.54",
                "esbuild-windows-arm64": "0.14.54"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-android-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
            "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-android-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
            "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-darwin-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
            "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-darwin-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
            "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-freebsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
            "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-freebsd-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
            "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-linux-32": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
            "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
            "cpu": [
                "ia32"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-linux-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
            "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-linux-arm": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
            "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
            "cpu": [
                "arm"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-linux-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
            "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-linux-mips64le": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
            "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
            "cpu": [
                "mips64el"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-linux-ppc64le": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
            "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
            "cpu": [
                "ppc64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-linux-riscv64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
            "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
            "cpu": [
                "riscv64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-linux-s390x": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
            "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
            "cpu": [
                "s390x"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-netbsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
            "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "netbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-openbsd-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
            "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "openbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-sunos-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
            "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "sunos"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-windows-32": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
            "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
            "cpu": [
                "ia32"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-windows-64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
            "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/adapter-vercel/node_modules/esbuild-windows-arm64": {
            "version": "0.14.54",
            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
            "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/@sveltejs/kit": {
            "version": "1.0.0-next.460",
            "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.460.tgz",
            "integrity": "sha512-bwDkwzEN72+1K5FXqBQGrYOwyA6V5sSSec/A6qXMTfh4uycFTiIQh/e2ki3pxfG0SwijrUo43FEbdKLyBiuDgQ==",
            "dev": true,
            "hasInstallScript": true,
            "dependencies": {
                "@sveltejs/vite-plugin-svelte": "^1.0.3",
                "cookie": "^0.5.0",
                "devalue": "^3.1.2",
                "kleur": "^4.1.4",
                "magic-string": "^0.26.2",
                "mime": "^3.0.0",
                "node-fetch": "^3.2.4",
                "sade": "^1.8.1",
                "set-cookie-parser": "^2.4.8",
                "sirv": "^2.0.2",
                "tiny-glob": "^0.2.9",
                "undici": "^5.8.1"
            },

            "bin": {
                "svelte-kit": "svelte-kit.js"
            },

            "engines": {
                "node": ">=16.14"
            },

            "peerDependencies": {
                "svelte": "^3.44.0",
                "vite": "^3.1.0-beta.1"
            }

        },

        "node_modules/@sveltejs/vite-plugin-svelte": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.3.tgz",
            "integrity": "sha512-0Qu51m2W9RBlxWPp8i31KJpnqmjWMOne8vAzgmOX6ZM9uX+/RAv6BNhEMcNoP5MsyLjyW1ZTCiJoaZZ5EeqpFg==",
            "dev": true,
            "dependencies": {
                "@rollup/pluginutils": "^4.2.1",
                "debug": "^4.3.4",
                "deepmerge": "^4.2.2",
                "kleur": "^4.1.5",
                "magic-string": "^0.26.2",
                "svelte-hmr": "^0.14.12"
            },

            "engines": {
                "node": "^14.18.0 || >= 16"
            },

            "peerDependencies": {
                "diff-match-patch": "^1.0.5",
                "svelte": "^3.44.0",
                "vite": "^3.0.0"
            },

            "peerDependenciesMeta": {
                "diff-match-patch": {
                    "optional": true
                }

            }

        },

        "node_modules/@tailwindcss/forms": {
            "version": "0.5.3",
            "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz",
            "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==",
            "dev": true,
            "dependencies": {
                "mini-svg-data-uri": "^1.2.3"
            },

            "peerDependencies": {
                "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1"
            }

        },

        "node_modules/@tailwindcss/typography": {
            "version": "0.5.7",
            "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.7.tgz",
            "integrity": "sha512-JTTSTrgZfp6Ki4svhPA4mkd9nmQ/j9EfE7SbHJ1cLtthKkpW2OxsFXzSmxbhYbEkfNIyAyhle5p4SYyKRbz/jg==",
            "dev": true,
            "dependencies": {
                "lodash.castarray": "^4.4.0",
                "lodash.isplainobject": "^4.0.6",
                "lodash.merge": "^4.6.2",
                "postcss-selector-parser": "6.0.10"
            },

            "peerDependencies": {
                "tailwindcss": ">=3.0.0 || insiders"
            }

        },

        "node_modules/@types/feather-icons": {
            "version": "4.7.0",
            "resolved": "https://registry.npmjs.org/@types/feather-icons/-/feather-icons-4.7.0.tgz",
            "integrity": "sha512-vflOrmlHMGIGVN4AEl6ErPCNKBLcP1ehEpLqnJkTgf69r5QmJzy7BF1WzbBc8Hqs9KffROPT/JqlSKH4o5vB/w==",
            "dev": true
        },

        "node_modules/@types/json-schema": {
            "version": "7.0.11",
            "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
            "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
            "dev": true
        },

        "node_modules/@types/lodash": {
            "version": "4.14.184",
            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz",
            "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==",
            "dev": true
        },

        "node_modules/@types/luxon": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.1.tgz",
            "integrity": "sha512-/LAvk1cMOJt0ghzMFrZEvByUhsiEfeeT2IF53Le+Ki3A538yEL9pRZ7a6MuCxdrYK+YNqNIDmrKU/r2nnw04zQ==",
            "dev": true
        },

        "node_modules/@types/marked": {
            "version": "4.0.6",
            "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.6.tgz",
            "integrity": "sha512-ITAVUzsnVbhy5afxhs4PPPbrv2hKVEDH5BhhaQNQlVG0UNu+9A18XSdYr53nBdHZ0ADEQLl+ciOjXbs7eHdiQQ=="
        },

        "node_modules/@types/node": {
            "version": "18.7.14",
            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz",
            "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==",
            "dev": true
        },

        "node_modules/@types/pug": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz",
            "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==",
            "dev": true
        },

        "node_modules/@types/sass": {
            "version": "1.43.1",
            "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz",
            "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==",
            "dev": true,
            "dependencies": {
                "@types/node": "*"
            }

        },

        "node_modules/@typescript-eslint/eslint-plugin": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz",
            "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==",
            "dev": true,
            "dependencies": {
                "@typescript-eslint/scope-manager": "5.36.1",
                "@typescript-eslint/type-utils": "5.36.1",
                "@typescript-eslint/utils": "5.36.1",
                "debug": "^4.3.4",
                "functional-red-black-tree": "^1.0.1",
                "ignore": "^5.2.0",
                "regexpp": "^3.2.0",
                "semver": "^7.3.7",
                "tsutils": "^3.21.0"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            },

            "peerDependencies": {
                "@typescript-eslint/parser": "^5.0.0",
                "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
            },

            "peerDependenciesMeta": {
                "typescript": {
                    "optional": true
                }

            }

        },

        "node_modules/@typescript-eslint/parser": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz",
            "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==",
            "dev": true,
            "dependencies": {
                "@typescript-eslint/scope-manager": "5.36.1",
                "@typescript-eslint/types": "5.36.1",
                "@typescript-eslint/typescript-estree": "5.36.1",
                "debug": "^4.3.4"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            },

            "peerDependencies": {
                "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
            },

            "peerDependenciesMeta": {
                "typescript": {
                    "optional": true
                }

            }

        },

        "node_modules/@typescript-eslint/scope-manager": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz",
            "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==",
            "dev": true,
            "dependencies": {
                "@typescript-eslint/types": "5.36.1",
                "@typescript-eslint/visitor-keys": "5.36.1"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            }

        },

        "node_modules/@typescript-eslint/type-utils": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz",
            "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==",
            "dev": true,
            "dependencies": {
                "@typescript-eslint/typescript-estree": "5.36.1",
                "@typescript-eslint/utils": "5.36.1",
                "debug": "^4.3.4",
                "tsutils": "^3.21.0"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            },

            "peerDependencies": {
                "eslint": "*"
            },

            "peerDependenciesMeta": {
                "typescript": {
                    "optional": true
                }

            }

        },

        "node_modules/@typescript-eslint/types": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz",
            "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==",
            "dev": true,
            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            }

        },

        "node_modules/@typescript-eslint/typescript-estree": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz",
            "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==",
            "dev": true,
            "dependencies": {
                "@typescript-eslint/types": "5.36.1",
                "@typescript-eslint/visitor-keys": "5.36.1",
                "debug": "^4.3.4",
                "globby": "^11.1.0",
                "is-glob": "^4.0.3",
                "semver": "^7.3.7",
                "tsutils": "^3.21.0"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            },

            "peerDependenciesMeta": {
                "typescript": {
                    "optional": true
                }

            }

        },

        "node_modules/@typescript-eslint/utils": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz",
            "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==",
            "dev": true,
            "dependencies": {
                "@types/json-schema": "^7.0.9",
                "@typescript-eslint/scope-manager": "5.36.1",
                "@typescript-eslint/types": "5.36.1",
                "@typescript-eslint/typescript-estree": "5.36.1",
                "eslint-scope": "^5.1.1",
                "eslint-utils": "^3.0.0"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            },

            "peerDependencies": {
                "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
            }

        },

        "node_modules/@typescript-eslint/visitor-keys": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz",
            "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==",
            "dev": true,
            "dependencies": {
                "@typescript-eslint/types": "5.36.1",
                "eslint-visitor-keys": "^3.3.0"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/typescript-eslint"
            }

        },

        "node_modules/@vercel/nft": {
            "version": "0.22.1",
            "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.1.tgz",
            "integrity": "sha512-lYYZIoxRurqDOSoVIdBicGnpUIpfyaS5qVjdPq+EfI285WqtZK3NK/dyCkiyBul+X2U2OEhRyeMdXPCHGJbohw==",
            "dev": true,
            "dependencies": {
                "@mapbox/node-pre-gyp": "^1.0.5",
                "acorn": "^8.6.0",
                "async-sema": "^3.1.1",
                "bindings": "^1.4.0",
                "estree-walker": "2.0.2",
                "glob": "^7.1.3",
                "graceful-fs": "^4.2.9",
                "micromatch": "^4.0.2",
                "node-gyp-build": "^4.2.2",
                "resolve-from": "^5.0.0",
                "rollup-pluginutils": "^2.8.2"
            },

            "bin": {
                "nft": "out/cli.js"
            }

        },

        "node_modules/abbrev": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
            "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
            "dev": true
        },

        "node_modules/acorn": {
            "version": "8.8.0",
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
            "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
            "dev": true,
            "bin": {
                "acorn": "bin/acorn"
            },

            "engines": {
                "node": ">=0.4.0"
            }

        },

        "node_modules/acorn-jsx": {
            "version": "5.3.2",
            "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
            "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
            "dev": true,
            "peerDependencies": {
                "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
            }

        },

        "node_modules/acorn-node": {
            "version": "1.8.2",
            "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
            "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
            "dev": true,
            "dependencies": {
                "acorn": "^7.0.0",
                "acorn-walk": "^7.0.0",
                "xtend": "^4.0.2"
            }

        },

        "node_modules/acorn-node/node_modules/acorn": {
            "version": "7.4.1",
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
            "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
            "dev": true,
            "bin": {
                "acorn": "bin/acorn"
            },

            "engines": {
                "node": ">=0.4.0"
            }

        },

        "node_modules/acorn-walk": {
            "version": "7.2.0",
            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
            "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
            "dev": true,
            "engines": {
                "node": ">=0.4.0"
            }

        },

        "node_modules/agent-base": {
            "version": "6.0.2",
            "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
            "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
            "dev": true,
            "dependencies": {
                "debug": "4"
            },

            "engines": {
                "node": ">= 6.0.0"
            }

        },

        "node_modules/ajv": {
            "version": "6.12.6",
            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
            "dev": true,
            "dependencies": {
                "fast-deep-equal": "^3.1.1",
                "fast-json-stable-stringify": "^2.0.0",
                "json-schema-traverse": "^0.4.1",
                "uri-js": "^4.2.2"
            },

            "funding": {
                "type": "github",
                "url": "https://github.com/sponsors/epoberezkin"
            }

        },

        "node_modules/ansi-regex": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/ansi-styles": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
            "dev": true,
            "dependencies": {
                "color-convert": "^2.0.1"
            },

            "engines": {
                "node": ">=8"
            },

            "funding": {
                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
            }

        },

        "node_modules/anymatch": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
            "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
            "dev": true,
            "dependencies": {
                "normalize-path": "^3.0.0",
                "picomatch": "^2.0.4"
            },

            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/aproba": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
            "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
            "dev": true
        },

        "node_modules/are-we-there-yet": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
            "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
            "dev": true,
            "dependencies": {
                "delegates": "^1.0.0",
                "readable-stream": "^3.6.0"
            },

            "engines": {
                "node": ">=10"
            }

        },

        "node_modules/arg": {
            "version": "5.0.2",
            "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
            "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
            "dev": true
        },

        "node_modules/argparse": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
            "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
            "dev": true
        },

        "node_modules/array-union": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
            "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/async-sema": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz",
            "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==",
            "dev": true
        },

        "node_modules/autoprefixer": {
            "version": "10.4.8",
            "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz",
            "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==",
            "dev": true,
            "funding": [
                {
                    "type": "opencollective",
                    "url": "https://opencollective.com/postcss/"
                },

                {
                    "type": "tidelift",
                    "url": "https://tidelift.com/funding/github/npm/autoprefixer"
                }

            ],

            "dependencies": {
                "browserslist": "^4.21.3",
                "caniuse-lite": "^1.0.30001373",
                "fraction.js": "^4.2.0",
                "normalize-range": "^0.1.2",
                "picocolors": "^1.0.0",
                "postcss-value-parser": "^4.2.0"
            },

            "bin": {
                "autoprefixer": "bin/autoprefixer"
            },

            "engines": {
                "node": "^10 || ^12 || >=14"
            },

            "peerDependencies": {
                "postcss": "^8.1.0"
            }

        },

        "node_modules/balanced-match": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
            "dev": true
        },

        "node_modules/binary-extensions": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/bindings": {
            "version": "1.5.0",
            "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
            "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
            "dev": true,
            "dependencies": {
                "file-uri-to-path": "1.0.0"
            }

        },

        "node_modules/brace-expansion": {
            "version": "1.1.11",
            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
            "dev": true,
            "dependencies": {
                "balanced-match": "^1.0.0",
                "concat-map": "0.0.1"
            }

        },

        "node_modules/braces": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
            "dev": true,
            "dependencies": {
                "fill-range": "^7.0.1"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/browserslist": {
            "version": "4.21.3",
            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
            "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
            "dev": true,
            "funding": [
                {
                    "type": "opencollective",
                    "url": "https://opencollective.com/browserslist"
                },

                {
                    "type": "tidelift",
                    "url": "https://tidelift.com/funding/github/npm/browserslist"
                }

            ],

            "dependencies": {
                "caniuse-lite": "^1.0.30001370",
                "electron-to-chromium": "^1.4.202",
                "node-releases": "^2.0.6",
                "update-browserslist-db": "^1.0.5"
            },

            "bin": {
                "browserslist": "cli.js"
            },

            "engines": {
                "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
            }

        },

        "node_modules/buffer-crc32": {
            "version": "0.2.13",
            "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
            "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
            "dev": true,
            "engines": {
                "node": "*"
            }

        },

        "node_modules/callsites": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
            "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
            "dev": true,
            "engines": {
                "node": ">=6"
            }

        },

        "node_modules/camelcase-css": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
            "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
            "dev": true,
            "engines": {
                "node": ">= 6"
            }

        },

        "node_modules/caniuse-lite": {
            "version": "1.0.30001387",
            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001387.tgz",
            "integrity": "sha512-fKDH0F1KOJvR+mWSOvhj8lVRr/Q/mc5u5nabU2vi1/sgvlSqEsE8dOq0Hy/BqVbDkCYQPRRHB1WRjW6PGB/7PA==",
            "dev": true,
            "funding": [
                {
                    "type": "opencollective",
                    "url": "https://opencollective.com/browserslist"
                },

                {
                    "type": "tidelift",
                    "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
                }

            ]

        },

        "node_modules/chalk": {
            "version": "4.1.2",
            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
            "dev": true,
            "dependencies": {
                "ansi-styles": "^4.1.0",
                "supports-color": "^7.1.0"
            },

            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/chalk/chalk?sponsor=1"
            }

        },

        "node_modules/chokidar": {
            "version": "3.5.3",
            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
            "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
            "dev": true,
            "funding": [
                {
                    "type": "individual",
                    "url": "https://paulmillr.com/funding/"
                }

            ],

            "dependencies": {
                "anymatch": "~3.1.2",
                "braces": "~3.0.2",
                "glob-parent": "~5.1.2",
                "is-binary-path": "~2.1.0",
                "is-glob": "~4.0.1",
                "normalize-path": "~3.0.0",
                "readdirp": "~3.6.0"
            },

            "engines": {
                "node": ">= 8.10.0"
            },

            "optionalDependencies": {
                "fsevents": "~2.3.2"
            }

        },

        "node_modules/chokidar/node_modules/glob-parent": {
            "version": "5.1.2",
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
            "dev": true,
            "dependencies": {
                "is-glob": "^4.0.1"
            },

            "engines": {
                "node": ">= 6"
            }

        },

        "node_modules/chownr": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
            "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
            "dev": true,
            "engines": {
                "node": ">=10"
            }

        },

        "node_modules/classnames": {
            "version": "2.3.1",
            "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
            "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==",
            "dev": true
        },

        "node_modules/color-convert": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
            "dev": true,
            "dependencies": {
                "color-name": "~1.1.4"
            },

            "engines": {
                "node": ">=7.0.0"
            }

        },

        "node_modules/color-name": {
            "version": "1.1.4",
            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
            "dev": true
        },

        "node_modules/color-support": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
            "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
            "dev": true,
            "bin": {
                "color-support": "bin.js"
            }

        },

        "node_modules/concat-map": {
            "version": "0.0.1",
            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
            "dev": true
        },

        "node_modules/console-control-strings": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
            "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
            "dev": true
        },

        "node_modules/cookie": {
            "version": "0.5.0",
            "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
            "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
            "dev": true,
            "engines": {
                "node": ">= 0.6"
            }

        },

        "node_modules/core-js": {
            "version": "3.25.0",
            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz",
            "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==",
            "dev": true,
            "hasInstallScript": true,
            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/core-js"
            }

        },

        "node_modules/cross-spawn": {
            "version": "7.0.3",
            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
            "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
            "dev": true,
            "dependencies": {
                "path-key": "^3.1.0",
                "shebang-command": "^2.0.0",
                "which": "^2.0.1"
            },

            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/cssesc": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
            "dev": true,
            "bin": {
                "cssesc": "bin/cssesc"
            },

            "engines": {
                "node": ">=4"
            }

        },

        "node_modules/data-uri-to-buffer": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
            "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
            "dev": true,
            "engines": {
                "node": ">= 12"
            }

        },

        "node_modules/debug": {
            "version": "4.3.4",
            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
            "dev": true,
            "dependencies": {
                "ms": "2.1.2"
            },

            "engines": {
                "node": ">=6.0"
            },

            "peerDependenciesMeta": {
                "supports-color": {
                    "optional": true
                }

            }

        },

        "node_modules/deep-is": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
            "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
            "dev": true
        },

        "node_modules/deepmerge": {
            "version": "4.2.2",
            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
            "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/defined": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
            "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
            "dev": true
        },

        "node_modules/delegates": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
            "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
            "dev": true
        },

        "node_modules/detect-indent": {
            "version": "6.1.0",
            "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
            "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/detect-libc": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
            "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/detective": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
            "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
            "dev": true,
            "dependencies": {
                "acorn-node": "^1.8.2",
                "defined": "^1.0.0",
                "minimist": "^1.2.6"
            },

            "bin": {
                "detective": "bin/detective.js"
            },

            "engines": {
                "node": ">=0.8.0"
            }

        },

        "node_modules/devalue": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/devalue/-/devalue-3.1.2.tgz",
            "integrity": "sha512-wUXbMGPAsBx79UF14nsWSsJlC7RcwPlf2w3bGheODWxKx57e9n68ceoijbqCJCEbjyo0S79nqfPwQgyijwLaqw==",
            "dev": true
        },

        "node_modules/didyoumean": {
            "version": "1.2.2",
            "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
            "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
            "dev": true
        },

        "node_modules/dir-glob": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
            "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
            "dev": true,
            "dependencies": {
                "path-type": "^4.0.0"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/dlv": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
            "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
            "dev": true
        },

        "node_modules/doctrine": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
            "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
            "dev": true,
            "dependencies": {
                "esutils": "^2.0.2"
            },

            "engines": {
                "node": ">=6.0.0"
            }

        },

        "node_modules/electron-to-chromium": {
            "version": "1.4.239",
            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.239.tgz",
            "integrity": "sha512-XbhfzxPIFzMjJm17T7yUGZEyYh5XuUjrA/FQ7JUy2bEd4qQ7MvFTaKpZ6zXZog1cfVttESo2Lx0ctnf7eQOaAQ==",
            "dev": true
        },

        "node_modules/emoji-regex": {
            "version": "8.0.0",
            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
            "dev": true
        },

        "node_modules/es6-promise": {
            "version": "3.3.1",
            "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
            "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==",
            "dev": true
        },

        "node_modules/esbuild": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.7.tgz",
            "integrity": "sha512-7V8tzllIbAQV1M4QoE52ImKu8hT/NLGlGXkiDsbEU5PS6K8Mn09ZnYoS+dcmHxOS9CRsV4IRAMdT3I67IyUNXw==",
            "dev": true,
            "hasInstallScript": true,
            "bin": {
                "esbuild": "bin/esbuild"
            },

            "engines": {
                "node": ">=12"
            },

            "optionalDependencies": {
                "@esbuild/linux-loong64": "0.15.7",
                "esbuild-android-64": "0.15.7",
                "esbuild-android-arm64": "0.15.7",
                "esbuild-darwin-64": "0.15.7",
                "esbuild-darwin-arm64": "0.15.7",
                "esbuild-freebsd-64": "0.15.7",
                "esbuild-freebsd-arm64": "0.15.7",
                "esbuild-linux-32": "0.15.7",
                "esbuild-linux-64": "0.15.7",
                "esbuild-linux-arm": "0.15.7",
                "esbuild-linux-arm64": "0.15.7",
                "esbuild-linux-mips64le": "0.15.7",
                "esbuild-linux-ppc64le": "0.15.7",
                "esbuild-linux-riscv64": "0.15.7",
                "esbuild-linux-s390x": "0.15.7",
                "esbuild-netbsd-64": "0.15.7",
                "esbuild-openbsd-64": "0.15.7",
                "esbuild-sunos-64": "0.15.7",
                "esbuild-windows-32": "0.15.7",
                "esbuild-windows-64": "0.15.7",
                "esbuild-windows-arm64": "0.15.7"
            }

        },

        "node_modules/esbuild-android-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.7.tgz",
            "integrity": "sha512-p7rCvdsldhxQr3YHxptf1Jcd86dlhvc3EQmQJaZzzuAxefO9PvcI0GLOa5nCWem1AJ8iMRu9w0r5TG8pHmbi9w==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-android-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.7.tgz",
            "integrity": "sha512-L775l9ynJT7rVqRM5vo+9w5g2ysbOCfsdLV4CWanTZ1k/9Jb3IYlQ06VCI1edhcosTYJRECQFJa3eAvkx72eyQ==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "android"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-darwin-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.7.tgz",
            "integrity": "sha512-KGPt3r1c9ww009t2xLB6Vk0YyNOXh7hbjZ3EecHoVDxgtbUlYstMPDaReimKe6eOEfyY4hBEEeTvKwPsiH5WZg==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-darwin-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.7.tgz",
            "integrity": "sha512-kBIHvtVqbSGajN88lYMnR3aIleH3ABZLLFLxwL2stiuIGAjGlQW741NxVTpUHQXUmPzxi6POqc9npkXa8AcSZQ==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-freebsd-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.7.tgz",
            "integrity": "sha512-hESZB91qDLV5MEwNxzMxPfbjAhOmtfsr9Wnuci7pY6TtEh4UDuevmGmkUIjX/b+e/k4tcNBMf7SRQ2mdNuK/HQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-freebsd-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.7.tgz",
            "integrity": "sha512-dLFR0ChH5t+b3J8w0fVKGvtwSLWCv7GYT2Y2jFGulF1L5HftQLzVGN+6pi1SivuiVSmTh28FwUhi9PwQicXI6Q==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "freebsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-linux-32": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.7.tgz",
            "integrity": "sha512-v3gT/LsONGUZcjbt2swrMjwxo32NJzk+7sAgtxhGx1+ZmOFaTRXBAi1PPfgpeo/J//Un2jIKm/I+qqeo4caJvg==",
            "cpu": [
                "ia32"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-linux-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.7.tgz",
            "integrity": "sha512-LxXEfLAKwOVmm1yecpMmWERBshl+Kv5YJ/1KnyAr6HRHFW8cxOEsEfisD3sVl/RvHyW//lhYUVSuy9jGEfIRAQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-linux-arm": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.7.tgz",
            "integrity": "sha512-JKgAHtMR5f75wJTeuNQbyznZZa+pjiUHV7sRZp42UNdyXC6TiUYMW/8z8yIBAr2Fpad8hM1royZKQisqPABPvQ==",
            "cpu": [
                "arm"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-linux-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.7.tgz",
            "integrity": "sha512-P3cfhudpzWDkglutWgXcT2S7Ft7o2e3YDMrP1n0z2dlbUZghUkKCyaWw0zhp4KxEEzt/E7lmrtRu/pGWnwb9vw==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-linux-mips64le": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.7.tgz",
            "integrity": "sha512-T7XKuxl0VpeFLCJXub6U+iybiqh0kM/bWOTb4qcPyDDwNVhLUiPcGdG2/0S7F93czUZOKP57YiLV8YQewgLHKw==",
            "cpu": [
                "mips64el"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-linux-ppc64le": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.7.tgz",
            "integrity": "sha512-6mGuC19WpFN7NYbecMIJjeQgvDb5aMuvyk0PDYBJrqAEMkTwg3Z98kEKuCm6THHRnrgsdr7bp4SruSAxEM4eJw==",
            "cpu": [
                "ppc64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-linux-riscv64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.7.tgz",
            "integrity": "sha512-uUJsezbswAYo/X7OU/P+PuL/EI9WzxsEQXDekfwpQ23uGiooxqoLFAPmXPcRAt941vjlY9jtITEEikWMBr+F/g==",
            "cpu": [
                "riscv64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-linux-s390x": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.7.tgz",
            "integrity": "sha512-+tO+xOyTNMc34rXlSxK7aCwJgvQyffqEM5MMdNDEeMU3ss0S6wKvbBOQfgd5jRPblfwJ6b+bKiz0g5nABpY0QQ==",
            "cpu": [
                "s390x"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "linux"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-netbsd-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.7.tgz",
            "integrity": "sha512-yVc4Wz+Pu3cP5hzm5kIygNPrjar/v5WCSoRmIjCPWfBVJkZNb5brEGKUlf+0Y759D48BCWa0WHrWXaNy0DULTQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "netbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-openbsd-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.7.tgz",
            "integrity": "sha512-GsimbwC4FSR4lN3wf8XmTQ+r8/0YSQo21rWDL0XFFhLHKlzEA4SsT1Tl8bPYu00IU6UWSJ+b3fG/8SB69rcuEQ==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "openbsd"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-sunos-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.7.tgz",
            "integrity": "sha512-8CDI1aL/ts0mDGbWzjEOGKXnU7p3rDzggHSBtVryQzkSOsjCHRVe0iFYUuhczlxU1R3LN/E7HgUO4NXzGGP/Ag==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "sunos"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-windows-32": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.7.tgz",
            "integrity": "sha512-cOnKXUEPS8EGCzRSFa1x6NQjGhGsFlVgjhqGEbLTPsA7x4RRYiy2RKoArNUU4iR2vHmzqS5Gr84MEumO/wxYKA==",
            "cpu": [
                "ia32"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-windows-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.7.tgz",
            "integrity": "sha512-7MI08Ec2sTIDv+zH6StNBKO+2hGUYIT42GmFyW6MBBWWtJhTcQLinKS6ldIN1d52MXIbiJ6nXyCJ+LpL4jBm3Q==",
            "cpu": [
                "x64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/esbuild-windows-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.7.tgz",
            "integrity": "sha512-R06nmqBlWjKHddhRJYlqDd3Fabx9LFdKcjoOy08YLimwmsswlFBJV4rXzZCxz/b7ZJXvrZgj8DDv1ewE9+StMw==",
            "cpu": [
                "arm64"
            ],

            "dev": true,
            "optional": true,
            "os": [
                "win32"
            ],

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/escalade": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
            "dev": true,
            "engines": {
                "node": ">=6"
            }

        },

        "node_modules/escape-string-regexp": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
            "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
            "dev": true,
            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/eslint": {
            "version": "8.23.0",
            "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz",
            "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==",
            "dev": true,
            "dependencies": {
                "@eslint/eslintrc": "^1.3.1",
                "@humanwhocodes/config-array": "^0.10.4",
                "@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
                "@humanwhocodes/module-importer": "^1.0.1",
                "ajv": "^6.10.0",
                "chalk": "^4.0.0",
                "cross-spawn": "^7.0.2",
                "debug": "^4.3.2",
                "doctrine": "^3.0.0",
                "escape-string-regexp": "^4.0.0",
                "eslint-scope": "^7.1.1",
                "eslint-utils": "^3.0.0",
                "eslint-visitor-keys": "^3.3.0",
                "espree": "^9.4.0",
                "esquery": "^1.4.0",
                "esutils": "^2.0.2",
                "fast-deep-equal": "^3.1.3",
                "file-entry-cache": "^6.0.1",
                "find-up": "^5.0.0",
                "functional-red-black-tree": "^1.0.1",
                "glob-parent": "^6.0.1",
                "globals": "^13.15.0",
                "globby": "^11.1.0",
                "grapheme-splitter": "^1.0.4",
                "ignore": "^5.2.0",
                "import-fresh": "^3.0.0",
                "imurmurhash": "^0.1.4",
                "is-glob": "^4.0.0",
                "js-yaml": "^4.1.0",
                "json-stable-stringify-without-jsonify": "^1.0.1",
                "levn": "^0.4.1",
                "lodash.merge": "^4.6.2",
                "minimatch": "^3.1.2",
                "natural-compare": "^1.4.0",
                "optionator": "^0.9.1",
                "regexpp": "^3.2.0",
                "strip-ansi": "^6.0.1",
                "strip-json-comments": "^3.1.0",
                "text-table": "^0.2.0"
            },

            "bin": {
                "eslint": "bin/eslint.js"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "url": "https://opencollective.com/eslint"
            }

        },

        "node_modules/eslint-config-prettier": {
            "version": "8.5.0",
            "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
            "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
            "dev": true,
            "bin": {
                "eslint-config-prettier": "bin/cli.js"
            },

            "peerDependencies": {
                "eslint": ">=7.0.0"
            }

        },

        "node_modules/eslint-plugin-svelte3": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/eslint-plugin-svelte3/-/eslint-plugin-svelte3-4.0.0.tgz",
            "integrity": "sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==",
            "dev": true,
            "peerDependencies": {
                "eslint": ">=8.0.0",
                "svelte": "^3.2.0"
            }

        },

        "node_modules/eslint-scope": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
            "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
            "dev": true,
            "dependencies": {
                "esrecurse": "^4.3.0",
                "estraverse": "^4.1.1"
            },

            "engines": {
                "node": ">=8.0.0"
            }

        },

        "node_modules/eslint-utils": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
            "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
            "dev": true,
            "dependencies": {
                "eslint-visitor-keys": "^2.0.0"
            },

            "engines": {
                "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
            },

            "funding": {
                "url": "https://github.com/sponsors/mysticatea"
            },

            "peerDependencies": {
                "eslint": ">=5"
            }

        },

        "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
            "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
            "dev": true,
            "engines": {
                "node": ">=10"
            }

        },

        "node_modules/eslint-visitor-keys": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
            "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
            "dev": true,
            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            }

        },

        "node_modules/eslint/node_modules/eslint-scope": {
            "version": "7.1.1",
            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
            "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
            "dev": true,
            "dependencies": {
                "esrecurse": "^4.3.0",
                "estraverse": "^5.2.0"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            }

        },

        "node_modules/eslint/node_modules/estraverse": {
            "version": "5.3.0",
            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
            "dev": true,
            "engines": {
                "node": ">=4.0"
            }

        },

        "node_modules/espree": {
            "version": "9.4.0",
            "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
            "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
            "dev": true,
            "dependencies": {
                "acorn": "^8.8.0",
                "acorn-jsx": "^5.3.2",
                "eslint-visitor-keys": "^3.3.0"
            },

            "engines": {
                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
            },

            "funding": {
                "url": "https://opencollective.com/eslint"
            }

        },

        "node_modules/esquery": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
            "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
            "dev": true,
            "dependencies": {
                "estraverse": "^5.1.0"
            },

            "engines": {
                "node": ">=0.10"
            }

        },

        "node_modules/esquery/node_modules/estraverse": {
            "version": "5.3.0",
            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
            "dev": true,
            "engines": {
                "node": ">=4.0"
            }

        },

        "node_modules/esrecurse": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
            "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
            "dev": true,
            "dependencies": {
                "estraverse": "^5.2.0"
            },

            "engines": {
                "node": ">=4.0"
            }

        },

        "node_modules/esrecurse/node_modules/estraverse": {
            "version": "5.3.0",
            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
            "dev": true,
            "engines": {
                "node": ">=4.0"
            }

        },

        "node_modules/estraverse": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
            "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
            "dev": true,
            "engines": {
                "node": ">=4.0"
            }

        },

        "node_modules/estree-walker": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
            "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
            "dev": true
        },

        "node_modules/esutils": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/fast-deep-equal": {
            "version": "3.1.3",
            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
            "dev": true
        },

        "node_modules/fast-glob": {
            "version": "3.2.11",
            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
            "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
            "dev": true,
            "dependencies": {
                "@nodelib/fs.stat": "^2.0.2",
                "@nodelib/fs.walk": "^1.2.3",
                "glob-parent": "^5.1.2",
                "merge2": "^1.3.0",
                "micromatch": "^4.0.4"
            },

            "engines": {
                "node": ">=8.6.0"
            }

        },

        "node_modules/fast-glob/node_modules/glob-parent": {
            "version": "5.1.2",
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
            "dev": true,
            "dependencies": {
                "is-glob": "^4.0.1"
            },

            "engines": {
                "node": ">= 6"
            }

        },

        "node_modules/fast-json-stable-stringify": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
            "dev": true
        },

        "node_modules/fast-levenshtein": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
            "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
            "dev": true
        },

        "node_modules/fastq": {
            "version": "1.13.0",
            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
            "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
            "dev": true,
            "dependencies": {
                "reusify": "^1.0.4"
            }

        },

        "node_modules/feather-icons": {
            "version": "4.29.0",
            "resolved": "https://registry.npmjs.org/feather-icons/-/feather-icons-4.29.0.tgz",
            "integrity": "sha512-Y7VqN9FYb8KdaSF0qD1081HCkm0v4Eq/fpfQYQnubpqi0hXx14k+gF9iqtRys1SIcTEi97xDi/fmsPFZ8xo0GQ==",
            "dev": true,
            "dependencies": {
                "classnames": "^2.2.5",
                "core-js": "^3.1.3"
            }

        },

        "node_modules/fetch-blob": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
            "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
            "dev": true,
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/jimmywarting"
                },

                {
                    "type": "paypal",
                    "url": "https://paypal.me/jimmywarting"
                }

            ],

            "dependencies": {
                "node-domexception": "^1.0.0",
                "web-streams-polyfill": "^3.0.3"
            },

            "engines": {
                "node": "^12.20 || >= 14.13"
            }

        },

        "node_modules/file-entry-cache": {
            "version": "6.0.1",
            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
            "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
            "dev": true,
            "dependencies": {
                "flat-cache": "^3.0.4"
            },

            "engines": {
                "node": "^10.12.0 || >=12.0.0"
            }

        },

        "node_modules/file-uri-to-path": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
            "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
            "dev": true
        },

        "node_modules/fill-range": {
            "version": "7.0.1",
            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
            "dev": true,
            "dependencies": {
                "to-regex-range": "^5.0.1"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/find-up": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
            "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
            "dev": true,
            "dependencies": {
                "locate-path": "^6.0.0",
                "path-exists": "^4.0.0"
            },

            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/flat-cache": {
            "version": "3.0.4",
            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
            "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
            "dev": true,
            "dependencies": {
                "flatted": "^3.1.0",
                "rimraf": "^3.0.2"
            },

            "engines": {
                "node": "^10.12.0 || >=12.0.0"
            }

        },

        "node_modules/flatted": {
            "version": "3.2.7",
            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
            "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
            "dev": true
        },

        "node_modules/formdata-polyfill": {
            "version": "4.0.10",
            "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
            "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
            "dev": true,
            "dependencies": {
                "fetch-blob": "^3.1.2"
            },

            "engines": {
                "node": ">=12.20.0"
            }

        },

        "node_modules/fraction.js": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
            "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
            "dev": true,
            "engines": {
                "node": "*"
            },

            "funding": {
                "type": "patreon",
                "url": "https://www.patreon.com/infusion"
            }

        },

        "node_modules/fs-minipass": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
            "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
            "dev": true,
            "dependencies": {
                "minipass": "^3.0.0"
            },

            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/fs.realpath": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
            "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
            "dev": true
        },

        "node_modules/fsevents": {
            "version": "2.3.2",
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
            "dev": true,
            "hasInstallScript": true,
            "optional": true,
            "os": [
                "darwin"
            ],

            "engines": {
                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
            }

        },

        "node_modules/function-bind": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
            "dev": true
        },

        "node_modules/functional-red-black-tree": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
            "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
            "dev": true
        },

        "node_modules/gauge": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
            "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
            "dev": true,
            "dependencies": {
                "aproba": "^1.0.3 || ^2.0.0",
                "color-support": "^1.1.2",
                "console-control-strings": "^1.0.0",
                "has-unicode": "^2.0.1",
                "object-assign": "^4.1.1",
                "signal-exit": "^3.0.0",
                "string-width": "^4.2.3",
                "strip-ansi": "^6.0.1",
                "wide-align": "^1.1.2"
            },

            "engines": {
                "node": ">=10"
            }

        },

        "node_modules/glob": {
            "version": "7.2.3",
            "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
            "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
            "dev": true,
            "dependencies": {
                "fs.realpath": "^1.0.0",
                "inflight": "^1.0.4",
                "inherits": "2",
                "minimatch": "^3.1.1",
                "once": "^1.3.0",
                "path-is-absolute": "^1.0.0"
            },

            "engines": {
                "node": "*"
            },

            "funding": {
                "url": "https://github.com/sponsors/isaacs"
            }

        },

        "node_modules/glob-parent": {
            "version": "6.0.2",
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
            "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
            "dev": true,
            "dependencies": {
                "is-glob": "^4.0.3"
            },

            "engines": {
                "node": ">=10.13.0"
            }

        },

        "node_modules/globals": {
            "version": "13.17.0",
            "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
            "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
            "dev": true,
            "dependencies": {
                "type-fest": "^0.20.2"
            },

            "engines": {
                "node": ">=8"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/globalyzer": {
            "version": "0.1.0",
            "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
            "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
            "dev": true
        },

        "node_modules/globby": {
            "version": "11.1.0",
            "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
            "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
            "dev": true,
            "dependencies": {
                "array-union": "^2.1.0",
                "dir-glob": "^3.0.1",
                "fast-glob": "^3.2.9",
                "ignore": "^5.2.0",
                "merge2": "^1.4.1",
                "slash": "^3.0.0"
            },

            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/globrex": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
            "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
            "dev": true
        },

        "node_modules/graceful-fs": {
            "version": "4.2.10",
            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
            "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
            "dev": true
        },

        "node_modules/grapheme-splitter": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
            "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
            "dev": true
        },

        "node_modules/has": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
            "dev": true,
            "dependencies": {
                "function-bind": "^1.1.1"
            },

            "engines": {
                "node": ">= 0.4.0"
            }

        },

        "node_modules/has-flag": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/has-unicode": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
            "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
            "dev": true
        },

        "node_modules/https-proxy-agent": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
            "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
            "dev": true,
            "dependencies": {
                "agent-base": "6",
                "debug": "4"
            },

            "engines": {
                "node": ">= 6"
            }

        },

        "node_modules/ignore": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
            "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
            "dev": true,
            "engines": {
                "node": ">= 4"
            }

        },

        "node_modules/import-fresh": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
            "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
            "dev": true,
            "dependencies": {
                "parent-module": "^1.0.0",
                "resolve-from": "^4.0.0"
            },

            "engines": {
                "node": ">=6"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/import-fresh/node_modules/resolve-from": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
            "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
            "dev": true,
            "engines": {
                "node": ">=4"
            }

        },

        "node_modules/imurmurhash": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
            "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
            "dev": true,
            "engines": {
                "node": ">=0.8.19"
            }

        },

        "node_modules/inflight": {
            "version": "1.0.6",
            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
            "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
            "dev": true,
            "dependencies": {
                "once": "^1.3.0",
                "wrappy": "1"
            }

        },

        "node_modules/inherits": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
            "dev": true
        },

        "node_modules/is-binary-path": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
            "dev": true,
            "dependencies": {
                "binary-extensions": "^2.0.0"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/is-core-module": {
            "version": "2.10.0",
            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
            "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
            "dev": true,
            "dependencies": {
                "has": "^1.0.3"
            },

            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }

        },

        "node_modules/is-extglob": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/is-fullwidth-code-point": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/is-glob": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
            "dev": true,
            "dependencies": {
                "is-extglob": "^2.1.1"
            },

            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/is-number": {
            "version": "7.0.0",
            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
            "dev": true,
            "engines": {
                "node": ">=0.12.0"
            }

        },

        "node_modules/isexe": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
            "dev": true
        },

        "node_modules/js-yaml": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
            "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
            "dev": true,
            "dependencies": {
                "argparse": "^2.0.1"
            },

            "bin": {
                "js-yaml": "bin/js-yaml.js"
            }

        },

        "node_modules/json-schema-traverse": {
            "version": "0.4.1",
            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
            "dev": true
        },

        "node_modules/json-stable-stringify-without-jsonify": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
            "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
            "dev": true
        },

        "node_modules/kleur": {
            "version": "4.1.5",
            "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
            "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
            "dev": true,
            "engines": {
                "node": ">=6"
            }

        },

        "node_modules/levn": {
            "version": "0.4.1",
            "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
            "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
            "dev": true,
            "dependencies": {
                "prelude-ls": "^1.2.1",
                "type-check": "~0.4.0"
            },

            "engines": {
                "node": ">= 0.8.0"
            }

        },

        "node_modules/lilconfig": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
            "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
            "dev": true,
            "engines": {
                "node": ">=10"
            }

        },

        "node_modules/locate-path": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
            "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
            "dev": true,
            "dependencies": {
                "p-locate": "^5.0.0"
            },

            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/lodash": {
            "version": "4.17.21",
            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
        },

        "node_modules/lodash.castarray": {
            "version": "4.4.0",
            "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
            "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
            "dev": true
        },

        "node_modules/lodash.isplainobject": {
            "version": "4.0.6",
            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
            "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
            "dev": true
        },

        "node_modules/lodash.merge": {
            "version": "4.6.2",
            "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
            "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
            "dev": true
        },

        "node_modules/lru-cache": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
            "dev": true,
            "dependencies": {
                "yallist": "^4.0.0"
            },

            "engines": {
                "node": ">=10"
            }

        },

        "node_modules/luxon": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.0.3.tgz",
            "integrity": "sha512-+EfHWnF+UT7GgTnq5zXg3ldnTKL2zdv7QJgsU5bjjpbH17E3qi/puMhQyJVYuCq+FRkogvB5WB6iVvUr+E4a7w==",
            "dev": true,
            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/magic-string": {
            "version": "0.26.3",
            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz",
            "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
            "dev": true,
            "dependencies": {
                "sourcemap-codec": "^1.4.8"
            },

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/make-dir": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
            "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
            "dev": true,
            "dependencies": {
                "semver": "^6.0.0"
            },

            "engines": {
                "node": ">=8"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/make-dir/node_modules/semver": {
            "version": "6.3.0",
            "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
            "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
            "dev": true,
            "bin": {
                "semver": "bin/semver.js"
            }

        },

        "node_modules/marked": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz",
            "integrity": "sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA==",
            "bin": {
                "marked": "bin/marked.js"
            },

            "engines": {
                "node": ">= 12"
            }

        },

        "node_modules/merge2": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
            "dev": true,
            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/micromatch": {
            "version": "4.0.5",
            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
            "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
            "dev": true,
            "dependencies": {
                "braces": "^3.0.2",
                "picomatch": "^2.3.1"
            },

            "engines": {
                "node": ">=8.6"
            }

        },

        "node_modules/mime": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
            "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
            "dev": true,
            "bin": {
                "mime": "cli.js"
            },

            "engines": {
                "node": ">=10.0.0"
            }

        },

        "node_modules/min-indent": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
            "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
            "dev": true,
            "engines": {
                "node": ">=4"
            }

        },

        "node_modules/mini-svg-data-uri": {
            "version": "1.4.4",
            "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
            "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
            "dev": true,
            "bin": {
                "mini-svg-data-uri": "cli.js"
            }

        },

        "node_modules/minimatch": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
            "dev": true,
            "dependencies": {
                "brace-expansion": "^1.1.7"
            },

            "engines": {
                "node": "*"
            }

        },

        "node_modules/minimist": {
            "version": "1.2.6",
            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
            "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
            "dev": true
        },

        "node_modules/minipass": {
            "version": "3.3.4",
            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
            "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
            "dev": true,
            "dependencies": {
                "yallist": "^4.0.0"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/minizlib": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
            "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
            "dev": true,
            "dependencies": {
                "minipass": "^3.0.0",
                "yallist": "^4.0.0"
            },

            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/mkdirp": {
            "version": "0.5.6",
            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
            "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
            "dev": true,
            "dependencies": {
                "minimist": "^1.2.6"
            },

            "bin": {
                "mkdirp": "bin/cmd.js"
            }

        },

        "node_modules/mri": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
            "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
            "dev": true,
            "engines": {
                "node": ">=4"
            }

        },

        "node_modules/mrmime": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
            "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
            "dev": true,
            "engines": {
                "node": ">=10"
            }

        },

        "node_modules/ms": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
            "dev": true
        },

        "node_modules/nanoid": {
            "version": "3.3.4",
            "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
            "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
            "dev": true,
            "bin": {
                "nanoid": "bin/nanoid.cjs"
            },

            "engines": {
                "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
            }

        },

        "node_modules/natural-compare": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
            "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
            "dev": true
        },

        "node_modules/node-domexception": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
            "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
            "dev": true,
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/jimmywarting"
                },

                {
                    "type": "github",
                    "url": "https://paypal.me/jimmywarting"
                }

            ],

            "engines": {
                "node": ">=10.5.0"
            }

        },

        "node_modules/node-fetch": {
            "version": "3.2.10",
            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
            "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
            "dev": true,
            "dependencies": {
                "data-uri-to-buffer": "^4.0.0",
                "fetch-blob": "^3.1.4",
                "formdata-polyfill": "^4.0.10"
            },

            "engines": {
                "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/node-fetch"
            }

        },

        "node_modules/node-gyp-build": {
            "version": "4.5.0",
            "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
            "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==",
            "dev": true,
            "bin": {
                "node-gyp-build": "bin.js",
                "node-gyp-build-optional": "optional.js",
                "node-gyp-build-test": "build-test.js"
            }

        },

        "node_modules/node-releases": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
            "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
            "dev": true
        },

        "node_modules/nopt": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
            "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
            "dev": true,
            "dependencies": {
                "abbrev": "1"
            },

            "bin": {
                "nopt": "bin/nopt.js"
            },

            "engines": {
                "node": ">=6"
            }

        },

        "node_modules/normalize-path": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/normalize-range": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
            "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/npmlog": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
            "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
            "dev": true,
            "dependencies": {
                "are-we-there-yet": "^2.0.0",
                "console-control-strings": "^1.1.0",
                "gauge": "^3.0.0",
                "set-blocking": "^2.0.0"
            }

        },

        "node_modules/object-assign": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
            "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/object-hash": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
            "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
            "dev": true,
            "engines": {
                "node": ">= 6"
            }

        },

        "node_modules/once": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
            "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
            "dev": true,
            "dependencies": {
                "wrappy": "1"
            }

        },

        "node_modules/optionator": {
            "version": "0.9.1",
            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
            "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
            "dev": true,
            "dependencies": {
                "deep-is": "^0.1.3",
                "fast-levenshtein": "^2.0.6",
                "levn": "^0.4.1",
                "prelude-ls": "^1.2.1",
                "type-check": "^0.4.0",
                "word-wrap": "^1.2.3"
            },

            "engines": {
                "node": ">= 0.8.0"
            }

        },

        "node_modules/p-limit": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
            "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
            "dev": true,
            "dependencies": {
                "yocto-queue": "^0.1.0"
            },

            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/p-locate": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
            "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
            "dev": true,
            "dependencies": {
                "p-limit": "^3.0.2"
            },

            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/parent-module": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
            "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
            "dev": true,
            "dependencies": {
                "callsites": "^3.0.0"
            },

            "engines": {
                "node": ">=6"
            }

        },

        "node_modules/path-exists": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/path-is-absolute": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
            "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/path-key": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
            "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/path-parse": {
            "version": "1.0.7",
            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
            "dev": true
        },

        "node_modules/path-type": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
            "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/picocolors": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
            "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
            "dev": true
        },

        "node_modules/picomatch": {
            "version": "2.3.1",
            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
            "dev": true,
            "engines": {
                "node": ">=8.6"
            },

            "funding": {
                "url": "https://github.com/sponsors/jonschlinkert"
            }

        },

        "node_modules/pify": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
            "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/playwright-core": {
            "version": "1.25.1",
            "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.25.1.tgz",
            "integrity": "sha512-lSvPCmA2n7LawD2Hw7gSCLScZ+vYRkhU8xH0AapMyzwN+ojoDqhkH/KIEUxwNu2PjPoE/fcE0wLAksdOhJ2O5g==",
            "dev": true,
            "bin": {
                "playwright": "cli.js"
            },

            "engines": {
                "node": ">=14"
            }

        },

        "node_modules/postcss": {
            "version": "8.4.16",
            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
            "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
            "dev": true,
            "funding": [
                {
                    "type": "opencollective",
                    "url": "https://opencollective.com/postcss/"
                },

                {
                    "type": "tidelift",
                    "url": "https://tidelift.com/funding/github/npm/postcss"
                }

            ],

            "dependencies": {
                "nanoid": "^3.3.4",
                "picocolors": "^1.0.0",
                "source-map-js": "^1.0.2"
            },

            "engines": {
                "node": "^10 || ^12 || >=14"
            }

        },

        "node_modules/postcss-import": {
            "version": "14.1.0",
            "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
            "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
            "dev": true,
            "dependencies": {
                "postcss-value-parser": "^4.0.0",
                "read-cache": "^1.0.0",
                "resolve": "^1.1.7"
            },

            "engines": {
                "node": ">=10.0.0"
            },

            "peerDependencies": {
                "postcss": "^8.0.0"
            }

        },

        "node_modules/postcss-js": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
            "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
            "dev": true,
            "dependencies": {
                "camelcase-css": "^2.0.1"
            },

            "engines": {
                "node": "^12 || ^14 || >= 16"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/postcss/"
            },

            "peerDependencies": {
                "postcss": "^8.3.3"
            }

        },

        "node_modules/postcss-load-config": {
            "version": "3.1.4",
            "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
            "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
            "dev": true,
            "dependencies": {
                "lilconfig": "^2.0.5",
                "yaml": "^1.10.2"
            },

            "engines": {
                "node": ">= 10"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/postcss/"
            },

            "peerDependencies": {
                "postcss": ">=8.0.9",
                "ts-node": ">=9.0.0"
            },

            "peerDependenciesMeta": {
                "postcss": {
                    "optional": true
                },

                "ts-node": {
                    "optional": true
                }

            }

        },

        "node_modules/postcss-nested": {
            "version": "5.0.6",
            "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
            "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
            "dev": true,
            "dependencies": {
                "postcss-selector-parser": "^6.0.6"
            },

            "engines": {
                "node": ">=12.0"
            },

            "funding": {
                "type": "opencollective",
                "url": "https://opencollective.com/postcss/"
            },

            "peerDependencies": {
                "postcss": "^8.2.14"
            }

        },

        "node_modules/postcss-selector-parser": {
            "version": "6.0.10",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
            "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
            "dev": true,
            "dependencies": {
                "cssesc": "^3.0.0",
                "util-deprecate": "^1.0.2"
            },

            "engines": {
                "node": ">=4"
            }

        },

        "node_modules/postcss-value-parser": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
            "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
            "dev": true
        },

        "node_modules/prelude-ls": {
            "version": "1.2.1",
            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
            "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
            "dev": true,
            "engines": {
                "node": ">= 0.8.0"
            }

        },

        "node_modules/prettier": {
            "version": "2.7.1",
            "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
            "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
            "dev": true,
            "bin": {
                "prettier": "bin-prettier.js"
            },

            "engines": {
                "node": ">=10.13.0"
            },

            "funding": {
                "url": "https://github.com/prettier/prettier?sponsor=1"
            }

        },

        "node_modules/prettier-plugin-svelte": {
            "version": "2.7.0",
            "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.7.0.tgz",
            "integrity": "sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==",
            "dev": true,
            "peerDependencies": {
                "prettier": "^1.16.4 || ^2.0.0",
                "svelte": "^3.2.0"
            }

        },

        "node_modules/punycode": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
            "dev": true,
            "engines": {
                "node": ">=6"
            }

        },

        "node_modules/queue-microtask": {
            "version": "1.2.3",
            "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
            "dev": true,
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/feross"
                },

                {
                    "type": "patreon",
                    "url": "https://www.patreon.com/feross"
                },

                {
                    "type": "consulting",
                    "url": "https://feross.org/support"
                }

            ]

        },

        "node_modules/quick-lru": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
            "dev": true,
            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/read-cache": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
            "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
            "dev": true,
            "dependencies": {
                "pify": "^2.3.0"
            }

        },

        "node_modules/readable-stream": {
            "version": "3.6.0",
            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
            "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
            "dev": true,
            "dependencies": {
                "inherits": "^2.0.3",
                "string_decoder": "^1.1.1",
                "util-deprecate": "^1.0.1"
            },

            "engines": {
                "node": ">= 6"
            }

        },

        "node_modules/readdirp": {
            "version": "3.6.0",
            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
            "dev": true,
            "dependencies": {
                "picomatch": "^2.2.1"
            },

            "engines": {
                "node": ">=8.10.0"
            }

        },

        "node_modules/regexparam": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.1.tgz",
            "integrity": "sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/regexpp": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
            "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
            "dev": true,
            "engines": {
                "node": ">=8"
            },

            "funding": {
                "url": "https://github.com/sponsors/mysticatea"
            }

        },

        "node_modules/resolve": {
            "version": "1.22.1",
            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
            "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
            "dev": true,
            "dependencies": {
                "is-core-module": "^2.9.0",
                "path-parse": "^1.0.7",
                "supports-preserve-symlinks-flag": "^1.0.0"
            },

            "bin": {
                "resolve": "bin/resolve"
            },

            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }

        },

        "node_modules/resolve-from": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/reusify": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
            "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
            "dev": true,
            "engines": {
                "iojs": ">=1.0.0",
                "node": ">=0.10.0"
            }

        },

        "node_modules/rimraf": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
            "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
            "dev": true,
            "dependencies": {
                "glob": "^7.1.3"
            },

            "bin": {
                "rimraf": "bin.js"
            },

            "funding": {
                "url": "https://github.com/sponsors/isaacs"
            }

        },

        "node_modules/rollup": {
            "version": "2.78.1",
            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz",
            "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==",
            "dev": true,
            "bin": {
                "rollup": "dist/bin/rollup"
            },

            "engines": {
                "node": ">=10.0.0"
            },

            "optionalDependencies": {
                "fsevents": "~2.3.2"
            }

        },

        "node_modules/rollup-pluginutils": {
            "version": "2.8.2",
            "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
            "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
            "dev": true,
            "dependencies": {
                "estree-walker": "^0.6.1"
            }

        },

        "node_modules/rollup-pluginutils/node_modules/estree-walker": {
            "version": "0.6.1",
            "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
            "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
            "dev": true
        },

        "node_modules/run-parallel": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
            "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
            "dev": true,
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/feross"
                },

                {
                    "type": "patreon",
                    "url": "https://www.patreon.com/feross"
                },

                {
                    "type": "consulting",
                    "url": "https://feross.org/support"
                }

            ],

            "dependencies": {
                "queue-microtask": "^1.2.2"
            }

        },

        "node_modules/sade": {
            "version": "1.8.1",
            "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
            "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
            "dev": true,
            "dependencies": {
                "mri": "^1.1.0"
            },

            "engines": {
                "node": ">=6"
            }

        },

        "node_modules/safe-buffer": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
            "dev": true,
            "funding": [
                {
                    "type": "github",
                    "url": "https://github.com/sponsors/feross"
                },

                {
                    "type": "patreon",
                    "url": "https://www.patreon.com/feross"
                },

                {
                    "type": "consulting",
                    "url": "https://feross.org/support"
                }

            ]

        },

        "node_modules/sander": {
            "version": "0.5.1",
            "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz",
            "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==",
            "dev": true,
            "dependencies": {
                "es6-promise": "^3.1.2",
                "graceful-fs": "^4.1.3",
                "mkdirp": "^0.5.1",
                "rimraf": "^2.5.2"
            }

        },

        "node_modules/sander/node_modules/rimraf": {
            "version": "2.7.1",
            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
            "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
            "dev": true,
            "dependencies": {
                "glob": "^7.1.3"
            },

            "bin": {
                "rimraf": "bin.js"
            }

        },

        "node_modules/semver": {
            "version": "7.3.7",
            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
            "dev": true,
            "dependencies": {
                "lru-cache": "^6.0.0"
            },

            "bin": {
                "semver": "bin/semver.js"
            },

            "engines": {
                "node": ">=10"
            }

        },

        "node_modules/set-blocking": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
            "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
            "dev": true
        },

        "node_modules/set-cookie-parser": {
            "version": "2.5.1",
            "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz",
            "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==",
            "dev": true
        },

        "node_modules/shebang-command": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
            "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
            "dev": true,
            "dependencies": {
                "shebang-regex": "^3.0.0"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/shebang-regex": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
            "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/signal-exit": {
            "version": "3.0.7",
            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
            "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
            "dev": true
        },

        "node_modules/sirv": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz",
            "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==",
            "dev": true,
            "dependencies": {
                "@polka/url": "^1.0.0-next.20",
                "mrmime": "^1.0.0",
                "totalist": "^3.0.0"
            },

            "engines": {
                "node": ">= 10"
            }

        },

        "node_modules/slash": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
            "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
            "dev": true,
            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/sorcery": {
            "version": "0.10.0",
            "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz",
            "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==",
            "dev": true,
            "dependencies": {
                "buffer-crc32": "^0.2.5",
                "minimist": "^1.2.0",
                "sander": "^0.5.0",
                "sourcemap-codec": "^1.3.0"
            },

            "bin": {
                "sorcery": "bin/index.js"
            }

        },

        "node_modules/source-map-js": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
            "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/sourcemap-codec": {
            "version": "1.4.8",
            "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
            "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
            "dev": true
        },

        "node_modules/string_decoder": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
            "dev": true,
            "dependencies": {
                "safe-buffer": "~5.2.0"
            }

        },

        "node_modules/string-width": {
            "version": "4.2.3",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
            "dev": true,
            "dependencies": {
                "emoji-regex": "^8.0.0",
                "is-fullwidth-code-point": "^3.0.0",
                "strip-ansi": "^6.0.1"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/strip-ansi": {
            "version": "6.0.1",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
            "dev": true,
            "dependencies": {
                "ansi-regex": "^5.0.1"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/strip-indent": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
            "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
            "dev": true,
            "dependencies": {
                "min-indent": "^1.0.0"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/strip-json-comments": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
            "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
            "dev": true,
            "engines": {
                "node": ">=8"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/supports-color": {
            "version": "7.2.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
            "dev": true,
            "dependencies": {
                "has-flag": "^4.0.0"
            },

            "engines": {
                "node": ">=8"
            }

        },

        "node_modules/supports-preserve-symlinks-flag": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
            "dev": true,
            "engines": {
                "node": ">= 0.4"
            },

            "funding": {
                "url": "https://github.com/sponsors/ljharb"
            }

        },

        "node_modules/svelte": {
            "version": "3.49.0",
            "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz",
            "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==",
            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/svelte-check": {
            "version": "2.9.0",
            "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.9.0.tgz",
            "integrity": "sha512-9AVrtP7WbfDgCdqTZNPdj5CCCy1OrYMxFVWAWzNw7fl93c9klFJFtqzVXa6fovfQ050CcpUyJE2dPFL9TFAREw==",
            "dev": true,
            "dependencies": {
                "@jridgewell/trace-mapping": "^0.3.9",
                "chokidar": "^3.4.1",
                "fast-glob": "^3.2.7",
                "import-fresh": "^3.2.1",
                "picocolors": "^1.0.0",
                "sade": "^1.7.4",
                "svelte-preprocess": "^4.0.0",
                "typescript": "*"
            },

            "bin": {
                "svelte-check": "bin/svelte-check"
            },

            "peerDependencies": {
                "svelte": "^3.24.0"
            }

        },

        "node_modules/svelte-hmr": {
            "version": "0.14.12",
            "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz",
            "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==",
            "dev": true,
            "engines": {
                "node": "^12.20 || ^14.13.1 || >= 16"
            },

            "peerDependencies": {
                "svelte": ">=3.19.0"
            }

        },

        "node_modules/svelte-markdown": {
            "version": "0.2.3",
            "resolved": "https://registry.npmjs.org/svelte-markdown/-/svelte-markdown-0.2.3.tgz",
            "integrity": "sha512-2h680NzTXnAD0CXhxe3GeHl6W+ayG4iKQRl+BIDRw+R0mUE0OiNxP1Vt8Rn+aWevB/LBiBIPCAwvL+0BkG057A==",
            "dependencies": {
                "@types/marked": "^4.0.1",
                "marked": "^4.0.10"
            },

            "peerDependencies": {
                "svelte": "^3.0.0"
            }

        },

        "node_modules/svelte-preprocess": {
            "version": "4.10.7",
            "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz",
            "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==",
            "dev": true,
            "hasInstallScript": true,
            "dependencies": {
                "@types/pug": "^2.0.4",
                "@types/sass": "^1.16.0",
                "detect-indent": "^6.0.0",
                "magic-string": "^0.25.7",
                "sorcery": "^0.10.0",
                "strip-indent": "^3.0.0"
            },

            "engines": {
                "node": ">= 9.11.2"
            },

            "peerDependencies": {
                "@babel/core": "^7.10.2",
                "coffeescript": "^2.5.1",
                "less": "^3.11.3 || ^4.0.0",
                "postcss": "^7 || ^8",
                "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0",
                "pug": "^3.0.0",
                "sass": "^1.26.8",
                "stylus": "^0.55.0",
                "sugarss": "^2.0.0",
                "svelte": "^3.23.0",
                "typescript": "^3.9.5 || ^4.0.0"
            },

            "peerDependenciesMeta": {
                "@babel/core": {
                    "optional": true
                },

                "coffeescript": {
                    "optional": true
                },

                "less": {
                    "optional": true
                },

                "node-sass": {
                    "optional": true
                },

                "postcss": {
                    "optional": true
                },

                "postcss-load-config": {
                    "optional": true
                },

                "pug": {
                    "optional": true
                },

                "sass": {
                    "optional": true
                },

                "stylus": {
                    "optional": true
                },

                "sugarss": {
                    "optional": true
                },

                "typescript": {
                    "optional": true
                }

            }

        },

        "node_modules/svelte-preprocess/node_modules/magic-string": {
            "version": "0.25.9",
            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
            "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
            "dev": true,
            "dependencies": {
                "sourcemap-codec": "^1.4.8"
            }

        },

        "node_modules/tailwindcss": {
            "version": "3.1.8",
            "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz",
            "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==",
            "dev": true,
            "dependencies": {
                "arg": "^5.0.2",
                "chokidar": "^3.5.3",
                "color-name": "^1.1.4",
                "detective": "^5.2.1",
                "didyoumean": "^1.2.2",
                "dlv": "^1.1.3",
                "fast-glob": "^3.2.11",
                "glob-parent": "^6.0.2",
                "is-glob": "^4.0.3",
                "lilconfig": "^2.0.6",
                "normalize-path": "^3.0.0",
                "object-hash": "^3.0.0",
                "picocolors": "^1.0.0",
                "postcss": "^8.4.14",
                "postcss-import": "^14.1.0",
                "postcss-js": "^4.0.0",
                "postcss-load-config": "^3.1.4",
                "postcss-nested": "5.0.6",
                "postcss-selector-parser": "^6.0.10",
                "postcss-value-parser": "^4.2.0",
                "quick-lru": "^5.1.1",
                "resolve": "^1.22.1"
            },

            "bin": {
                "tailwind": "lib/cli.js",
                "tailwindcss": "lib/cli.js"
            },

            "engines": {
                "node": ">=12.13.0"
            },

            "peerDependencies": {
                "postcss": "^8.0.9"
            }

        },

        "node_modules/tar": {
            "version": "6.1.11",
            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
            "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
            "dev": true,
            "dependencies": {
                "chownr": "^2.0.0",
                "fs-minipass": "^2.0.0",
                "minipass": "^3.0.0",
                "minizlib": "^2.1.1",
                "mkdirp": "^1.0.3",
                "yallist": "^4.0.0"
            },

            "engines": {
                "node": ">= 10"
            }

        },

        "node_modules/tar/node_modules/mkdirp": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
            "dev": true,
            "bin": {
                "mkdirp": "bin/cmd.js"
            },

            "engines": {
                "node": ">=10"
            }

        },

        "node_modules/text-table": {
            "version": "0.2.0",
            "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
            "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
            "dev": true
        },

        "node_modules/tiny-glob": {
            "version": "0.2.9",
            "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
            "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
            "dev": true,
            "dependencies": {
                "globalyzer": "0.1.0",
                "globrex": "^0.1.2"
            }

        },

        "node_modules/to-regex-range": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
            "dev": true,
            "dependencies": {
                "is-number": "^7.0.0"
            },

            "engines": {
                "node": ">=8.0"
            }

        },

        "node_modules/totalist": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz",
            "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==",
            "dev": true,
            "engines": {
                "node": ">=6"
            }

        },

        "node_modules/tr46": {
            "version": "0.0.3",
            "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
            "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
            "dev": true
        },

        "node_modules/tslib": {
            "version": "2.4.0",
            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
            "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
            "dev": true
        },

        "node_modules/tsutils": {
            "version": "3.21.0",
            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
            "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
            "dev": true,
            "dependencies": {
                "tslib": "^1.8.1"
            },

            "engines": {
                "node": ">= 6"
            },

            "peerDependencies": {
                "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
            }

        },

        "node_modules/tsutils/node_modules/tslib": {
            "version": "1.14.1",
            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
            "dev": true
        },

        "node_modules/type-check": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
            "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
            "dev": true,
            "dependencies": {
                "prelude-ls": "^1.2.1"
            },

            "engines": {
                "node": ">= 0.8.0"
            }

        },

        "node_modules/type-fest": {
            "version": "0.20.2",
            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
            "dev": true,
            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        },

        "node_modules/typescript": {
            "version": "4.8.2",
            "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz",
            "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==",
            "dev": true,
            "bin": {
                "tsc": "bin/tsc",
                "tsserver": "bin/tsserver"
            },

            "engines": {
                "node": ">=4.2.0"
            }

        },

        "node_modules/undici": {
            "version": "5.10.0",
            "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz",
            "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==",
            "dev": true,
            "engines": {
                "node": ">=12.18"
            }

        },

        "node_modules/update-browserslist-db": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
            "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
            "dev": true,
            "funding": [
                {
                    "type": "opencollective",
                    "url": "https://opencollective.com/browserslist"
                },

                {
                    "type": "tidelift",
                    "url": "https://tidelift.com/funding/github/npm/browserslist"
                }

            ],

            "dependencies": {
                "escalade": "^3.1.1",
                "picocolors": "^1.0.0"
            },

            "bin": {
                "browserslist-lint": "cli.js"
            },

            "peerDependencies": {
                "browserslist": ">= 4.21.0"
            }

        },

        "node_modules/uri-js": {
            "version": "4.4.1",
            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
            "dev": true,
            "dependencies": {
                "punycode": "^2.1.0"
            }

        },

        "node_modules/util-deprecate": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
            "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
            "dev": true
        },

        "node_modules/vite": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.0.tgz",
            "integrity": "sha512-YBg3dUicDpDWFCGttmvMbVyS9ydjntwEjwXRj2KBFwSB8SxmGcudo1yb8FW5+M/G86aS8x828ujnzUVdsLjs9g==",
            "dev": true,
            "dependencies": {
                "esbuild": "^0.15.6",
                "postcss": "^8.4.16",
                "resolve": "^1.22.1",
                "rollup": "~2.78.0"
            },

            "bin": {
                "vite": "bin/vite.js"
            },

            "engines": {
                "node": "^14.18.0 || >=16.0.0"
            },

            "optionalDependencies": {
                "fsevents": "~2.3.2"
            },

            "peerDependencies": {
                "less": "*",
                "sass": "*",
                "stylus": "*",
                "terser": "^5.4.0"
            },

            "peerDependenciesMeta": {
                "less": {
                    "optional": true
                },

                "sass": {
                    "optional": true
                },

                "stylus": {
                    "optional": true
                },

                "terser": {
                    "optional": true
                }

            }

        },

        "node_modules/web-streams-polyfill": {
            "version": "3.2.1",
            "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
            "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
            "dev": true,
            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/webidl-conversions": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
            "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
            "dev": true
        },

        "node_modules/whatwg-url": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
            "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
            "dev": true,
            "dependencies": {
                "tr46": "~0.0.3",
                "webidl-conversions": "^3.0.0"
            }

        },

        "node_modules/which": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
            "dev": true,
            "dependencies": {
                "isexe": "^2.0.0"
            },

            "bin": {
                "node-which": "bin/node-which"
            },

            "engines": {
                "node": ">= 8"
            }

        },

        "node_modules/wide-align": {
            "version": "1.1.5",
            "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
            "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
            "dev": true,
            "dependencies": {
                "string-width": "^1.0.2 || 2 || 3 || 4"
            }

        },

        "node_modules/word-wrap": {
            "version": "1.2.3",
            "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
            "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
            "dev": true,
            "engines": {
                "node": ">=0.10.0"
            }

        },

        "node_modules/worktop": {
            "version": "0.8.0-next.14",
            "resolved": "https://registry.npmjs.org/worktop/-/worktop-0.8.0-next.14.tgz",
            "integrity": "sha512-RZgqHu1w/JcUdWOE/BUEAzarrUUHh39eWkLdX8XpA6MfgLJF6X5Vl26CV7/wcm4O/UpZvHMGJUtB9eYTqDjc9g==",
            "dev": true,
            "dependencies": {
                "mrmime": "^1.0.0",
                "regexparam": "^2.0.0"
            },

            "engines": {
                "node": ">=12"
            }

        },

        "node_modules/wrappy": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
            "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
            "dev": true
        },

        "node_modules/xtend": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
            "dev": true,
            "engines": {
                "node": ">=0.4"
            }

        },

        "node_modules/yallist": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
            "dev": true
        },

        "node_modules/yaml": {
            "version": "1.10.2",
            "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
            "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
            "dev": true,
            "engines": {
                "node": ">= 6"
            }

        },

        "node_modules/yocto-queue": {
            "version": "0.1.0",
            "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
            "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
            "dev": true,
            "engines": {
                "node": ">=10"
            },

            "funding": {
                "url": "https://github.com/sponsors/sindresorhus"
            }

        }

    },

    "dependencies": {
        "@cloudflare/workers-types": {
            "version": "3.16.0",
            "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-3.16.0.tgz",
            "integrity": "sha512-gaBUSaKS65mN3iKZEgichbXYEmAa/pXkc5Gbt+1BptYphdGkj09ggdsiE4w8g0F/uI1g36QaTKrzVnBAWMipvQ==",
            "dev": true
        },

        "@esbuild/linux-loong64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.7.tgz",
            "integrity": "sha512-IKznSJOsVUuyt7cDzzSZyqBEcZe+7WlBqTVXiF1OXP/4Nm387ToaXZ0fyLwI1iBlI/bzpxVq411QE2/Bt2XWWw==",
            "dev": true,
            "optional": true
        },

        "@eslint/eslintrc": {
            "version": "1.3.1",
            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz",
            "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==",
            "dev": true,
            "requires": {
                "ajv": "^6.12.4",
                "debug": "^4.3.2",
                "espree": "^9.4.0",
                "globals": "^13.15.0",
                "ignore": "^5.2.0",
                "import-fresh": "^3.2.1",
                "js-yaml": "^4.1.0",
                "minimatch": "^3.1.2",
                "strip-json-comments": "^3.1.1"
            }

        },

        "@humanwhocodes/config-array": {
            "version": "0.10.4",
            "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz",
            "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==",
            "dev": true,
            "requires": {
                "@humanwhocodes/object-schema": "^1.2.1",
                "debug": "^4.1.1",
                "minimatch": "^3.0.4"
            }

        },

        "@humanwhocodes/gitignore-to-minimatch": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz",
            "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==",
            "dev": true
        },

        "@humanwhocodes/module-importer": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
            "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
            "dev": true
        },

        "@humanwhocodes/object-schema": {
            "version": "1.2.1",
            "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
            "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
            "dev": true
        },

        "@iarna/toml": {
            "version": "2.2.5",
            "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz",
            "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
            "dev": true
        },

        "@jridgewell/resolve-uri": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
            "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
            "dev": true
        },

        "@jridgewell/sourcemap-codec": {
            "version": "1.4.14",
            "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
            "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
            "dev": true
        },

        "@jridgewell/trace-mapping": {
            "version": "0.3.15",
            "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
            "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
            "dev": true,
            "requires": {
                "@jridgewell/resolve-uri": "^3.0.3",
                "@jridgewell/sourcemap-codec": "^1.4.10"
            }

        },

        "@mapbox/node-pre-gyp": {
            "version": "1.0.10",
            "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
            "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==",
            "dev": true,
            "requires": {
                "detect-libc": "^2.0.0",
                "https-proxy-agent": "^5.0.0",
                "make-dir": "^3.1.0",
                "node-fetch": "^2.6.7",
                "nopt": "^5.0.0",
                "npmlog": "^5.0.1",
                "rimraf": "^3.0.2",
                "semver": "^7.3.5",
                "tar": "^6.1.11"
            },

            "dependencies": {
                "node-fetch": {
                    "version": "2.6.7",
                    "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
                    "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
                    "dev": true,
                    "requires": {
                        "whatwg-url": "^5.0.0"
                    }

                }

            }

        },

        "@nodelib/fs.scandir": {
            "version": "2.1.5",
            "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
            "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
            "dev": true,
            "requires": {
                "@nodelib/fs.stat": "2.0.5",
                "run-parallel": "^1.1.9"
            }

        },

        "@nodelib/fs.stat": {
            "version": "2.0.5",
            "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
            "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
            "dev": true
        },

        "@nodelib/fs.walk": {
            "version": "1.2.8",
            "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
            "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
            "dev": true,
            "requires": {
                "@nodelib/fs.scandir": "2.1.5",
                "fastq": "^1.6.0"
            }

        },

        "@playwright/test": {
            "version": "1.25.1",
            "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.25.1.tgz",
            "integrity": "sha512-IJ4X0yOakXtwkhbnNzKkaIgXe6df7u3H3FnuhI9Jqh+CdO0e/lYQlDLYiyI9cnXK8E7UAppAWP+VqAv6VX7HQg==",
            "dev": true,
            "requires": {
                "@types/node": "*",
                "playwright-core": "1.25.1"
            }

        },

        "@polka/url": {
            "version": "1.0.0-next.21",
            "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
            "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
            "dev": true
        },

        "@rollup/pluginutils": {
            "version": "4.2.1",
            "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
            "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
            "dev": true,
            "requires": {
                "estree-walker": "^2.0.1",
                "picomatch": "^2.2.2"
            }

        },

        "@sveltejs/adapter-auto": {
            "version": "1.0.0-next.71",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-1.0.0-next.71.tgz",
            "integrity": "sha512-Qsl82HcehWJbZztXgmU/nTPDeeIaB4jrOQpSvy3Pi8octs+rEf/CO87Wk06EP+M/zUzEHDNENMOx0DgWuHpj7Q==",
            "dev": true,
            "requires": {
                "@sveltejs/adapter-cloudflare": "1.0.0-next.32",
                "@sveltejs/adapter-netlify": "1.0.0-next.76",
                "@sveltejs/adapter-vercel": "1.0.0-next.72"
            }

        },

        "@sveltejs/adapter-cloudflare": {
            "version": "1.0.0-next.32",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-cloudflare/-/adapter-cloudflare-1.0.0-next.32.tgz",
            "integrity": "sha512-tzkUsdQlBk9xUjcGUOBYos4HKaeaXvz9v4TQ1QS2yIHEtL5xvMEDPZ94/DB2gPL4LZCnYbdY2lsy5HCsoN0hkQ==",
            "dev": true,
            "requires": {
                "@cloudflare/workers-types": "^3.14.0",
                "esbuild": "^0.14.48",
                "worktop": "0.8.0-next.14"
            },

            "dependencies": {
                "@esbuild/linux-loong64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
                    "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
                    "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
                    "dev": true,
                    "requires": {
                        "@esbuild/linux-loong64": "0.14.54",
                        "esbuild-android-64": "0.14.54",
                        "esbuild-android-arm64": "0.14.54",
                        "esbuild-darwin-64": "0.14.54",
                        "esbuild-darwin-arm64": "0.14.54",
                        "esbuild-freebsd-64": "0.14.54",
                        "esbuild-freebsd-arm64": "0.14.54",
                        "esbuild-linux-32": "0.14.54",
                        "esbuild-linux-64": "0.14.54",
                        "esbuild-linux-arm": "0.14.54",
                        "esbuild-linux-arm64": "0.14.54",
                        "esbuild-linux-mips64le": "0.14.54",
                        "esbuild-linux-ppc64le": "0.14.54",
                        "esbuild-linux-riscv64": "0.14.54",
                        "esbuild-linux-s390x": "0.14.54",
                        "esbuild-netbsd-64": "0.14.54",
                        "esbuild-openbsd-64": "0.14.54",
                        "esbuild-sunos-64": "0.14.54",
                        "esbuild-windows-32": "0.14.54",
                        "esbuild-windows-64": "0.14.54",
                        "esbuild-windows-arm64": "0.14.54"
                    }

                },

                "esbuild-android-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
                    "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-android-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
                    "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-darwin-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
                    "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-darwin-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
                    "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-freebsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
                    "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-freebsd-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
                    "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-32": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
                    "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
                    "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-arm": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
                    "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
                    "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-mips64le": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
                    "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-ppc64le": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
                    "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-riscv64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
                    "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-s390x": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
                    "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-netbsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
                    "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-openbsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
                    "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-sunos-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
                    "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-windows-32": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
                    "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-windows-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
                    "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-windows-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
                    "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
                    "dev": true,
                    "optional": true
                }

            }

        },

        "@sveltejs/adapter-netlify": {
            "version": "1.0.0-next.76",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-netlify/-/adapter-netlify-1.0.0-next.76.tgz",
            "integrity": "sha512-XC33i13N+zkDP1rKrssQ55TPzt4DkLjKux6g1xW2MB+5KxnC9PP2rIkocKxFw/pK2XU8cUIgmOJ1y5PQrHaiKg==",
            "dev": true,
            "requires": {
                "@iarna/toml": "^2.2.5",
                "esbuild": "^0.14.48",
                "set-cookie-parser": "^2.4.8",
                "tiny-glob": "^0.2.9"
            },

            "dependencies": {
                "@esbuild/linux-loong64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
                    "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
                    "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
                    "dev": true,
                    "requires": {
                        "@esbuild/linux-loong64": "0.14.54",
                        "esbuild-android-64": "0.14.54",
                        "esbuild-android-arm64": "0.14.54",
                        "esbuild-darwin-64": "0.14.54",
                        "esbuild-darwin-arm64": "0.14.54",
                        "esbuild-freebsd-64": "0.14.54",
                        "esbuild-freebsd-arm64": "0.14.54",
                        "esbuild-linux-32": "0.14.54",
                        "esbuild-linux-64": "0.14.54",
                        "esbuild-linux-arm": "0.14.54",
                        "esbuild-linux-arm64": "0.14.54",
                        "esbuild-linux-mips64le": "0.14.54",
                        "esbuild-linux-ppc64le": "0.14.54",
                        "esbuild-linux-riscv64": "0.14.54",
                        "esbuild-linux-s390x": "0.14.54",
                        "esbuild-netbsd-64": "0.14.54",
                        "esbuild-openbsd-64": "0.14.54",
                        "esbuild-sunos-64": "0.14.54",
                        "esbuild-windows-32": "0.14.54",
                        "esbuild-windows-64": "0.14.54",
                        "esbuild-windows-arm64": "0.14.54"
                    }

                },

                "esbuild-android-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
                    "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-android-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
                    "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-darwin-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
                    "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-darwin-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
                    "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-freebsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
                    "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-freebsd-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
                    "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-32": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
                    "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
                    "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-arm": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
                    "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
                    "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-mips64le": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
                    "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-ppc64le": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
                    "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-riscv64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
                    "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-s390x": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
                    "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-netbsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
                    "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-openbsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
                    "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-sunos-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
                    "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-windows-32": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
                    "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-windows-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
                    "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-windows-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
                    "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
                    "dev": true,
                    "optional": true
                }

            }

        },

        "@sveltejs/adapter-node": {
            "version": "1.0.0-next.88",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-1.0.0-next.88.tgz",
            "integrity": "sha512-N75E0tbq1+70/8lYUbttj7ry+5PDl7DB29aJqYIQQdnWMkIv0CPnH5ux4fwDuQJuhR7k1lfUbLd96JWwPBHvIg==",
            "requires": {
                "esbuild": "^0.14.48"
            },

            "dependencies": {
                "@esbuild/linux-loong64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
                    "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
                    "optional": true
                },

                "esbuild": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
                    "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
                    "requires": {
                        "@esbuild/linux-loong64": "0.14.54",
                        "esbuild-android-64": "0.14.54",
                        "esbuild-android-arm64": "0.14.54",
                        "esbuild-darwin-64": "0.14.54",
                        "esbuild-darwin-arm64": "0.14.54",
                        "esbuild-freebsd-64": "0.14.54",
                        "esbuild-freebsd-arm64": "0.14.54",
                        "esbuild-linux-32": "0.14.54",
                        "esbuild-linux-64": "0.14.54",
                        "esbuild-linux-arm": "0.14.54",
                        "esbuild-linux-arm64": "0.14.54",
                        "esbuild-linux-mips64le": "0.14.54",
                        "esbuild-linux-ppc64le": "0.14.54",
                        "esbuild-linux-riscv64": "0.14.54",
                        "esbuild-linux-s390x": "0.14.54",
                        "esbuild-netbsd-64": "0.14.54",
                        "esbuild-openbsd-64": "0.14.54",
                        "esbuild-sunos-64": "0.14.54",
                        "esbuild-windows-32": "0.14.54",
                        "esbuild-windows-64": "0.14.54",
                        "esbuild-windows-arm64": "0.14.54"
                    }

                },

                "esbuild-android-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
                    "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
                    "optional": true
                },

                "esbuild-android-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
                    "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
                    "optional": true
                },

                "esbuild-darwin-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
                    "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
                    "optional": true
                },

                "esbuild-darwin-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
                    "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
                    "optional": true
                },

                "esbuild-freebsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
                    "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
                    "optional": true
                },

                "esbuild-freebsd-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
                    "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
                    "optional": true
                },

                "esbuild-linux-32": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
                    "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
                    "optional": true
                },

                "esbuild-linux-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
                    "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
                    "optional": true
                },

                "esbuild-linux-arm": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
                    "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
                    "optional": true
                },

                "esbuild-linux-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
                    "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
                    "optional": true
                },

                "esbuild-linux-mips64le": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
                    "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
                    "optional": true
                },

                "esbuild-linux-ppc64le": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
                    "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
                    "optional": true
                },

                "esbuild-linux-riscv64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
                    "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
                    "optional": true
                },

                "esbuild-linux-s390x": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
                    "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
                    "optional": true
                },

                "esbuild-netbsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
                    "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
                    "optional": true
                },

                "esbuild-openbsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
                    "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
                    "optional": true
                },

                "esbuild-sunos-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
                    "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
                    "optional": true
                },

                "esbuild-windows-32": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
                    "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
                    "optional": true
                },

                "esbuild-windows-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
                    "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
                    "optional": true
                },

                "esbuild-windows-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
                    "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
                    "optional": true
                }

            }

        },

        "@sveltejs/adapter-vercel": {
            "version": "1.0.0-next.72",
            "resolved": "https://registry.npmjs.org/@sveltejs/adapter-vercel/-/adapter-vercel-1.0.0-next.72.tgz",
            "integrity": "sha512-oNs8FQaYC2NnwDcvX/jc9MDNqXc9HxwGPQNkd+1vBpFVWZl9mShQgCcOMzfTOIH0ka984jYNa0ZawYYHex79xg==",
            "dev": true,
            "requires": {
                "@vercel/nft": "^0.22.0",
                "esbuild": "^0.14.48"
            },

            "dependencies": {
                "@esbuild/linux-loong64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
                    "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
                    "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
                    "dev": true,
                    "requires": {
                        "@esbuild/linux-loong64": "0.14.54",
                        "esbuild-android-64": "0.14.54",
                        "esbuild-android-arm64": "0.14.54",
                        "esbuild-darwin-64": "0.14.54",
                        "esbuild-darwin-arm64": "0.14.54",
                        "esbuild-freebsd-64": "0.14.54",
                        "esbuild-freebsd-arm64": "0.14.54",
                        "esbuild-linux-32": "0.14.54",
                        "esbuild-linux-64": "0.14.54",
                        "esbuild-linux-arm": "0.14.54",
                        "esbuild-linux-arm64": "0.14.54",
                        "esbuild-linux-mips64le": "0.14.54",
                        "esbuild-linux-ppc64le": "0.14.54",
                        "esbuild-linux-riscv64": "0.14.54",
                        "esbuild-linux-s390x": "0.14.54",
                        "esbuild-netbsd-64": "0.14.54",
                        "esbuild-openbsd-64": "0.14.54",
                        "esbuild-sunos-64": "0.14.54",
                        "esbuild-windows-32": "0.14.54",
                        "esbuild-windows-64": "0.14.54",
                        "esbuild-windows-arm64": "0.14.54"
                    }

                },

                "esbuild-android-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
                    "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-android-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
                    "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-darwin-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
                    "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-darwin-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
                    "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-freebsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
                    "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-freebsd-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
                    "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-32": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
                    "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
                    "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-arm": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
                    "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
                    "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-mips64le": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
                    "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-ppc64le": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
                    "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-riscv64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
                    "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-linux-s390x": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
                    "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-netbsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
                    "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-openbsd-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
                    "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-sunos-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
                    "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-windows-32": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
                    "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-windows-64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
                    "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
                    "dev": true,
                    "optional": true
                },

                "esbuild-windows-arm64": {
                    "version": "0.14.54",
                    "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
                    "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
                    "dev": true,
                    "optional": true
                }

            }

        },

        "@sveltejs/kit": {
            "version": "1.0.0-next.460",
            "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.460.tgz",
            "integrity": "sha512-bwDkwzEN72+1K5FXqBQGrYOwyA6V5sSSec/A6qXMTfh4uycFTiIQh/e2ki3pxfG0SwijrUo43FEbdKLyBiuDgQ==",
            "dev": true,
            "requires": {
                "@sveltejs/vite-plugin-svelte": "^1.0.3",
                "cookie": "^0.5.0",
                "devalue": "^3.1.2",
                "kleur": "^4.1.4",
                "magic-string": "^0.26.2",
                "mime": "^3.0.0",
                "node-fetch": "^3.2.4",
                "sade": "^1.8.1",
                "set-cookie-parser": "^2.4.8",
                "sirv": "^2.0.2",
                "tiny-glob": "^0.2.9",
                "undici": "^5.8.1"
            }

        },

        "@sveltejs/vite-plugin-svelte": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.3.tgz",
            "integrity": "sha512-0Qu51m2W9RBlxWPp8i31KJpnqmjWMOne8vAzgmOX6ZM9uX+/RAv6BNhEMcNoP5MsyLjyW1ZTCiJoaZZ5EeqpFg==",
            "dev": true,
            "requires": {
                "@rollup/pluginutils": "^4.2.1",
                "debug": "^4.3.4",
                "deepmerge": "^4.2.2",
                "kleur": "^4.1.5",
                "magic-string": "^0.26.2",
                "svelte-hmr": "^0.14.12"
            }

        },

        "@tailwindcss/forms": {
            "version": "0.5.3",
            "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz",
            "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==",
            "dev": true,
            "requires": {
                "mini-svg-data-uri": "^1.2.3"
            }

        },

        "@tailwindcss/typography": {
            "version": "0.5.7",
            "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.7.tgz",
            "integrity": "sha512-JTTSTrgZfp6Ki4svhPA4mkd9nmQ/j9EfE7SbHJ1cLtthKkpW2OxsFXzSmxbhYbEkfNIyAyhle5p4SYyKRbz/jg==",
            "dev": true,
            "requires": {
                "lodash.castarray": "^4.4.0",
                "lodash.isplainobject": "^4.0.6",
                "lodash.merge": "^4.6.2",
                "postcss-selector-parser": "6.0.10"
            }

        },

        "@types/feather-icons": {
            "version": "4.7.0",
            "resolved": "https://registry.npmjs.org/@types/feather-icons/-/feather-icons-4.7.0.tgz",
            "integrity": "sha512-vflOrmlHMGIGVN4AEl6ErPCNKBLcP1ehEpLqnJkTgf69r5QmJzy7BF1WzbBc8Hqs9KffROPT/JqlSKH4o5vB/w==",
            "dev": true
        },

        "@types/json-schema": {
            "version": "7.0.11",
            "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
            "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
            "dev": true
        },

        "@types/lodash": {
            "version": "4.14.184",
            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz",
            "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==",
            "dev": true
        },

        "@types/luxon": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.1.tgz",
            "integrity": "sha512-/LAvk1cMOJt0ghzMFrZEvByUhsiEfeeT2IF53Le+Ki3A538yEL9pRZ7a6MuCxdrYK+YNqNIDmrKU/r2nnw04zQ==",
            "dev": true
        },

        "@types/marked": {
            "version": "4.0.6",
            "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.6.tgz",
            "integrity": "sha512-ITAVUzsnVbhy5afxhs4PPPbrv2hKVEDH5BhhaQNQlVG0UNu+9A18XSdYr53nBdHZ0ADEQLl+ciOjXbs7eHdiQQ=="
        },

        "@types/node": {
            "version": "18.7.14",
            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz",
            "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==",
            "dev": true
        },

        "@types/pug": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz",
            "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==",
            "dev": true
        },

        "@types/sass": {
            "version": "1.43.1",
            "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz",
            "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==",
            "dev": true,
            "requires": {
                "@types/node": "*"
            }

        },

        "@typescript-eslint/eslint-plugin": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz",
            "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==",
            "dev": true,
            "requires": {
                "@typescript-eslint/scope-manager": "5.36.1",
                "@typescript-eslint/type-utils": "5.36.1",
                "@typescript-eslint/utils": "5.36.1",
                "debug": "^4.3.4",
                "functional-red-black-tree": "^1.0.1",
                "ignore": "^5.2.0",
                "regexpp": "^3.2.0",
                "semver": "^7.3.7",
                "tsutils": "^3.21.0"
            }

        },

        "@typescript-eslint/parser": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz",
            "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==",
            "dev": true,
            "requires": {
                "@typescript-eslint/scope-manager": "5.36.1",
                "@typescript-eslint/types": "5.36.1",
                "@typescript-eslint/typescript-estree": "5.36.1",
                "debug": "^4.3.4"
            }

        },

        "@typescript-eslint/scope-manager": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz",
            "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==",
            "dev": true,
            "requires": {
                "@typescript-eslint/types": "5.36.1",
                "@typescript-eslint/visitor-keys": "5.36.1"
            }

        },

        "@typescript-eslint/type-utils": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz",
            "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==",
            "dev": true,
            "requires": {
                "@typescript-eslint/typescript-estree": "5.36.1",
                "@typescript-eslint/utils": "5.36.1",
                "debug": "^4.3.4",
                "tsutils": "^3.21.0"
            }

        },

        "@typescript-eslint/types": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz",
            "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==",
            "dev": true
        },

        "@typescript-eslint/typescript-estree": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz",
            "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==",
            "dev": true,
            "requires": {
                "@typescript-eslint/types": "5.36.1",
                "@typescript-eslint/visitor-keys": "5.36.1",
                "debug": "^4.3.4",
                "globby": "^11.1.0",
                "is-glob": "^4.0.3",
                "semver": "^7.3.7",
                "tsutils": "^3.21.0"
            }

        },

        "@typescript-eslint/utils": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz",
            "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==",
            "dev": true,
            "requires": {
                "@types/json-schema": "^7.0.9",
                "@typescript-eslint/scope-manager": "5.36.1",
                "@typescript-eslint/types": "5.36.1",
                "@typescript-eslint/typescript-estree": "5.36.1",
                "eslint-scope": "^5.1.1",
                "eslint-utils": "^3.0.0"
            }

        },

        "@typescript-eslint/visitor-keys": {
            "version": "5.36.1",
            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz",
            "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==",
            "dev": true,
            "requires": {
                "@typescript-eslint/types": "5.36.1",
                "eslint-visitor-keys": "^3.3.0"
            }

        },

        "@vercel/nft": {
            "version": "0.22.1",
            "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.1.tgz",
            "integrity": "sha512-lYYZIoxRurqDOSoVIdBicGnpUIpfyaS5qVjdPq+EfI285WqtZK3NK/dyCkiyBul+X2U2OEhRyeMdXPCHGJbohw==",
            "dev": true,
            "requires": {
                "@mapbox/node-pre-gyp": "^1.0.5",
                "acorn": "^8.6.0",
                "async-sema": "^3.1.1",
                "bindings": "^1.4.0",
                "estree-walker": "2.0.2",
                "glob": "^7.1.3",
                "graceful-fs": "^4.2.9",
                "micromatch": "^4.0.2",
                "node-gyp-build": "^4.2.2",
                "resolve-from": "^5.0.0",
                "rollup-pluginutils": "^2.8.2"
            }

        },

        "abbrev": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
            "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
            "dev": true
        },

        "acorn": {
            "version": "8.8.0",
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
            "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
            "dev": true
        },

        "acorn-jsx": {
            "version": "5.3.2",
            "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
            "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
            "dev": true,
            "requires": {}
        },

        "acorn-node": {
            "version": "1.8.2",
            "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
            "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
            "dev": true,
            "requires": {
                "acorn": "^7.0.0",
                "acorn-walk": "^7.0.0",
                "xtend": "^4.0.2"
            },

            "dependencies": {
                "acorn": {
                    "version": "7.4.1",
                    "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
                    "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
                    "dev": true
                }

            }

        },

        "acorn-walk": {
            "version": "7.2.0",
            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
            "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
            "dev": true
        },

        "agent-base": {
            "version": "6.0.2",
            "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
            "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
            "dev": true,
            "requires": {
                "debug": "4"
            }

        },

        "ajv": {
            "version": "6.12.6",
            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
            "dev": true,
            "requires": {
                "fast-deep-equal": "^3.1.1",
                "fast-json-stable-stringify": "^2.0.0",
                "json-schema-traverse": "^0.4.1",
                "uri-js": "^4.2.2"
            }

        },

        "ansi-regex": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
            "dev": true
        },

        "ansi-styles": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
            "dev": true,
            "requires": {
                "color-convert": "^2.0.1"
            }

        },

        "anymatch": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
            "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
            "dev": true,
            "requires": {
                "normalize-path": "^3.0.0",
                "picomatch": "^2.0.4"
            }

        },

        "aproba": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
            "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
            "dev": true
        },

        "are-we-there-yet": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
            "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
            "dev": true,
            "requires": {
                "delegates": "^1.0.0",
                "readable-stream": "^3.6.0"
            }

        },

        "arg": {
            "version": "5.0.2",
            "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
            "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
            "dev": true
        },

        "argparse": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
            "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
            "dev": true
        },

        "array-union": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
            "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
            "dev": true
        },

        "async-sema": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz",
            "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==",
            "dev": true
        },

        "autoprefixer": {
            "version": "10.4.8",
            "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz",
            "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==",
            "dev": true,
            "requires": {
                "browserslist": "^4.21.3",
                "caniuse-lite": "^1.0.30001373",
                "fraction.js": "^4.2.0",
                "normalize-range": "^0.1.2",
                "picocolors": "^1.0.0",
                "postcss-value-parser": "^4.2.0"
            }

        },

        "balanced-match": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
            "dev": true
        },

        "binary-extensions": {
            "version": "2.2.0",
            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
            "dev": true
        },

        "bindings": {
            "version": "1.5.0",
            "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
            "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
            "dev": true,
            "requires": {
                "file-uri-to-path": "1.0.0"
            }

        },

        "brace-expansion": {
            "version": "1.1.11",
            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
            "dev": true,
            "requires": {
                "balanced-match": "^1.0.0",
                "concat-map": "0.0.1"
            }

        },

        "braces": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
            "dev": true,
            "requires": {
                "fill-range": "^7.0.1"
            }

        },

        "browserslist": {
            "version": "4.21.3",
            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz",
            "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==",
            "dev": true,
            "requires": {
                "caniuse-lite": "^1.0.30001370",
                "electron-to-chromium": "^1.4.202",
                "node-releases": "^2.0.6",
                "update-browserslist-db": "^1.0.5"
            }

        },

        "buffer-crc32": {
            "version": "0.2.13",
            "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
            "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
            "dev": true
        },

        "callsites": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
            "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
            "dev": true
        },

        "camelcase-css": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
            "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
            "dev": true
        },

        "caniuse-lite": {
            "version": "1.0.30001387",
            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001387.tgz",
            "integrity": "sha512-fKDH0F1KOJvR+mWSOvhj8lVRr/Q/mc5u5nabU2vi1/sgvlSqEsE8dOq0Hy/BqVbDkCYQPRRHB1WRjW6PGB/7PA==",
            "dev": true
        },

        "chalk": {
            "version": "4.1.2",
            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
            "dev": true,
            "requires": {
                "ansi-styles": "^4.1.0",
                "supports-color": "^7.1.0"
            }

        },

        "chokidar": {
            "version": "3.5.3",
            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
            "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
            "dev": true,
            "requires": {
                "anymatch": "~3.1.2",
                "braces": "~3.0.2",
                "fsevents": "~2.3.2",
                "glob-parent": "~5.1.2",
                "is-binary-path": "~2.1.0",
                "is-glob": "~4.0.1",
                "normalize-path": "~3.0.0",
                "readdirp": "~3.6.0"
            },

            "dependencies": {
                "glob-parent": {
                    "version": "5.1.2",
                    "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
                    "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
                    "dev": true,
                    "requires": {
                        "is-glob": "^4.0.1"
                    }

                }

            }

        },

        "chownr": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
            "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
            "dev": true
        },

        "classnames": {
            "version": "2.3.1",
            "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
            "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==",
            "dev": true
        },

        "color-convert": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
            "dev": true,
            "requires": {
                "color-name": "~1.1.4"
            }

        },

        "color-name": {
            "version": "1.1.4",
            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
            "dev": true
        },

        "color-support": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
            "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
            "dev": true
        },

        "concat-map": {
            "version": "0.0.1",
            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
            "dev": true
        },

        "console-control-strings": {
            "version": "1.1.0",
            "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
            "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
            "dev": true
        },

        "cookie": {
            "version": "0.5.0",
            "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
            "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
            "dev": true
        },

        "core-js": {
            "version": "3.25.0",
            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz",
            "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==",
            "dev": true
        },

        "cross-spawn": {
            "version": "7.0.3",
            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
            "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
            "dev": true,
            "requires": {
                "path-key": "^3.1.0",
                "shebang-command": "^2.0.0",
                "which": "^2.0.1"
            }

        },

        "cssesc": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
            "dev": true
        },

        "data-uri-to-buffer": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
            "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
            "dev": true
        },

        "debug": {
            "version": "4.3.4",
            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
            "dev": true,
            "requires": {
                "ms": "2.1.2"
            }

        },

        "deep-is": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
            "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
            "dev": true
        },

        "deepmerge": {
            "version": "4.2.2",
            "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
            "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
            "dev": true
        },

        "defined": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
            "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
            "dev": true
        },

        "delegates": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
            "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
            "dev": true
        },

        "detect-indent": {
            "version": "6.1.0",
            "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
            "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
            "dev": true
        },

        "detect-libc": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
            "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
            "dev": true
        },

        "detective": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
            "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
            "dev": true,
            "requires": {
                "acorn-node": "^1.8.2",
                "defined": "^1.0.0",
                "minimist": "^1.2.6"
            }

        },

        "devalue": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/devalue/-/devalue-3.1.2.tgz",
            "integrity": "sha512-wUXbMGPAsBx79UF14nsWSsJlC7RcwPlf2w3bGheODWxKx57e9n68ceoijbqCJCEbjyo0S79nqfPwQgyijwLaqw==",
            "dev": true
        },

        "didyoumean": {
            "version": "1.2.2",
            "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
            "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
            "dev": true
        },

        "dir-glob": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
            "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
            "dev": true,
            "requires": {
                "path-type": "^4.0.0"
            }

        },

        "dlv": {
            "version": "1.1.3",
            "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
            "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
            "dev": true
        },

        "doctrine": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
            "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
            "dev": true,
            "requires": {
                "esutils": "^2.0.2"
            }

        },

        "electron-to-chromium": {
            "version": "1.4.239",
            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.239.tgz",
            "integrity": "sha512-XbhfzxPIFzMjJm17T7yUGZEyYh5XuUjrA/FQ7JUy2bEd4qQ7MvFTaKpZ6zXZog1cfVttESo2Lx0ctnf7eQOaAQ==",
            "dev": true
        },

        "emoji-regex": {
            "version": "8.0.0",
            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
            "dev": true
        },

        "es6-promise": {
            "version": "3.3.1",
            "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
            "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==",
            "dev": true
        },

        "esbuild": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.7.tgz",
            "integrity": "sha512-7V8tzllIbAQV1M4QoE52ImKu8hT/NLGlGXkiDsbEU5PS6K8Mn09ZnYoS+dcmHxOS9CRsV4IRAMdT3I67IyUNXw==",
            "dev": true,
            "requires": {
                "@esbuild/linux-loong64": "0.15.7",
                "esbuild-android-64": "0.15.7",
                "esbuild-android-arm64": "0.15.7",
                "esbuild-darwin-64": "0.15.7",
                "esbuild-darwin-arm64": "0.15.7",
                "esbuild-freebsd-64": "0.15.7",
                "esbuild-freebsd-arm64": "0.15.7",
                "esbuild-linux-32": "0.15.7",
                "esbuild-linux-64": "0.15.7",
                "esbuild-linux-arm": "0.15.7",
                "esbuild-linux-arm64": "0.15.7",
                "esbuild-linux-mips64le": "0.15.7",
                "esbuild-linux-ppc64le": "0.15.7",
                "esbuild-linux-riscv64": "0.15.7",
                "esbuild-linux-s390x": "0.15.7",
                "esbuild-netbsd-64": "0.15.7",
                "esbuild-openbsd-64": "0.15.7",
                "esbuild-sunos-64": "0.15.7",
                "esbuild-windows-32": "0.15.7",
                "esbuild-windows-64": "0.15.7",
                "esbuild-windows-arm64": "0.15.7"
            }

        },

        "esbuild-android-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.7.tgz",
            "integrity": "sha512-p7rCvdsldhxQr3YHxptf1Jcd86dlhvc3EQmQJaZzzuAxefO9PvcI0GLOa5nCWem1AJ8iMRu9w0r5TG8pHmbi9w==",
            "dev": true,
            "optional": true
        },

        "esbuild-android-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.7.tgz",
            "integrity": "sha512-L775l9ynJT7rVqRM5vo+9w5g2ysbOCfsdLV4CWanTZ1k/9Jb3IYlQ06VCI1edhcosTYJRECQFJa3eAvkx72eyQ==",
            "dev": true,
            "optional": true
        },

        "esbuild-darwin-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.7.tgz",
            "integrity": "sha512-KGPt3r1c9ww009t2xLB6Vk0YyNOXh7hbjZ3EecHoVDxgtbUlYstMPDaReimKe6eOEfyY4hBEEeTvKwPsiH5WZg==",
            "dev": true,
            "optional": true
        },

        "esbuild-darwin-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.7.tgz",
            "integrity": "sha512-kBIHvtVqbSGajN88lYMnR3aIleH3ABZLLFLxwL2stiuIGAjGlQW741NxVTpUHQXUmPzxi6POqc9npkXa8AcSZQ==",
            "dev": true,
            "optional": true
        },

        "esbuild-freebsd-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.7.tgz",
            "integrity": "sha512-hESZB91qDLV5MEwNxzMxPfbjAhOmtfsr9Wnuci7pY6TtEh4UDuevmGmkUIjX/b+e/k4tcNBMf7SRQ2mdNuK/HQ==",
            "dev": true,
            "optional": true
        },

        "esbuild-freebsd-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.7.tgz",
            "integrity": "sha512-dLFR0ChH5t+b3J8w0fVKGvtwSLWCv7GYT2Y2jFGulF1L5HftQLzVGN+6pi1SivuiVSmTh28FwUhi9PwQicXI6Q==",
            "dev": true,
            "optional": true
        },

        "esbuild-linux-32": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.7.tgz",
            "integrity": "sha512-v3gT/LsONGUZcjbt2swrMjwxo32NJzk+7sAgtxhGx1+ZmOFaTRXBAi1PPfgpeo/J//Un2jIKm/I+qqeo4caJvg==",
            "dev": true,
            "optional": true
        },

        "esbuild-linux-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.7.tgz",
            "integrity": "sha512-LxXEfLAKwOVmm1yecpMmWERBshl+Kv5YJ/1KnyAr6HRHFW8cxOEsEfisD3sVl/RvHyW//lhYUVSuy9jGEfIRAQ==",
            "dev": true,
            "optional": true
        },

        "esbuild-linux-arm": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.7.tgz",
            "integrity": "sha512-JKgAHtMR5f75wJTeuNQbyznZZa+pjiUHV7sRZp42UNdyXC6TiUYMW/8z8yIBAr2Fpad8hM1royZKQisqPABPvQ==",
            "dev": true,
            "optional": true
        },

        "esbuild-linux-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.7.tgz",
            "integrity": "sha512-P3cfhudpzWDkglutWgXcT2S7Ft7o2e3YDMrP1n0z2dlbUZghUkKCyaWw0zhp4KxEEzt/E7lmrtRu/pGWnwb9vw==",
            "dev": true,
            "optional": true
        },

        "esbuild-linux-mips64le": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.7.tgz",
            "integrity": "sha512-T7XKuxl0VpeFLCJXub6U+iybiqh0kM/bWOTb4qcPyDDwNVhLUiPcGdG2/0S7F93czUZOKP57YiLV8YQewgLHKw==",
            "dev": true,
            "optional": true
        },

        "esbuild-linux-ppc64le": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.7.tgz",
            "integrity": "sha512-6mGuC19WpFN7NYbecMIJjeQgvDb5aMuvyk0PDYBJrqAEMkTwg3Z98kEKuCm6THHRnrgsdr7bp4SruSAxEM4eJw==",
            "dev": true,
            "optional": true
        },

        "esbuild-linux-riscv64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.7.tgz",
            "integrity": "sha512-uUJsezbswAYo/X7OU/P+PuL/EI9WzxsEQXDekfwpQ23uGiooxqoLFAPmXPcRAt941vjlY9jtITEEikWMBr+F/g==",
            "dev": true,
            "optional": true
        },

        "esbuild-linux-s390x": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.7.tgz",
            "integrity": "sha512-+tO+xOyTNMc34rXlSxK7aCwJgvQyffqEM5MMdNDEeMU3ss0S6wKvbBOQfgd5jRPblfwJ6b+bKiz0g5nABpY0QQ==",
            "dev": true,
            "optional": true
        },

        "esbuild-netbsd-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.7.tgz",
            "integrity": "sha512-yVc4Wz+Pu3cP5hzm5kIygNPrjar/v5WCSoRmIjCPWfBVJkZNb5brEGKUlf+0Y759D48BCWa0WHrWXaNy0DULTQ==",
            "dev": true,
            "optional": true
        },

        "esbuild-openbsd-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.7.tgz",
            "integrity": "sha512-GsimbwC4FSR4lN3wf8XmTQ+r8/0YSQo21rWDL0XFFhLHKlzEA4SsT1Tl8bPYu00IU6UWSJ+b3fG/8SB69rcuEQ==",
            "dev": true,
            "optional": true
        },

        "esbuild-sunos-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.7.tgz",
            "integrity": "sha512-8CDI1aL/ts0mDGbWzjEOGKXnU7p3rDzggHSBtVryQzkSOsjCHRVe0iFYUuhczlxU1R3LN/E7HgUO4NXzGGP/Ag==",
            "dev": true,
            "optional": true
        },

        "esbuild-windows-32": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.7.tgz",
            "integrity": "sha512-cOnKXUEPS8EGCzRSFa1x6NQjGhGsFlVgjhqGEbLTPsA7x4RRYiy2RKoArNUU4iR2vHmzqS5Gr84MEumO/wxYKA==",
            "dev": true,
            "optional": true
        },

        "esbuild-windows-64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.7.tgz",
            "integrity": "sha512-7MI08Ec2sTIDv+zH6StNBKO+2hGUYIT42GmFyW6MBBWWtJhTcQLinKS6ldIN1d52MXIbiJ6nXyCJ+LpL4jBm3Q==",
            "dev": true,
            "optional": true
        },

        "esbuild-windows-arm64": {
            "version": "0.15.7",
            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.7.tgz",
            "integrity": "sha512-R06nmqBlWjKHddhRJYlqDd3Fabx9LFdKcjoOy08YLimwmsswlFBJV4rXzZCxz/b7ZJXvrZgj8DDv1ewE9+StMw==",
            "dev": true,
            "optional": true
        },

        "escalade": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
            "dev": true
        },

        "escape-string-regexp": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
            "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
            "dev": true
        },

        "eslint": {
            "version": "8.23.0",
            "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz",
            "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==",
            "dev": true,
            "requires": {
                "@eslint/eslintrc": "^1.3.1",
                "@humanwhocodes/config-array": "^0.10.4",
                "@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
                "@humanwhocodes/module-importer": "^1.0.1",
                "ajv": "^6.10.0",
                "chalk": "^4.0.0",
                "cross-spawn": "^7.0.2",
                "debug": "^4.3.2",
                "doctrine": "^3.0.0",
                "escape-string-regexp": "^4.0.0",
                "eslint-scope": "^7.1.1",
                "eslint-utils": "^3.0.0",
                "eslint-visitor-keys": "^3.3.0",
                "espree": "^9.4.0",
                "esquery": "^1.4.0",
                "esutils": "^2.0.2",
                "fast-deep-equal": "^3.1.3",
                "file-entry-cache": "^6.0.1",
                "find-up": "^5.0.0",
                "functional-red-black-tree": "^1.0.1",
                "glob-parent": "^6.0.1",
                "globals": "^13.15.0",
                "globby": "^11.1.0",
                "grapheme-splitter": "^1.0.4",
                "ignore": "^5.2.0",
                "import-fresh": "^3.0.0",
                "imurmurhash": "^0.1.4",
                "is-glob": "^4.0.0",
                "js-yaml": "^4.1.0",
                "json-stable-stringify-without-jsonify": "^1.0.1",
                "levn": "^0.4.1",
                "lodash.merge": "^4.6.2",
                "minimatch": "^3.1.2",
                "natural-compare": "^1.4.0",
                "optionator": "^0.9.1",
                "regexpp": "^3.2.0",
                "strip-ansi": "^6.0.1",
                "strip-json-comments": "^3.1.0",
                "text-table": "^0.2.0"
            },

            "dependencies": {
                "eslint-scope": {
                    "version": "7.1.1",
                    "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
                    "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
                    "dev": true,
                    "requires": {
                        "esrecurse": "^4.3.0",
                        "estraverse": "^5.2.0"
                    }

                },

                "estraverse": {
                    "version": "5.3.0",
                    "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
                    "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
                    "dev": true
                }

            }

        },

        "eslint-config-prettier": {
            "version": "8.5.0",
            "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
            "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
            "dev": true,
            "requires": {}
        },

        "eslint-plugin-svelte3": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/eslint-plugin-svelte3/-/eslint-plugin-svelte3-4.0.0.tgz",
            "integrity": "sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==",
            "dev": true,
            "requires": {}
        },

        "eslint-scope": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
            "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
            "dev": true,
            "requires": {
                "esrecurse": "^4.3.0",
                "estraverse": "^4.1.1"
            }

        },

        "eslint-utils": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
            "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
            "dev": true,
            "requires": {
                "eslint-visitor-keys": "^2.0.0"
            },

            "dependencies": {
                "eslint-visitor-keys": {
                    "version": "2.1.0",
                    "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
                    "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
                    "dev": true
                }

            }

        },

        "eslint-visitor-keys": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
            "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
            "dev": true
        },

        "espree": {
            "version": "9.4.0",
            "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
            "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
            "dev": true,
            "requires": {
                "acorn": "^8.8.0",
                "acorn-jsx": "^5.3.2",
                "eslint-visitor-keys": "^3.3.0"
            }

        },

        "esquery": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
            "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
            "dev": true,
            "requires": {
                "estraverse": "^5.1.0"
            },

            "dependencies": {
                "estraverse": {
                    "version": "5.3.0",
                    "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
                    "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
                    "dev": true
                }

            }

        },

        "esrecurse": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
            "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
            "dev": true,
            "requires": {
                "estraverse": "^5.2.0"
            },

            "dependencies": {
                "estraverse": {
                    "version": "5.3.0",
                    "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
                    "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
                    "dev": true
                }

            }

        },

        "estraverse": {
            "version": "4.3.0",
            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
            "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
            "dev": true
        },

        "estree-walker": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
            "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
            "dev": true
        },

        "esutils": {
            "version": "2.0.3",
            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
            "dev": true
        },

        "fast-deep-equal": {
            "version": "3.1.3",
            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
            "dev": true
        },

        "fast-glob": {
            "version": "3.2.11",
            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
            "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
            "dev": true,
            "requires": {
                "@nodelib/fs.stat": "^2.0.2",
                "@nodelib/fs.walk": "^1.2.3",
                "glob-parent": "^5.1.2",
                "merge2": "^1.3.0",
                "micromatch": "^4.0.4"
            },

            "dependencies": {
                "glob-parent": {
                    "version": "5.1.2",
                    "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
                    "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
                    "dev": true,
                    "requires": {
                        "is-glob": "^4.0.1"
                    }

                }

            }

        },

        "fast-json-stable-stringify": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
            "dev": true
        },

        "fast-levenshtein": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
            "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
            "dev": true
        },

        "fastq": {
            "version": "1.13.0",
            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
            "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
            "dev": true,
            "requires": {
                "reusify": "^1.0.4"
            }

        },

        "feather-icons": {
            "version": "4.29.0",
            "resolved": "https://registry.npmjs.org/feather-icons/-/feather-icons-4.29.0.tgz",
            "integrity": "sha512-Y7VqN9FYb8KdaSF0qD1081HCkm0v4Eq/fpfQYQnubpqi0hXx14k+gF9iqtRys1SIcTEi97xDi/fmsPFZ8xo0GQ==",
            "dev": true,
            "requires": {
                "classnames": "^2.2.5",
                "core-js": "^3.1.3"
            }

        },

        "fetch-blob": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
            "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
            "dev": true,
            "requires": {
                "node-domexception": "^1.0.0",
                "web-streams-polyfill": "^3.0.3"
            }

        },

        "file-entry-cache": {
            "version": "6.0.1",
            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
            "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
            "dev": true,
            "requires": {
                "flat-cache": "^3.0.4"
            }

        },

        "file-uri-to-path": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
            "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
            "dev": true
        },

        "fill-range": {
            "version": "7.0.1",
            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
            "dev": true,
            "requires": {
                "to-regex-range": "^5.0.1"
            }

        },

        "find-up": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
            "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
            "dev": true,
            "requires": {
                "locate-path": "^6.0.0",
                "path-exists": "^4.0.0"
            }

        },

        "flat-cache": {
            "version": "3.0.4",
            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
            "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
            "dev": true,
            "requires": {
                "flatted": "^3.1.0",
                "rimraf": "^3.0.2"
            }

        },

        "flatted": {
            "version": "3.2.7",
            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
            "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
            "dev": true
        },

        "formdata-polyfill": {
            "version": "4.0.10",
            "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
            "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
            "dev": true,
            "requires": {
                "fetch-blob": "^3.1.2"
            }

        },

        "fraction.js": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
            "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
            "dev": true
        },

        "fs-minipass": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
            "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
            "dev": true,
            "requires": {
                "minipass": "^3.0.0"
            }

        },

        "fs.realpath": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
            "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
            "dev": true
        },

        "fsevents": {
            "version": "2.3.2",
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
            "dev": true,
            "optional": true
        },

        "function-bind": {
            "version": "1.1.1",
            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
            "dev": true
        },

        "functional-red-black-tree": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
            "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
            "dev": true
        },

        "gauge": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
            "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
            "dev": true,
            "requires": {
                "aproba": "^1.0.3 || ^2.0.0",
                "color-support": "^1.1.2",
                "console-control-strings": "^1.0.0",
                "has-unicode": "^2.0.1",
                "object-assign": "^4.1.1",
                "signal-exit": "^3.0.0",
                "string-width": "^4.2.3",
                "strip-ansi": "^6.0.1",
                "wide-align": "^1.1.2"
            }

        },

        "glob": {
            "version": "7.2.3",
            "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
            "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
            "dev": true,
            "requires": {
                "fs.realpath": "^1.0.0",
                "inflight": "^1.0.4",
                "inherits": "2",
                "minimatch": "^3.1.1",
                "once": "^1.3.0",
                "path-is-absolute": "^1.0.0"
            }

        },

        "glob-parent": {
            "version": "6.0.2",
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
            "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
            "dev": true,
            "requires": {
                "is-glob": "^4.0.3"
            }

        },

        "globals": {
            "version": "13.17.0",
            "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
            "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
            "dev": true,
            "requires": {
                "type-fest": "^0.20.2"
            }

        },

        "globalyzer": {
            "version": "0.1.0",
            "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
            "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
            "dev": true
        },

        "globby": {
            "version": "11.1.0",
            "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
            "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
            "dev": true,
            "requires": {
                "array-union": "^2.1.0",
                "dir-glob": "^3.0.1",
                "fast-glob": "^3.2.9",
                "ignore": "^5.2.0",
                "merge2": "^1.4.1",
                "slash": "^3.0.0"
            }

        },

        "globrex": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
            "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
            "dev": true
        },

        "graceful-fs": {
            "version": "4.2.10",
            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
            "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
            "dev": true
        },

        "grapheme-splitter": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
            "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
            "dev": true
        },

        "has": {
            "version": "1.0.3",
            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
            "dev": true,
            "requires": {
                "function-bind": "^1.1.1"
            }

        },

        "has-flag": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
            "dev": true
        },

        "has-unicode": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
            "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
            "dev": true
        },

        "https-proxy-agent": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
            "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
            "dev": true,
            "requires": {
                "agent-base": "6",
                "debug": "4"
            }

        },

        "ignore": {
            "version": "5.2.0",
            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
            "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
            "dev": true
        },

        "import-fresh": {
            "version": "3.3.0",
            "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
            "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
            "dev": true,
            "requires": {
                "parent-module": "^1.0.0",
                "resolve-from": "^4.0.0"
            },

            "dependencies": {
                "resolve-from": {
                    "version": "4.0.0",
                    "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
                    "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
                    "dev": true
                }

            }

        },

        "imurmurhash": {
            "version": "0.1.4",
            "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
            "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
            "dev": true
        },

        "inflight": {
            "version": "1.0.6",
            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
            "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
            "dev": true,
            "requires": {
                "once": "^1.3.0",
                "wrappy": "1"
            }

        },

        "inherits": {
            "version": "2.0.4",
            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
            "dev": true
        },

        "is-binary-path": {
            "version": "2.1.0",
            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
            "dev": true,
            "requires": {
                "binary-extensions": "^2.0.0"
            }

        },

        "is-core-module": {
            "version": "2.10.0",
            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
            "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
            "dev": true,
            "requires": {
                "has": "^1.0.3"
            }

        },

        "is-extglob": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
            "dev": true
        },

        "is-fullwidth-code-point": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
            "dev": true
        },

        "is-glob": {
            "version": "4.0.3",
            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
            "dev": true,
            "requires": {
                "is-extglob": "^2.1.1"
            }

        },

        "is-number": {
            "version": "7.0.0",
            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
            "dev": true
        },

        "isexe": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
            "dev": true
        },

        "js-yaml": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
            "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
            "dev": true,
            "requires": {
                "argparse": "^2.0.1"
            }

        },

        "json-schema-traverse": {
            "version": "0.4.1",
            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
            "dev": true
        },

        "json-stable-stringify-without-jsonify": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
            "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
            "dev": true
        },

        "kleur": {
            "version": "4.1.5",
            "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
            "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
            "dev": true
        },

        "levn": {
            "version": "0.4.1",
            "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
            "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
            "dev": true,
            "requires": {
                "prelude-ls": "^1.2.1",
                "type-check": "~0.4.0"
            }

        },

        "lilconfig": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
            "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==",
            "dev": true
        },

        "locate-path": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
            "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
            "dev": true,
            "requires": {
                "p-locate": "^5.0.0"
            }

        },

        "lodash": {
            "version": "4.17.21",
            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
        },

        "lodash.castarray": {
            "version": "4.4.0",
            "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
            "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
            "dev": true
        },

        "lodash.isplainobject": {
            "version": "4.0.6",
            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
            "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
            "dev": true
        },

        "lodash.merge": {
            "version": "4.6.2",
            "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
            "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
            "dev": true
        },

        "lru-cache": {
            "version": "6.0.0",
            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
            "dev": true,
            "requires": {
                "yallist": "^4.0.0"
            }

        },

        "luxon": {
            "version": "3.0.3",
            "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.0.3.tgz",
            "integrity": "sha512-+EfHWnF+UT7GgTnq5zXg3ldnTKL2zdv7QJgsU5bjjpbH17E3qi/puMhQyJVYuCq+FRkogvB5WB6iVvUr+E4a7w==",
            "dev": true
        },

        "magic-string": {
            "version": "0.26.3",
            "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz",
            "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==",
            "dev": true,
            "requires": {
                "sourcemap-codec": "^1.4.8"
            }

        },

        "make-dir": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
            "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
            "dev": true,
            "requires": {
                "semver": "^6.0.0"
            },

            "dependencies": {
                "semver": {
                    "version": "6.3.0",
                    "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
                    "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
                    "dev": true
                }

            }

        },

        "marked": {
            "version": "4.1.0",
            "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz",
            "integrity": "sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA=="
        },

        "merge2": {
            "version": "1.4.1",
            "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
            "dev": true
        },

        "micromatch": {
            "version": "4.0.5",
            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
            "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
            "dev": true,
            "requires": {
                "braces": "^3.0.2",
                "picomatch": "^2.3.1"
            }

        },

        "mime": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
            "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
            "dev": true
        },

        "min-indent": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
            "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
            "dev": true
        },

        "mini-svg-data-uri": {
            "version": "1.4.4",
            "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
            "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
            "dev": true
        },

        "minimatch": {
            "version": "3.1.2",
            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
            "dev": true,
            "requires": {
                "brace-expansion": "^1.1.7"
            }

        },

        "minimist": {
            "version": "1.2.6",
            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
            "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
            "dev": true
        },

        "minipass": {
            "version": "3.3.4",
            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz",
            "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==",
            "dev": true,
            "requires": {
                "yallist": "^4.0.0"
            }

        },

        "minizlib": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
            "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
            "dev": true,
            "requires": {
                "minipass": "^3.0.0",
                "yallist": "^4.0.0"
            }

        },

        "mkdirp": {
            "version": "0.5.6",
            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
            "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
            "dev": true,
            "requires": {
                "minimist": "^1.2.6"
            }

        },

        "mri": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
            "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
            "dev": true
        },

        "mrmime": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
            "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
            "dev": true
        },

        "ms": {
            "version": "2.1.2",
            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
            "dev": true
        },

        "nanoid": {
            "version": "3.3.4",
            "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
            "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
            "dev": true
        },

        "natural-compare": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
            "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
            "dev": true
        },

        "node-domexception": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
            "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
            "dev": true
        },

        "node-fetch": {
            "version": "3.2.10",
            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz",
            "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==",
            "dev": true,
            "requires": {
                "data-uri-to-buffer": "^4.0.0",
                "fetch-blob": "^3.1.4",
                "formdata-polyfill": "^4.0.10"
            }

        },

        "node-gyp-build": {
            "version": "4.5.0",
            "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz",
            "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==",
            "dev": true
        },

        "node-releases": {
            "version": "2.0.6",
            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
            "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
            "dev": true
        },

        "nopt": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
            "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
            "dev": true,
            "requires": {
                "abbrev": "1"
            }

        },

        "normalize-path": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
            "dev": true
        },

        "normalize-range": {
            "version": "0.1.2",
            "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
            "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
            "dev": true
        },

        "npmlog": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
            "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
            "dev": true,
            "requires": {
                "are-we-there-yet": "^2.0.0",
                "console-control-strings": "^1.1.0",
                "gauge": "^3.0.0",
                "set-blocking": "^2.0.0"
            }

        },

        "object-assign": {
            "version": "4.1.1",
            "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
            "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
            "dev": true
        },

        "object-hash": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
            "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
            "dev": true
        },

        "once": {
            "version": "1.4.0",
            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
            "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
            "dev": true,
            "requires": {
                "wrappy": "1"
            }

        },

        "optionator": {
            "version": "0.9.1",
            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
            "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
            "dev": true,
            "requires": {
                "deep-is": "^0.1.3",
                "fast-levenshtein": "^2.0.6",
                "levn": "^0.4.1",
                "prelude-ls": "^1.2.1",
                "type-check": "^0.4.0",
                "word-wrap": "^1.2.3"
            }

        },

        "p-limit": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
            "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
            "dev": true,
            "requires": {
                "yocto-queue": "^0.1.0"
            }

        },

        "p-locate": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
            "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
            "dev": true,
            "requires": {
                "p-limit": "^3.0.2"
            }

        },

        "parent-module": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
            "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
            "dev": true,
            "requires": {
                "callsites": "^3.0.0"
            }

        },

        "path-exists": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
            "dev": true
        },

        "path-is-absolute": {
            "version": "1.0.1",
            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
            "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
            "dev": true
        },

        "path-key": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
            "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
            "dev": true
        },

        "path-parse": {
            "version": "1.0.7",
            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
            "dev": true
        },

        "path-type": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
            "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
            "dev": true
        },

        "picocolors": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
            "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
            "dev": true
        },

        "picomatch": {
            "version": "2.3.1",
            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
            "dev": true
        },

        "pify": {
            "version": "2.3.0",
            "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
            "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
            "dev": true
        },

        "playwright-core": {
            "version": "1.25.1",
            "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.25.1.tgz",
            "integrity": "sha512-lSvPCmA2n7LawD2Hw7gSCLScZ+vYRkhU8xH0AapMyzwN+ojoDqhkH/KIEUxwNu2PjPoE/fcE0wLAksdOhJ2O5g==",
            "dev": true
        },

        "postcss": {
            "version": "8.4.16",
            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
            "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
            "dev": true,
            "requires": {
                "nanoid": "^3.3.4",
                "picocolors": "^1.0.0",
                "source-map-js": "^1.0.2"
            }

        },

        "postcss-import": {
            "version": "14.1.0",
            "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
            "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
            "dev": true,
            "requires": {
                "postcss-value-parser": "^4.0.0",
                "read-cache": "^1.0.0",
                "resolve": "^1.1.7"
            }

        },

        "postcss-js": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
            "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
            "dev": true,
            "requires": {
                "camelcase-css": "^2.0.1"
            }

        },

        "postcss-load-config": {
            "version": "3.1.4",
            "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
            "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
            "dev": true,
            "requires": {
                "lilconfig": "^2.0.5",
                "yaml": "^1.10.2"
            }

        },

        "postcss-nested": {
            "version": "5.0.6",
            "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
            "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
            "dev": true,
            "requires": {
                "postcss-selector-parser": "^6.0.6"
            }

        },

        "postcss-selector-parser": {
            "version": "6.0.10",
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
            "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
            "dev": true,
            "requires": {
                "cssesc": "^3.0.0",
                "util-deprecate": "^1.0.2"
            }

        },

        "postcss-value-parser": {
            "version": "4.2.0",
            "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
            "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
            "dev": true
        },

        "prelude-ls": {
            "version": "1.2.1",
            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
            "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
            "dev": true
        },

        "prettier": {
            "version": "2.7.1",
            "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
            "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
            "dev": true
        },

        "prettier-plugin-svelte": {
            "version": "2.7.0",
            "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.7.0.tgz",
            "integrity": "sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==",
            "dev": true,
            "requires": {}
        },

        "punycode": {
            "version": "2.1.1",
            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
            "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
            "dev": true
        },

        "queue-microtask": {
            "version": "1.2.3",
            "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
            "dev": true
        },

        "quick-lru": {
            "version": "5.1.1",
            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
            "dev": true
        },

        "read-cache": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
            "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
            "dev": true,
            "requires": {
                "pify": "^2.3.0"
            }

        },

        "readable-stream": {
            "version": "3.6.0",
            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
            "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
            "dev": true,
            "requires": {
                "inherits": "^2.0.3",
                "string_decoder": "^1.1.1",
                "util-deprecate": "^1.0.1"
            }

        },

        "readdirp": {
            "version": "3.6.0",
            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
            "dev": true,
            "requires": {
                "picomatch": "^2.2.1"
            }

        },

        "regexparam": {
            "version": "2.0.1",
            "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.1.tgz",
            "integrity": "sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==",
            "dev": true
        },

        "regexpp": {
            "version": "3.2.0",
            "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
            "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
            "dev": true
        },

        "resolve": {
            "version": "1.22.1",
            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
            "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
            "dev": true,
            "requires": {
                "is-core-module": "^2.9.0",
                "path-parse": "^1.0.7",
                "supports-preserve-symlinks-flag": "^1.0.0"
            }

        },

        "resolve-from": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
            "dev": true
        },

        "reusify": {
            "version": "1.0.4",
            "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
            "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
            "dev": true
        },

        "rimraf": {
            "version": "3.0.2",
            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
            "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
            "dev": true,
            "requires": {
                "glob": "^7.1.3"
            }

        },

        "rollup": {
            "version": "2.78.1",
            "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz",
            "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==",
            "dev": true,
            "requires": {
                "fsevents": "~2.3.2"
            }

        },

        "rollup-pluginutils": {
            "version": "2.8.2",
            "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
            "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
            "dev": true,
            "requires": {
                "estree-walker": "^0.6.1"
            },

            "dependencies": {
                "estree-walker": {
                    "version": "0.6.1",
                    "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
                    "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
                    "dev": true
                }

            }

        },

        "run-parallel": {
            "version": "1.2.0",
            "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
            "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
            "dev": true,
            "requires": {
                "queue-microtask": "^1.2.2"
            }

        },

        "sade": {
            "version": "1.8.1",
            "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
            "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
            "dev": true,
            "requires": {
                "mri": "^1.1.0"
            }

        },

        "safe-buffer": {
            "version": "5.2.1",
            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
            "dev": true
        },

        "sander": {
            "version": "0.5.1",
            "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz",
            "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==",
            "dev": true,
            "requires": {
                "es6-promise": "^3.1.2",
                "graceful-fs": "^4.1.3",
                "mkdirp": "^0.5.1",
                "rimraf": "^2.5.2"
            },

            "dependencies": {
                "rimraf": {
                    "version": "2.7.1",
                    "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
                    "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
                    "dev": true,
                    "requires": {
                        "glob": "^7.1.3"
                    }

                }

            }

        },

        "semver": {
            "version": "7.3.7",
            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
            "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
            "dev": true,
            "requires": {
                "lru-cache": "^6.0.0"
            }

        },

        "set-blocking": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
            "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
            "dev": true
        },

        "set-cookie-parser": {
            "version": "2.5.1",
            "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz",
            "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==",
            "dev": true
        },

        "shebang-command": {
            "version": "2.0.0",
            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
            "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
            "dev": true,
            "requires": {
                "shebang-regex": "^3.0.0"
            }

        },

        "shebang-regex": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
            "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
            "dev": true
        },

        "signal-exit": {
            "version": "3.0.7",
            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
            "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
            "dev": true
        },

        "sirv": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz",
            "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==",
            "dev": true,
            "requires": {
                "@polka/url": "^1.0.0-next.20",
                "mrmime": "^1.0.0",
                "totalist": "^3.0.0"
            }

        },

        "slash": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
            "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
            "dev": true
        },

        "sorcery": {
            "version": "0.10.0",
            "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz",
            "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==",
            "dev": true,
            "requires": {
                "buffer-crc32": "^0.2.5",
                "minimist": "^1.2.0",
                "sander": "^0.5.0",
                "sourcemap-codec": "^1.3.0"
            }

        },

        "source-map-js": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
            "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
            "dev": true
        },

        "sourcemap-codec": {
            "version": "1.4.8",
            "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
            "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
            "dev": true
        },

        "string_decoder": {
            "version": "1.3.0",
            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
            "dev": true,
            "requires": {
                "safe-buffer": "~5.2.0"
            }

        },

        "string-width": {
            "version": "4.2.3",
            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
            "dev": true,
            "requires": {
                "emoji-regex": "^8.0.0",
                "is-fullwidth-code-point": "^3.0.0",
                "strip-ansi": "^6.0.1"
            }

        },

        "strip-ansi": {
            "version": "6.0.1",
            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
            "dev": true,
            "requires": {
                "ansi-regex": "^5.0.1"
            }

        },

        "strip-indent": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
            "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
            "dev": true,
            "requires": {
                "min-indent": "^1.0.0"
            }

        },

        "strip-json-comments": {
            "version": "3.1.1",
            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
            "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
            "dev": true
        },

        "supports-color": {
            "version": "7.2.0",
            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
            "dev": true,
            "requires": {
                "has-flag": "^4.0.0"
            }

        },

        "supports-preserve-symlinks-flag": {
            "version": "1.0.0",
            "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
            "dev": true
        },

        "svelte": {
            "version": "3.49.0",
            "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz",
            "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA=="
        },

        "svelte-check": {
            "version": "2.9.0",
            "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.9.0.tgz",
            "integrity": "sha512-9AVrtP7WbfDgCdqTZNPdj5CCCy1OrYMxFVWAWzNw7fl93c9klFJFtqzVXa6fovfQ050CcpUyJE2dPFL9TFAREw==",
            "dev": true,
            "requires": {
                "@jridgewell/trace-mapping": "^0.3.9",
                "chokidar": "^3.4.1",
                "fast-glob": "^3.2.7",
                "import-fresh": "^3.2.1",
                "picocolors": "^1.0.0",
                "sade": "^1.7.4",
                "svelte-preprocess": "^4.0.0",
                "typescript": "*"
            }

        },

        "svelte-hmr": {
            "version": "0.14.12",
            "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz",
            "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==",
            "dev": true,
            "requires": {}
        },

        "svelte-markdown": {
            "version": "0.2.3",
            "resolved": "https://registry.npmjs.org/svelte-markdown/-/svelte-markdown-0.2.3.tgz",
            "integrity": "sha512-2h680NzTXnAD0CXhxe3GeHl6W+ayG4iKQRl+BIDRw+R0mUE0OiNxP1Vt8Rn+aWevB/LBiBIPCAwvL+0BkG057A==",
            "requires": {
                "@types/marked": "^4.0.1",
                "marked": "^4.0.10"
            }

        },

        "svelte-preprocess": {
            "version": "4.10.7",
            "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz",
            "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==",
            "dev": true,
            "requires": {
                "@types/pug": "^2.0.4",
                "@types/sass": "^1.16.0",
                "detect-indent": "^6.0.0",
                "magic-string": "^0.25.7",
                "sorcery": "^0.10.0",
                "strip-indent": "^3.0.0"
            },

            "dependencies": {
                "magic-string": {
                    "version": "0.25.9",
                    "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
                    "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
                    "dev": true,
                    "requires": {
                        "sourcemap-codec": "^1.4.8"
                    }

                }

            }

        },

        "tailwindcss": {
            "version": "3.1.8",
            "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz",
            "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==",
            "dev": true,
            "requires": {
                "arg": "^5.0.2",
                "chokidar": "^3.5.3",
                "color-name": "^1.1.4",
                "detective": "^5.2.1",
                "didyoumean": "^1.2.2",
                "dlv": "^1.1.3",
                "fast-glob": "^3.2.11",
                "glob-parent": "^6.0.2",
                "is-glob": "^4.0.3",
                "lilconfig": "^2.0.6",
                "normalize-path": "^3.0.0",
                "object-hash": "^3.0.0",
                "picocolors": "^1.0.0",
                "postcss": "^8.4.14",
                "postcss-import": "^14.1.0",
                "postcss-js": "^4.0.0",
                "postcss-load-config": "^3.1.4",
                "postcss-nested": "5.0.6",
                "postcss-selector-parser": "^6.0.10",
                "postcss-value-parser": "^4.2.0",
                "quick-lru": "^5.1.1",
                "resolve": "^1.22.1"
            }

        },

        "tar": {
            "version": "6.1.11",
            "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
            "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
            "dev": true,
            "requires": {
                "chownr": "^2.0.0",
                "fs-minipass": "^2.0.0",
                "minipass": "^3.0.0",
                "minizlib": "^2.1.1",
                "mkdirp": "^1.0.3",
                "yallist": "^4.0.0"
            },

            "dependencies": {
                "mkdirp": {
                    "version": "1.0.4",
                    "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
                    "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
                    "dev": true
                }

            }

        },

        "text-table": {
            "version": "0.2.0",
            "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
            "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
            "dev": true
        },

        "tiny-glob": {
            "version": "0.2.9",
            "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
            "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
            "dev": true,
            "requires": {
                "globalyzer": "0.1.0",
                "globrex": "^0.1.2"
            }

        },

        "to-regex-range": {
            "version": "5.0.1",
            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
            "dev": true,
            "requires": {
                "is-number": "^7.0.0"
            }

        },

        "totalist": {
            "version": "3.0.0",
            "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz",
            "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==",
            "dev": true
        },

        "tr46": {
            "version": "0.0.3",
            "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
            "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
            "dev": true
        },

        "tslib": {
            "version": "2.4.0",
            "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
            "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
            "dev": true
        },

        "tsutils": {
            "version": "3.21.0",
            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
            "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
            "dev": true,
            "requires": {
                "tslib": "^1.8.1"
            },

            "dependencies": {
                "tslib": {
                    "version": "1.14.1",
                    "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
                    "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
                    "dev": true
                }

            }

        },

        "type-check": {
            "version": "0.4.0",
            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
            "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
            "dev": true,
            "requires": {
                "prelude-ls": "^1.2.1"
            }

        },

        "type-fest": {
            "version": "0.20.2",
            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
            "dev": true
        },

        "typescript": {
            "version": "4.8.2",
            "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz",
            "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==",
            "dev": true
        },

        "undici": {
            "version": "5.10.0",
            "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz",
            "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==",
            "dev": true
        },

        "update-browserslist-db": {
            "version": "1.0.5",
            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz",
            "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==",
            "dev": true,
            "requires": {
                "escalade": "^3.1.1",
                "picocolors": "^1.0.0"
            }

        },

        "uri-js": {
            "version": "4.4.1",
            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
            "dev": true,
            "requires": {
                "punycode": "^2.1.0"
            }

        },

        "util-deprecate": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
            "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
            "dev": true
        },

        "vite": {
            "version": "3.1.0",
            "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.0.tgz",
            "integrity": "sha512-YBg3dUicDpDWFCGttmvMbVyS9ydjntwEjwXRj2KBFwSB8SxmGcudo1yb8FW5+M/G86aS8x828ujnzUVdsLjs9g==",
            "dev": true,
            "requires": {
                "esbuild": "^0.15.6",
                "fsevents": "~2.3.2",
                "postcss": "^8.4.16",
                "resolve": "^1.22.1",
                "rollup": "~2.78.0"
            }

        },

        "web-streams-polyfill": {
            "version": "3.2.1",
            "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
            "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
            "dev": true
        },

        "webidl-conversions": {
            "version": "3.0.1",
            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
            "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
            "dev": true
        },

        "whatwg-url": {
            "version": "5.0.0",
            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
            "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
            "dev": true,
            "requires": {
                "tr46": "~0.0.3",
                "webidl-conversions": "^3.0.0"
            }

        },

        "which": {
            "version": "2.0.2",
            "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
            "dev": true,
            "requires": {
                "isexe": "^2.0.0"
            }

        },

        "wide-align": {
            "version": "1.1.5",
            "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
            "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
            "dev": true,
            "requires": {
                "string-width": "^1.0.2 || 2 || 3 || 4"
            }

        },

        "word-wrap": {
            "version": "1.2.3",
            "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
            "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
            "dev": true
        },

        "worktop": {
            "version": "0.8.0-next.14",
            "resolved": "https://registry.npmjs.org/worktop/-/worktop-0.8.0-next.14.tgz",
            "integrity": "sha512-RZgqHu1w/JcUdWOE/BUEAzarrUUHh39eWkLdX8XpA6MfgLJF6X5Vl26CV7/wcm4O/UpZvHMGJUtB9eYTqDjc9g==",
            "dev": true,
            "requires": {
                "mrmime": "^1.0.0",
                "regexparam": "^2.0.0"
            }

        },

        "wrappy": {
            "version": "1.0.2",
            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
            "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
            "dev": true
        },

        "xtend": {
            "version": "4.0.2",
            "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
            "dev": true
        },

        "yallist": {
            "version": "4.0.0",
            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
            "dev": true
        },

        "yaml": {
            "version": "1.10.2",
            "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
            "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
            "dev": true
        },

        "yocto-queue": {
            "version": "0.1.0",
            "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
            "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
            "dev": true
        }

    }

}

diff --git a/chartered-frontend/package.json b/chartered-frontend/package.json
index 6852d95..002092f 100644
--- a/chartered-frontend/package.json
+++ a/chartered-frontend/package.json
@@ -1,48 +1,48 @@
{
  "name": "chartered-frontend",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "parcel index.html --open",
    "build": "parcel build index.html",
    "fmt": "prettier --write ."
  },

  "keywords": [],
  "author": "",
  "license": "0BSD",
  "devDependencies": {
    "@parcel/reporter-bundle-analyzer": "^2.0.0",
    "@parcel/transformer-sass": "^2.0.0",
    "@parcel/validator-typescript": "^2.0.0",
    "@types/react": "^17.0.20",
    "@types/react-dom": "^17.0.9",
    "@types/react-syntax-highlighter": "^13.5.2",
    "parcel": "^2.0.0",
    "prettier": "2.4.1",
    "sass": "^1.39.2",
    "serve": "^13.0.2",
    "typescript": "^4.4.2"
  },

  "dependencies": {
    "@fortawesome/fontawesome-svg-core": "^1.2.36",
    "@fortawesome/free-brands-svg-icons": "^5.15.4",
    "@fortawesome/free-solid-svg-icons": "^5.15.4",
    "@fortawesome/react-fontawesome": "^0.1.15",
    "@types/node": "^16.10.1",
    "@types/react-router-dom": "^5.3.1",
    "bootstrap": "^5.1.1",
    "react": "^17.0.2",
    "react-bootstrap": "^2.0.0-beta.6",
    "react-bootstrap-icons": "^1.5.0",
    "react-bootstrap-typeahead": "^5.2.1",
    "react-dom": "^17.0.2",
    "react-human-time": "^1.2.0",
    "react-markdown": "^7.0.1",
    "react-placeholder": "^4.1.0",
    "react-router-dom": "^6.0.0",
    "react-syntax-highlighter": "^15.4.4",
    "remark-gfm": "^3.0.1",
    "source-code-pro": "^2.38.0"
  }

    "name": "chartered-frontend-svelte",
    "version": "0.0.1",
    "private": true,
    "scripts": {
        "dev": "vite dev",
        "build": "vite build",
        "preview": "vite preview",
        "test": "playwright test",
        "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
        "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
        "lint": "prettier --check . && eslint .",
        "format": "prettier --write ."
    },

    "devDependencies": {
        "@playwright/test": "^1.25.0",
        "@sveltejs/kit": "next",
        "@sveltejs/adapter-node": "^1.0.0-next.88",
        "@tailwindcss/forms": "^0.5.3",
        "@tailwindcss/typography": "^0.5.7",
        "@types/feather-icons": "^4.7.0",
        "@types/lodash": "^4.14.184",
        "@types/luxon": "^3.0.1",
        "@typescript-eslint/eslint-plugin": "^5.27.0",
        "@typescript-eslint/parser": "^5.27.0",
        "autoprefixer": "^10.4.8",
        "eslint": "^8.16.0",
        "eslint-config-prettier": "^8.3.0",
        "eslint-plugin-svelte3": "^4.0.0",
        "feather-icons": "^4.29.0",
        "luxon": "^3.0.3",
        "postcss": "^8.4.16",
        "prettier": "^2.6.2",
        "prettier-plugin-svelte": "^2.7.0",
        "svelte": "^3.44.0",
        "svelte-check": "^2.7.1",
        "svelte-preprocess": "^4.10.6",
        "tailwindcss": "^3.1.8",
        "tslib": "^2.3.1",
        "typescript": "^4.7.4",
        "vite": "^3.1.0-beta.1"
    },

    "type": "module",
    "dependencies": {
        "lodash": "^4.17.21",
        "svelte-markdown": "^0.2.3"
    }

}

diff --git a/chartered-frontend/playwright.config.ts b/chartered-frontend/playwright.config.ts
new file mode 100644
index 0000000..9f92824 100644
--- /dev/null
+++ a/chartered-frontend/playwright.config.ts
@@ -1,0 +1,10 @@
import type { PlaywrightTestConfig } from '@playwright/test';

const config: PlaywrightTestConfig = {
    webServer: {
        command: 'npm run build && npm run preview',
        port: 4173,
    },
};

export default config;
diff --git a/chartered-frontend/postcss.config.cjs b/chartered-frontend/postcss.config.cjs
new file mode 100644
index 0000000..67cdf1a 100644
--- /dev/null
+++ a/chartered-frontend/postcss.config.cjs
@@ -1,0 +1,6 @@
module.exports = {
    plugins: {
        tailwindcss: {},
        autoprefixer: {},
    },
};
diff --git a/chartered-frontend/svelte.config.js b/chartered-frontend/svelte.config.js
new file mode 100644
index 0000000..47b6ebc 100644
--- /dev/null
+++ a/chartered-frontend/svelte.config.js
@@ -1,0 +1,20 @@
import adapter from '@sveltejs/adapter-node';
import preprocess from 'svelte-preprocess';

/** @type {import('@sveltejs/kit').Config} */
const config = {
    // Consult https://github.com/sveltejs/svelte-preprocess
    // for more information about preprocessors
    preprocess: preprocess({
        postcss: true,
    }),

    kit: {
        adapter: adapter(),
        prerender: {
            enabled: false,
        },
    },
};

export default config;
diff --git a/chartered-frontend/tailwind.config.cjs b/chartered-frontend/tailwind.config.cjs
new file mode 100644
index 0000000..e20d8e0 100644
--- /dev/null
+++ a/chartered-frontend/tailwind.config.cjs
@@ -1,0 +1,20 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
    darkMode: 'media',
    content: ['./src/**/*.{html,js,svelte,ts}'],
    theme: {
        screens: {
            sm: '640px',
            md: '800px',
            lg: '1024px',
            xl: '1280px',
            '2xl': '1536px',
        },
        extend: {
            gridTemplateColumns: {
                'sides-extend': 'minmax(20px, 1fr) auto minmax(20px, 1fr)',
            },
        },
    },
    plugins: [require('@tailwindcss/forms'), require('@tailwindcss/typography')],
};
diff --git a/chartered-frontend/tsconfig.json b/chartered-frontend/tsconfig.json
index 1d6875e..70401cc 100644
--- a/chartered-frontend/tsconfig.json
+++ a/chartered-frontend/tsconfig.json
@@ -1,8 +1,17 @@
{
  "compilerOptions": {
    "jsx": "react-jsx",
    "allowSyntheticDefaultImports": true,
    "strict": true
  },

  "lib": ["ES2021"]
    "extends": "./.svelte-kit/tsconfig.json",
    "compilerOptions": {
        "allowJs": true,
        "checkJs": true,
        "esModuleInterop": true,
        "forceConsistentCasingInFileNames": true,
        "resolveJsonModule": true,
        "skipLibCheck": true,
        "sourceMap": true,
        "strict": true
    }

    // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias

    //

    // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
    // from the referenced tsconfig.json - TypeScript does not merge them in

}

diff --git a/chartered-frontend/vite.config.ts b/chartered-frontend/vite.config.ts
new file mode 100644
index 0000000..f75ddb8 100644
--- /dev/null
+++ a/chartered-frontend/vite.config.ts
@@ -1,0 +1,8 @@
import { sveltekit } from '@sveltejs/kit/vite';
import type { UserConfig } from 'vite';

const config: UserConfig = {
    plugins: [sveltekit()],
};

export default config;
diff --git a/chartered-frontend/yarn.lock b/chartered-frontend/yarn.lock
deleted file mode 100644
index caf73e2..0000000 100644
--- a/chartered-frontend/yarn.lock
+++ /dev/null
@@ -1,6207 +1,0 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431"
  integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==
  dependencies:
    "@babel/highlight" "^7.16.0"

"@babel/compat-data@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa"
  integrity sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==

"@babel/core@^7.12.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4"
  integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==
  dependencies:
    "@babel/code-frame" "^7.16.0"
    "@babel/generator" "^7.16.0"
    "@babel/helper-compilation-targets" "^7.16.0"
    "@babel/helper-module-transforms" "^7.16.0"
    "@babel/helpers" "^7.16.0"
    "@babel/parser" "^7.16.0"
    "@babel/template" "^7.16.0"
    "@babel/traverse" "^7.16.0"
    "@babel/types" "^7.16.0"
    convert-source-map "^1.7.0"
    debug "^4.1.0"
    gensync "^1.0.0-beta.2"
    json5 "^2.1.2"
    semver "^6.3.0"
    source-map "^0.5.0"

"@babel/generator@^7.16.0", "@babel/generator@^7.9.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2"
  integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==
  dependencies:
    "@babel/types" "^7.16.0"
    jsesc "^2.5.1"
    source-map "^0.5.0"

"@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.8.4":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz#01d615762e796c17952c29e3ede9d6de07d235a8"
  integrity sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==
  dependencies:
    "@babel/compat-data" "^7.16.0"
    "@babel/helper-validator-option" "^7.14.5"
    browserslist "^4.16.6"
    semver "^6.3.0"

"@babel/helper-function-name@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481"
  integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==
  dependencies:
    "@babel/helper-get-function-arity" "^7.16.0"
    "@babel/template" "^7.16.0"
    "@babel/types" "^7.16.0"

"@babel/helper-get-function-arity@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa"
  integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==
  dependencies:
    "@babel/types" "^7.16.0"

"@babel/helper-hoist-variables@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a"
  integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==
  dependencies:
    "@babel/types" "^7.16.0"

"@babel/helper-member-expression-to-functions@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4"
  integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==
  dependencies:
    "@babel/types" "^7.16.0"

"@babel/helper-module-imports@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3"
  integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==
  dependencies:
    "@babel/types" "^7.16.0"

"@babel/helper-module-transforms@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5"
  integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==
  dependencies:
    "@babel/helper-module-imports" "^7.16.0"
    "@babel/helper-replace-supers" "^7.16.0"
    "@babel/helper-simple-access" "^7.16.0"
    "@babel/helper-split-export-declaration" "^7.16.0"
    "@babel/helper-validator-identifier" "^7.15.7"
    "@babel/template" "^7.16.0"
    "@babel/traverse" "^7.16.0"
    "@babel/types" "^7.16.0"

"@babel/helper-optimise-call-expression@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338"
  integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==
  dependencies:
    "@babel/types" "^7.16.0"

"@babel/helper-plugin-utils@^7.14.5":
  version "7.14.5"
  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9"
  integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==

"@babel/helper-replace-supers@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17"
  integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==
  dependencies:
    "@babel/helper-member-expression-to-functions" "^7.16.0"
    "@babel/helper-optimise-call-expression" "^7.16.0"
    "@babel/traverse" "^7.16.0"
    "@babel/types" "^7.16.0"

"@babel/helper-simple-access@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517"
  integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==
  dependencies:
    "@babel/types" "^7.16.0"

"@babel/helper-split-export-declaration@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438"
  integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==
  dependencies:
    "@babel/types" "^7.16.0"

"@babel/helper-validator-identifier@^7.15.7":
  version "7.15.7"
  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
  integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==

"@babel/helper-validator-option@^7.14.5":
  version "7.14.5"
  resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
  integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==

"@babel/helpers@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.0.tgz#875519c979c232f41adfbd43a3b0398c2e388183"
  integrity sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==
  dependencies:
    "@babel/template" "^7.16.0"
    "@babel/traverse" "^7.16.0"
    "@babel/types" "^7.16.0"

"@babel/highlight@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a"
  integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==
  dependencies:
    "@babel/helper-validator-identifier" "^7.15.7"
    chalk "^2.0.0"
    js-tokens "^4.0.0"

"@babel/parser@^7.0.0", "@babel/parser@^7.16.0":
  version "7.16.2"
  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.2.tgz#3723cd5c8d8773eef96ce57ea1d9b7faaccd12ac"
  integrity sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==

"@babel/plugin-syntax-flow@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.0.tgz#07427021d093ed77019408221beaf0272bbcfaec"
  integrity sha512-dH91yCo0RyqfzWgoM5Ji9ir8fQ+uFbt9KHM3d2x4jZOuHS6wNA+CRmRUP/BWCsHG2bjc7A2Way6AvH1eQk0wig==
  dependencies:
    "@babel/helper-plugin-utils" "^7.14.5"

"@babel/plugin-transform-flow-strip-types@^7.0.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.0.tgz#edd968dc2041c1b69e451a262e948d6654a79dc2"
  integrity sha512-vs/F5roOaO/+WxKfp9PkvLsAyj0G+Q0zbFimHm9X2KDgabN2XmNFoAafmeGEYspUlIF9+MvVmyek9UyHiqeG/w==
  dependencies:
    "@babel/helper-plugin-utils" "^7.14.5"
    "@babel/plugin-syntax-flow" "^7.16.0"

"@babel/runtime@^7.1.2", "@babel/runtime@^7.13.16", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.6", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.7":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.0.tgz#e27b977f2e2088ba24748bf99b5e1dece64e4f0b"
  integrity sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==
  dependencies:
    regenerator-runtime "^0.13.4"

"@babel/template@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6"
  integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==
  dependencies:
    "@babel/code-frame" "^7.16.0"
    "@babel/parser" "^7.16.0"
    "@babel/types" "^7.16.0"

"@babel/traverse@^7.0.0", "@babel/traverse@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.0.tgz#965df6c6bfc0a958c1e739284d3c9fa4a6e3c45b"
  integrity sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==
  dependencies:
    "@babel/code-frame" "^7.16.0"
    "@babel/generator" "^7.16.0"
    "@babel/helper-function-name" "^7.16.0"
    "@babel/helper-hoist-variables" "^7.16.0"
    "@babel/helper-split-export-declaration" "^7.16.0"
    "@babel/parser" "^7.16.0"
    "@babel/types" "^7.16.0"
    debug "^4.1.0"
    globals "^11.1.0"

"@babel/types@^7.12.13", "@babel/types@^7.16.0":
  version "7.16.0"
  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba"
  integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==
  dependencies:
    "@babel/helper-validator-identifier" "^7.15.7"
    to-fast-properties "^2.0.0"

"@fortawesome/fontawesome-common-types@^0.2.36":
  version "0.2.36"
  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903"
  integrity sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==

"@fortawesome/fontawesome-svg-core@^1.2.36":
  version "1.2.36"
  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz#4f2ea6f778298e0c47c6524ce2e7fd58eb6930e3"
  integrity sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==
  dependencies:
    "@fortawesome/fontawesome-common-types" "^0.2.36"

"@fortawesome/free-brands-svg-icons@^5.15.4":
  version "5.15.4"
  resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz#ec8a44dd383bcdd58aa7d1c96f38251e6fec9733"
  integrity sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==
  dependencies:
    "@fortawesome/fontawesome-common-types" "^0.2.36"

"@fortawesome/free-solid-svg-icons@^5.15.4":
  version "5.15.4"
  resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz#2a68f3fc3ddda12e52645654142b9e4e8fbb6cc5"
  integrity sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==
  dependencies:
    "@fortawesome/fontawesome-common-types" "^0.2.36"

"@fortawesome/react-fontawesome@^0.1.15":
  version "0.1.16"
  resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.16.tgz#ce7665490214e20f929368d6b65f68884a99276a"
  integrity sha512-aLmzDwC9rEOAJv2UJdMns89VZR5Ry4IHu5dQQh24Z/lWKEm44lfQr1UNalZlkUaQN8d155tNh+CS7ntntj1VMA==
  dependencies:
    prop-types "^15.7.2"

"@hypnosphi/create-react-context@^0.3.1":
  version "0.3.1"
  resolved "https://registry.yarnpkg.com/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6"
  integrity sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==
  dependencies:
    gud "^1.0.0"
    warning "^4.0.3"

"@iarna/toml@^2.2.0":
  version "2.2.5"
  resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
  integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==

"@nodelib/fs.scandir@2.1.5":
  version "2.1.5"
  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
  integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
  dependencies:
    "@nodelib/fs.stat" "2.0.5"
    run-parallel "^1.1.9"

"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
  version "2.0.5"
  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==

"@nodelib/fs.walk@^1.2.3":
  version "1.2.8"
  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
  integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
  dependencies:
    "@nodelib/fs.scandir" "2.1.5"
    fastq "^1.6.0"

"@parcel/babel-ast-utils@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/babel-ast-utils/-/babel-ast-utils-2.0.0.tgz#d34c67bb331a24dd68b1a5531c964121e2801893"
  integrity sha512-aV0Lz4YFUsg9m/FVRVw5JnqDl/JiLtb9kdh1u3wFgi71A1jDRxaHHt8IIT3t9EL9N5oRxs1V8OHdeCkmiqeZQQ==
  dependencies:
    "@babel/parser" "^7.0.0"
    "@parcel/babylon-walk" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    astring "^1.6.2"

"@parcel/babylon-walk@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/babylon-walk/-/babylon-walk-2.0.0.tgz#2937bb1298004a565c23ad4fc1eac9a34a151fa3"
  integrity sha512-eKABjg+i5pmgd9OtduBUMzhwB+l4rRmv+DOj18KnPIcr653LUUfQSWMwa/LGnn/0QRKPLVIjT0feLt1Yg9AvCQ==
  dependencies:
    "@babel/types" "^7.12.13"
    lodash.clone "^4.5.0"

"@parcel/bundler-default@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.0.0.tgz#74f9c99af3961db73a12611f4dcea293a6434ec3"
  integrity sha512-gf2ytwD0ihlzsUKvCbToRb1/5QwAMkPWoGzk1fydL++5PQU1FX1ZtMUlvjcnF8q+42Q0oVlvVfvNl9O7crzCqg==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/hash" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    nullthrows "^1.1.1"

"@parcel/cache@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/cache/-/cache-2.0.0.tgz#ccf26c1d4be378a34aa44f73d00e51b25780c455"
  integrity sha512-HThLpk1qXkyRyWrqXh5EYdINFd4tl4SCUgbipZ46pQWtwZ8+0nmudbuszeRKi1UCyNCdgktcZu8xmXmSVQNDyA==
  dependencies:
    "@parcel/logger" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    lmdb-store "^1.5.5"

"@parcel/codeframe@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/codeframe/-/codeframe-2.0.0.tgz#39881e02227f76f8e24222b06786450d99b49c73"
  integrity sha512-34L0qa72rxtzng2Bw195YYVAZWhuWm1V9u+0bHfajyl242BDUbUNpQOowP/AYRjj7XSmIN6XCUv3luogvMPo8A==
  dependencies:
    chalk "^4.1.0"
    emphasize "^4.2.0"
    slice-ansi "^4.0.0"
    string-width "^4.2.0"

"@parcel/compressor-raw@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/compressor-raw/-/compressor-raw-2.0.0.tgz#803fbf894ae3da28c395c1b23236079a34e90b0c"
  integrity sha512-7bvANicPwcqarnOSgPBCMjaK65jpASu4LH/JGv6XFUvW1jjba0TAzs6GK1ixvGpqhftLEYJf9oj3dEZaWB7Lxg==
  dependencies:
    "@parcel/plugin" "^2.0.0"

"@parcel/config-default@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/config-default/-/config-default-2.0.0.tgz#6ec7968ca92d695cece496752b9be9f63b86c6ac"
  integrity sha512-ztf9msic6010vjnPiAirZ9qEMSOXpSFuKPjWYHSwVGsXGCsqEjPGtc5YseRnpXX2mJ7L8MoO4MQ3v/NHAQ/i3Q==
  dependencies:
    "@parcel/bundler-default" "^2.0.0"
    "@parcel/compressor-raw" "^2.0.0"
    "@parcel/namer-default" "^2.0.0"
    "@parcel/optimizer-cssnano" "^2.0.0"
    "@parcel/optimizer-htmlnano" "^2.0.0"
    "@parcel/optimizer-image" "^2.0.0"
    "@parcel/optimizer-svgo" "^2.0.0"
    "@parcel/optimizer-terser" "^2.0.0"
    "@parcel/packager-css" "^2.0.0"
    "@parcel/packager-html" "^2.0.0"
    "@parcel/packager-js" "^2.0.0"
    "@parcel/packager-raw" "^2.0.0"
    "@parcel/packager-svg" "^2.0.0"
    "@parcel/reporter-dev-server" "^2.0.0"
    "@parcel/resolver-default" "^2.0.0"
    "@parcel/runtime-browser-hmr" "^2.0.0"
    "@parcel/runtime-js" "^2.0.0"
    "@parcel/runtime-react-refresh" "^2.0.0"
    "@parcel/runtime-service-worker" "^2.0.0"
    "@parcel/transformer-babel" "^2.0.0"
    "@parcel/transformer-css" "^2.0.0"
    "@parcel/transformer-html" "^2.0.0"
    "@parcel/transformer-image" "^2.0.0"
    "@parcel/transformer-js" "^2.0.0"
    "@parcel/transformer-json" "^2.0.0"
    "@parcel/transformer-postcss" "^2.0.0"
    "@parcel/transformer-posthtml" "^2.0.0"
    "@parcel/transformer-raw" "^2.0.0"
    "@parcel/transformer-react-refresh-wrap" "^2.0.0"
    "@parcel/transformer-svg" "^2.0.0"

"@parcel/core@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/core/-/core-2.0.0.tgz#c4806cfddd4cfd75cecc4655061c22154df78c70"
  integrity sha512-wiY3XyGetCpek0aEi+xB0eQQUn4v9xt20AKx71KpU30SShwcHnVEUEVxuVEi7+NgJQsUCsp8nXUeZluwRTfUFA==
  dependencies:
    "@parcel/cache" "^2.0.0"
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/events" "^2.0.0"
    "@parcel/fs" "^2.0.0"
    "@parcel/graph" "^2.0.0"
    "@parcel/hash" "^2.0.0"
    "@parcel/logger" "^2.0.0"
    "@parcel/package-manager" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    "@parcel/types" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    "@parcel/workers" "^2.0.0"
    abortcontroller-polyfill "^1.1.9"
    base-x "^3.0.8"
    browserslist "^4.6.6"
    clone "^2.1.1"
    dotenv "^7.0.0"
    dotenv-expand "^5.1.0"
    json-source-map "^0.6.1"
    json5 "^1.0.1"
    micromatch "^4.0.2"
    nullthrows "^1.1.1"
    semver "^5.4.1"

"@parcel/diagnostic@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/diagnostic/-/diagnostic-2.0.0.tgz#c80fc96aee4862c3b78f358007deef516e3af0ba"
  integrity sha512-cADyFWaMlhDawQdraFt2TECpiD/DvQ76L+RK97X7sUj5b+cGY7fjrnWPKRVmog5+OoNlbmh1EO3FOLx5vuxzww==
  dependencies:
    json-source-map "^0.6.1"
    nullthrows "^1.1.1"

"@parcel/events@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/events/-/events-2.0.0.tgz#b4751f8edd5f227c1c5b4dd02ba8a882c38c30fb"
  integrity sha512-v9+pXLtgc44+eIbNAs/SB2tyXKUv+5XF1f3TRsLJ44276e9ksa3Cstrs1EFxZtpi03UoXkXJQoJljGigb2bt8A==

"@parcel/fs-search@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/fs-search/-/fs-search-2.0.0.tgz#894f3dd61c0827d05d2ddbb18b6bfb35ca269b75"
  integrity sha512-OVWA0elZm5BKaHgS5FnvlmMwQiU++0sGW7PIyaNJnY0lvpZndU+Pot0xNTSrG3Aq7OkpQlcUWkEMA8KtkHZH1A==
  dependencies:
    detect-libc "^1.0.3"

"@parcel/fs-write-stream-atomic@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/fs-write-stream-atomic/-/fs-write-stream-atomic-2.0.0.tgz#a0f59c6c86ee8996ea821d1cee0917e8219cc8c4"
  integrity sha512-PSvAcu7f+3zzjQZuYJjPQVRI99Lu2HEphr04JChwdO5wr/sm6dYFRQdL0SahH/vF1tnEaBFxC4vTslNEBT+9bg==
  dependencies:
    graceful-fs "^4.1.2"
    iferr "^1.0.2"
    imurmurhash "^0.1.4"
    readable-stream "1 || 2"

"@parcel/fs@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-2.0.0.tgz#f78911eee57a766d665711a8b22ffe752af19a7f"
  integrity sha512-1FQIVDO3zWE2vv9EJmLJq+EeZ7DE4lwi/e0fR1PAS1g5YbO9n3u01Xnpzy/jmlL14LnBXdhy4r7OBziShYLK6w==
  dependencies:
    "@parcel/fs-search" "^2.0.0"
    "@parcel/fs-write-stream-atomic" "^2.0.0"
    "@parcel/types" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    "@parcel/watcher" "^2.0.0"
    "@parcel/workers" "^2.0.0"
    graceful-fs "^4.2.4"
    mkdirp "^0.5.1"
    ncp "^2.0.0"
    nullthrows "^1.1.1"
    rimraf "^3.0.2"
    utility-types "^3.10.0"

"@parcel/graph@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/graph/-/graph-2.0.0.tgz#b913cc9cf687f16d201ab493eebd5bec48fcc380"
  integrity sha512-ZI3pYSWWqGAFi4qDa00kieiKpHz3xY9vPr4iVTjNiNXD6fU7C+Y25mxPmLv4uYbJTzccAo0iaN9VGqPo/FyiBg==
  dependencies:
    nullthrows "^1.1.1"

"@parcel/hash@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/hash/-/hash-2.0.0.tgz#4bc6861f3d04e70349d4c12a3885bba00480c453"
  integrity sha512-+Yq+mGnZOSyJ6atLCFvA1Kyg/NVysVzlwSNrmA3dc3yO63GtXojQEEyW9U20d+Bj/DVlocLO52Z61d4P9ak4Tw==
  dependencies:
    detect-libc "^1.0.3"
    xxhash-wasm "^0.4.1"

"@parcel/logger@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-2.0.0.tgz#0e038be4d927997682e54e6c3be91499c3eb1b76"
  integrity sha512-jpESL6m4tEGP+Yj/PZGb6ellrOx3irEIvSjbhwZBGoXaApqqvB352dLXrVJ/vyrmzj9YLNdm2rPWeZWkMDGgMA==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/events" "^2.0.0"

"@parcel/markdown-ansi@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/markdown-ansi/-/markdown-ansi-2.0.0.tgz#40da430d25302c55b366ec0dc0f2485837c95da8"
  integrity sha512-AgxIXRaEpNi1GukjWC6FTLO7t/EImv+3KuwFF5tGlWhXO41V1Igl6gXCDpzRmTk5dBbdqOWdRWip1O5Qy74cwA==
  dependencies:
    chalk "^4.1.0"

"@parcel/namer-default@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/namer-default/-/namer-default-2.0.0.tgz#d481a7530df4c125ae2b584d305c862fa2f6b369"
  integrity sha512-UjXfbU4Yb08SMGVtfpgebe/B9rGmuM3nEyquaUprg2E/PpZV4xjeqMFZTZWW/XNwwnhXPRdrmStkyX6dyLfocA==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    nullthrows "^1.1.1"

"@parcel/node-libs-browser@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/node-libs-browser/-/node-libs-browser-2.0.0.tgz#0aadb4a4c95903e25904350c789acbe295546762"
  integrity sha512-/xod+1SHo7qpY3oSg9LzGC2QFJ2w7kmdukJomgyOoKRwZddV4NeV52tN3etJcCtofvNJ3pXasiDeGDEtIw/0Ug==
  dependencies:
    assert "^2.0.0"
    browserify-zlib "^0.2.0"
    buffer "^5.5.0"
    console-browserify "^1.2.0"
    constants-browserify "^1.0.0"
    crypto-browserify "^3.12.0"
    domain-browser "^3.5.0"
    events "^3.1.0"
    https-browserify "^1.0.0"
    os-browserify "^0.3.0"
    path-browserify "^1.0.0"
    process "^0.11.10"
    punycode "^1.4.1"
    querystring-es3 "^0.2.1"
    stream-browserify "^3.0.0"
    stream-http "^3.1.0"
    string_decoder "^1.3.0"
    timers-browserify "^2.0.11"
    tty-browserify "^0.0.1"
    url "^0.11.0"
    util "^0.12.3"
    vm-browserify "^1.1.2"

"@parcel/node-resolver-core@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/node-resolver-core/-/node-resolver-core-2.0.0.tgz#05cf37f3903bea5aab8c27fa2b5f133f9a3a968d"
  integrity sha512-BwOPlPm92NIpmWz5Qkrjp6S/iSyTte7xJTJMUlkFQBzjRVvtctY9sHGtL3rMbm3FlKqzvpHu29JNwT+6sWv4ug==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/node-libs-browser" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    micromatch "^4.0.4"
    nullthrows "^1.1.1"

"@parcel/optimizer-cssnano@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/optimizer-cssnano/-/optimizer-cssnano-2.0.0.tgz#6b639c5120f37c020d72114c57e08cd6163e5d15"
  integrity sha512-C+wMrT15h0NB+Wxf633Q6tHacIdTMGXSHRy2ELlzS/uWgycNxiZxevxXAGnB6vnPxsTzTnRVKb0jm9N9mWYs4A==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    cssnano "^5.0.5"
    postcss "^8.3.0"

"@parcel/optimizer-htmlnano@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.0.0.tgz#0b42b24f60ad9b3b012b2342881c4352735757b4"
  integrity sha512-ynpGSTleI/+GItibF5t7T8tvSfRt5yEjMxF8Jg4Fm0H2Cmkx6h8eR5POo2co08NAUS0w5CCteP3GnKL1mwoR+g==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    htmlnano "^1.0.1"
    nullthrows "^1.1.1"
    posthtml "^0.16.5"
    svgo "^2.4.0"

"@parcel/optimizer-image@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/optimizer-image/-/optimizer-image-2.0.0.tgz#0f53d3bc2d3c11d5b230a2240dc89ebb30a9c5fd"
  integrity sha512-qaV+8SyLT++d5CBQwVBJQafawRdwDZpi/ipBFpSKzNOCLNZ14lZd/7+0x/Q7cjVTm83NcXx6HUV70P/yjmqyYg==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    detect-libc "^1.0.3"

"@parcel/optimizer-svgo@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.0.0.tgz#571bc01baaaed3d349d936394726274522db8ca4"
  integrity sha512-6jWLmecJD+RqTQPC/S5RVH2wImvXrgXxxI7MVuHewb7cRV0Udv1+/Q7t8l6XAHrmxzYnXzPmSTYYEznM9nLS6A==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    svgo "^2.4.0"

"@parcel/optimizer-terser@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/optimizer-terser/-/optimizer-terser-2.0.0.tgz#d5cb1190ac3b1fcdb16609c416b81ece34e8391c"
  integrity sha512-xRImVxQeDT+BoOA5sYV+l7kn4nTP+1l3YIb6iTiuQrM6V+UQJOQu4Z3eNw/0vHMTilcf3WUtzpGRRAtoVfORsg==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    nullthrows "^1.1.1"
    terser "^5.2.0"

"@parcel/package-manager@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/package-manager/-/package-manager-2.0.0.tgz#c751e8d8348b49ec7f26d6d6a63f68c0b91d4421"
  integrity sha512-zJY5SOaEC6pyU9bXLmGlnD7VRWURsbxPVNHVreFNttHg2DaT+0u1R5NAoor4BG38esw2TaGdi8QU9TmsTyhSUQ==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/fs" "^2.0.0"
    "@parcel/logger" "^2.0.0"
    "@parcel/types" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    "@parcel/workers" "^2.0.0"
    command-exists "^1.2.6"
    cross-spawn "^6.0.4"
    nullthrows "^1.1.1"
    semver "^5.4.1"
    split2 "^3.1.1"

"@parcel/packager-css@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/packager-css/-/packager-css-2.0.0.tgz#788e57c54a3bc547db15963ef9678d0658137ecb"
  integrity sha512-q0eKGTj8CcG5NvciGHY5cFfGMAjCGygActeirfOO/XQODbVHtJGSPHEZkAagvZ+UG7NdGAx+ogMreFkqFzWElw==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    nullthrows "^1.1.1"
    postcss "^8.3.0"

"@parcel/packager-html@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/packager-html/-/packager-html-2.0.0.tgz#0393f80513e317ad3e7f821b333ed507bfc46541"
  integrity sha512-DBuTLAqP+BLOZNw1Ry34PZqxZwwtRTStjCZF4CzYQRP6lZdq3Js1QyemUTuZblR8Fimo6ew3b1BfbdbEpKOymw==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/types" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    nullthrows "^1.1.1"
    posthtml "^0.16.5"

"@parcel/packager-js@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/packager-js/-/packager-js-2.0.0.tgz#e401952356e7df545d33cef501fd4acc0e580043"
  integrity sha512-hGKaFCm2nrsE2sQsTt+iRyjn329tJPd+/JTdBiXgUvhWEoIzTX/n/2+aqA0kStI+7EwotV6g+S4aZLQS6Aoq5w==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/hash" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    globals "^13.2.0"
    nullthrows "^1.1.1"

"@parcel/packager-raw@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.0.0.tgz#8e76ff53f716925726d82bda17f06c388c940952"
  integrity sha512-NY2VWb3EMAom4EXTUIoTNTJZ+vXTElhNdAmgTKR5AO+o8PdepSHZayfq2myo1R9mpv2+LwLyHacp0EeiCbmGBg==
  dependencies:
    "@parcel/plugin" "^2.0.0"

"@parcel/packager-svg@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/packager-svg/-/packager-svg-2.0.0.tgz#dc2af44467ac9ff59547307b63850e10edb41001"
  integrity sha512-5eplpZZB7QKXQsiyHc82vrqz08PWgRnAZ63Z5NUB0qa+G/jn7f6xQI4v3GJJEHY7YKED2kk7FopLdNCtknHV9g==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/types" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    posthtml "^0.16.4"

"@parcel/plugin@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/plugin/-/plugin-2.0.0.tgz#ad1c820a89fe3f356933dcbfb0579865275b41df"
  integrity sha512-yOBRbizd27vivgFRxpTBxfViTIYMdoLeAvRHEoL49dkymKkKtq09hZQtVS+iQmypwyJnp4cMsG8FwN+srJub7w==
  dependencies:
    "@parcel/types" "^2.0.0"

"@parcel/reporter-bundle-analyzer@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/reporter-bundle-analyzer/-/reporter-bundle-analyzer-2.0.0.tgz#a58f489aee48706b9ba79c6fa2ac897f9a6cf1ac"
  integrity sha512-pdej2kpc9qFIhTzs/EBgKxLW36ZTIvCz/qdqctWeZHkbj1eXYWgOZXQjIlNAPj+ADz66hFJmXlvrqGSSEIKjuQ==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    nullthrows "^1.1.1"

"@parcel/reporter-cli@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/reporter-cli/-/reporter-cli-2.0.0.tgz#acf5de94d90a184900565540d5ce0d694bbdf7b7"
  integrity sha512-VXSLQtH0DV+/OgA8Pe6xXFkGF0ZK654duUqEAFZB6yeGQP8/d8kuu1xCAytTTkRSGkF90ve/W3px1H8d4g6OTA==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/types" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    chalk "^4.1.0"
    filesize "^6.1.0"
    nullthrows "^1.1.1"
    ora "^5.2.0"
    string-width "^4.2.0"
    strip-ansi "^6.0.0"
    term-size "^2.2.1"
    wrap-ansi "^7.0.0"

"@parcel/reporter-dev-server@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.0.0.tgz#ac2a75fd3981d37489e8ae48958818399595fcd4"
  integrity sha512-d+elwf+C8snG4vJB9q9cuRoo7g4X31SWsc9nEAsn8WBO5lbm8uZSolqtiLcsRJAQUmDtP3l7uQZsXEU7EJs/TQ==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    connect "^3.7.0"
    ejs "^3.1.6"
    http-proxy-middleware "^1.0.0"
    nullthrows "^1.1.1"
    serve-handler "^6.0.0"
    ws "^7.0.0"

"@parcel/resolver-default@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/resolver-default/-/resolver-default-2.0.0.tgz#80db04767954573b508888fb3e3d7bec3b3bf1e0"
  integrity sha512-4zqlqvAjcGebCMYwsaD9z4326PZVc/MTI8VA24XG6gCkGzQFu3FcQQ4GZf7Mq7HzlsNWdtdg24Iyf4Cpkid/Ug==
  dependencies:
    "@parcel/node-resolver-core" "^2.0.0"
    "@parcel/plugin" "^2.0.0"

"@parcel/runtime-browser-hmr@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.0.0.tgz#07e9406807f81b58f0f546f04400dfaf5614af87"
  integrity sha512-17S2IUxgQcLzPTME/czB1CiVPMDXDNZzUz8/BVCf/JQfve2cce5fbu27nJpQYJFnotMLmjXVtghfWTVMUj4jiw==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"

"@parcel/runtime-js@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/runtime-js/-/runtime-js-2.0.0.tgz#502130ea06ae11da091fd31ce014c872087e5f7b"
  integrity sha512-QW/g10YnFL6u4xHG/8X0qPl8Nb9nPVz38MO38JXZ97fhhW+U3PfOqNz9MhVXJQI161zxvQtDLsfeVxjdNKsrbw==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    nullthrows "^1.1.1"

"@parcel/runtime-react-refresh@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.0.0.tgz#cc3794a09c61ed7ea6730b853118ed9fae28f4ce"
  integrity sha512-VpO7cI2XQobej9l105rmsZ6aiQbhk9FGOG7tx/Mgo1KMkTQMZ4K4WOv2QC9LhsGOoDSwnWxSAXbC8XqoPYj4yQ==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    react-refresh "^0.9.0"

"@parcel/runtime-service-worker@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.0.0.tgz#c61237d5254c36d1fb1ac27331dc6cd4e296cbf1"
  integrity sha512-RHFHAXA/dlTEs2R8qZyGxc2f8npwSmFH3+ioQon56hqIadlszwsWuRNd8RjH7M3CqtUsUTTTOqBukHRWrRzNgg==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    nullthrows "^1.1.1"

"@parcel/source-map@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/source-map/-/source-map-2.0.0.tgz#41cf004109bbf277ceaf096a58838ff6a59af774"
  integrity sha512-njoUJpj2646NebfHp5zKJeYD1KwhsfQIoU9TnCTHmF9fGOaPbClmeq12G6/4ZqGASftRq+YhhukFBi/ncWKGvw==
  dependencies:
    detect-libc "^1.0.3"
    globby "^11.0.3"

"@parcel/transformer-babel@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-babel/-/transformer-babel-2.0.0.tgz#4ec1a980fe60135f1802114c540265caf2658c71"
  integrity sha512-HAu2PG+tw+fU0/aXRbSUIpiwXW0EbIBl3nOKonKFaNsxSIXpEoJil7n5BbU+kwLB9K6Hrow6HRJOn8v8/Grb0w==
  dependencies:
    "@babel/core" "^7.12.0"
    "@babel/generator" "^7.9.0"
    "@babel/helper-compilation-targets" "^7.8.4"
    "@babel/plugin-transform-flow-strip-types" "^7.0.0"
    "@babel/traverse" "^7.0.0"
    "@parcel/babel-ast-utils" "^2.0.0"
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    browserslist "^4.6.6"
    core-js "^3.2.1"
    json5 "^2.1.0"
    nullthrows "^1.1.1"
    semver "^5.7.0"

"@parcel/transformer-css@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-css/-/transformer-css-2.0.0.tgz#ac65e0bc708751ca34989aee4f2242c2c789bd7c"
  integrity sha512-hvmJ+GrKS/FQvDlHGwgnLaxV8f6V/4ayFsIYwVmlPFBwJeWuNM+3xJJbf3CnsZXSVsJCRF8NSMwKPaorbJEdHA==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    nullthrows "^1.1.1"
    postcss "^8.3.0"
    postcss-value-parser "^4.1.0"
    semver "^5.4.1"

"@parcel/transformer-html@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-html/-/transformer-html-2.0.0.tgz#323b7b3c7842c644ef08e66459d6d821fd260121"
  integrity sha512-mFZ/Nm6U+c1nfu9hfxgk6CqArOitd915JQdDIKfM/oOOyK7pnA1kPuTkiFy3+l5+Ol+dneRGV2mxM51PHh7N2Q==
  dependencies:
    "@parcel/hash" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    nullthrows "^1.1.1"
    posthtml "^0.16.5"
    posthtml-parser "^0.10.1"
    posthtml-render "^3.0.0"
    semver "^5.4.1"

"@parcel/transformer-image@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-image/-/transformer-image-2.0.0.tgz#e1387f2983bcb0fdb2838b535b3b8e89ba3508c2"
  integrity sha512-1QXllyEDpITACi+1WY67SEAgmNKp4zohffvJoEkF3scjSX6fRIlOEXe8cSEiGVklWzik/iQN7UqHOTAqSZ3Yng==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/workers" "^2.0.0"
    nullthrows "^1.1.1"

"@parcel/transformer-js@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-js/-/transformer-js-2.0.0.tgz#2205d2dd0699bb26fa0f5daa401bec505ce47e31"
  integrity sha512-+eGznTiOLlPj/l99d8FRZaVdKg5CMHV30KQ/PRWNv1cai30qDFujrw3jt4clE9Q4EJY1u88fo6sA627MHE6+Wg==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    "@swc/helpers" "^0.2.11"
    browserslist "^4.6.6"
    detect-libc "^1.0.3"
    micromatch "^4.0.2"
    nullthrows "^1.1.1"
    regenerator-runtime "^0.13.7"
    semver "^5.4.1"

"@parcel/transformer-json@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-json/-/transformer-json-2.0.0.tgz#2319406979be2e78b0b9717dbed58803a65b4add"
  integrity sha512-OFxuAFUbxZBApczwKV8xXMQe/dMpiO+of4c4kHeRx6sKYaYoYDiPhTTiHeSkPhTXhiQsVFoEj4xtAum/1nKtqw==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    json5 "^2.1.0"

"@parcel/transformer-postcss@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-postcss/-/transformer-postcss-2.0.0.tgz#fd462d3bf1c95d56bfd5a47a0bc451f166909533"
  integrity sha512-CnDgHs2G6nAQghpMWrB84K2QYVLQ2q8CucD4XTe9xc2mo1ObeCtpEijAxsORyp4TTZYOLsw4hmVbv/eY8uLOLg==
  dependencies:
    "@parcel/hash" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    clone "^2.1.1"
    css-modules-loader-core "^1.1.0"
    nullthrows "^1.1.1"
    postcss-modules "^3.2.2"
    postcss-value-parser "^4.1.0"
    semver "^5.4.1"

"@parcel/transformer-posthtml@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.0.0.tgz#b0e45724b4510d112cca25ee303b3556b62fb64a"
  integrity sha512-jaiymnLQshy99zNxp9JLvFWFGm41LWULFRwjHep1ALGyphcxPiw/zq4o0K7pvc8shlAXvE2M/3Q2SGFyCwe+zA==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    nullthrows "^1.1.1"
    posthtml "^0.16.5"
    posthtml-parser "^0.10.1"
    posthtml-render "^3.0.0"
    semver "^5.4.1"

"@parcel/transformer-raw@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-raw/-/transformer-raw-2.0.0.tgz#bad5981f94a6cd490415f7823b95467adb5ff7dc"
  integrity sha512-tE/RAQBm0297/RdQVwCRosRmo0DeEpik+xxE06l2I/RyryN313UCVNdFB3CGDzMd2dKHUYnSw3Y2Ne2cdiWS8w==
  dependencies:
    "@parcel/plugin" "^2.0.0"

"@parcel/transformer-react-refresh-wrap@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.0.0.tgz#8fc73adda6f45ae8e6982a5d00a6948f3a58eb92"
  integrity sha512-RdrroS3hWq6ajm+5jdD4s51OK+iyoONjdnaKdYxXSKz3gwEnStSSNOKE4b+mFDETcngrOv9Qp2Pt/imGwdEvAg==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    react-refresh "^0.9.0"

"@parcel/transformer-sass@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-sass/-/transformer-sass-2.0.0.tgz#143048e38f4bd63cd8009588c6a114c2dbe0b9f1"
  integrity sha512-PbqKVsUOaVHrFgp7wdnTCa1oKUNQeMMaHc1IBZwLVLqcHLnPSO4lwRNhlYDfAA1gUUoT+mnrEM23ugHrPnXwBA==
  dependencies:
    "@parcel/plugin" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    sass "^1.38.0"

"@parcel/transformer-svg@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/transformer-svg/-/transformer-svg-2.0.0.tgz#d77ff20c353ed66ad3fcae3d250bde947799486b"
  integrity sha512-oZ88kAUAImDsh8FMqYf+g+qmGQgkKKGiYOCxqxB83Ri4ZTeEMyL40sVvLX4qtZDL/kOLmYxju0wankbZ6OBUXw==
  dependencies:
    "@parcel/hash" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    nullthrows "^1.1.1"
    posthtml "^0.16.5"
    posthtml-parser "^0.10.1"
    posthtml-render "^3.0.0"
    semver "^5.4.1"

"@parcel/ts-utils@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/ts-utils/-/ts-utils-2.0.0.tgz#89954d341a8942cb6ddcda217f5f7b38914bef12"
  integrity sha512-+jMwsBu5+gyp8iw+h6CN1MR8hYDALdO1ccphHPD2WMzQHpvvp+hhZ/gUfN70ioPz9DOG/d6BMlfm/HVaZLePsA==
  dependencies:
    nullthrows "^1.1.1"

"@parcel/types@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.0.0.tgz#31f6eb7c24b2d9ae752ce49adaf01469a9e9067a"
  integrity sha512-117vnZuQ1HzXOrIo8qAFgG0lMfz5dck7u+smlaZP1aRxVJaxWBo2C2+8JoTPHjRn9tE5IZGH9PVIZW+X3F474g==
  dependencies:
    "@parcel/cache" "^2.0.0"
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/fs" "^2.0.0"
    "@parcel/package-manager" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    "@parcel/workers" "^2.0.0"
    utility-types "^3.10.0"

"@parcel/utils@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-2.0.0.tgz#32450a9e67265841985a33f29065ab57f9bc361b"
  integrity sha512-4SX8qNyImHLyvVls1U9rxF+h+1kbbdWpxnRiHOFPBYW6H1LiUNBjXPPffTEpKb+RFOqmQ2uNh0aP0mCmROPfXg==
  dependencies:
    "@iarna/toml" "^2.2.0"
    "@parcel/codeframe" "^2.0.0"
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/hash" "^2.0.0"
    "@parcel/logger" "^2.0.0"
    "@parcel/markdown-ansi" "^2.0.0"
    "@parcel/source-map" "^2.0.0"
    ansi-html-community "0.0.8"
    chalk "^4.1.0"
    clone "^2.1.1"
    fast-glob "3.1.1"
    fastest-levenshtein "^1.0.8"
    is-glob "^4.0.0"
    is-url "^1.2.2"
    json5 "^1.0.1"
    lru-cache "^6.0.0"
    micromatch "^4.0.4"
    node-forge "^0.10.0"
    nullthrows "^1.1.1"
    open "^7.0.3"
    terminal-link "^2.1.1"

"@parcel/validator-typescript@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/validator-typescript/-/validator-typescript-2.0.0.tgz#2894cdd06db9e156a3b6e67d4f8e73a94c221a5f"
  integrity sha512-qv3SuwuKwtLU/EC9NzqYoJAkCicQp/t4vdM1dms19Cre1od8ZhSHDjEi+oDvUnwPZ1yZrLLBY/zWxQh/yUsP+A==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/plugin" "^2.0.0"
    "@parcel/ts-utils" "^2.0.0"
    "@parcel/types" "^2.0.0"
    "@parcel/utils" "^2.0.0"

"@parcel/watcher@^2.0.0":
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.1.tgz#ec4bb6c43d9588a1ffd3d2abe6df5b501463c62d"
  integrity sha512-XegFF4L8sFn1RzU5KKOZxXUuzgOSwd6+X2ez3Cy6MVhYMbiLZ1moceMTqDhuT3N8DNbdumK3zP1wojsIsnX40w==
  dependencies:
    node-addon-api "^3.2.1"
    node-gyp-build "^4.3.0"

"@parcel/workers@^2.0.0":
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-2.0.0.tgz#0cab21a804e534a8d7dcba2fbf70ad2d8dc03771"
  integrity sha512-emfezGXmmz5NNrtBvbZO4cFosdpEL+OqhIa4SpUH63aedx+9so/GI/rMp19FmTi0qPKQhOLJmD4VZ2RZHbZM4w==
  dependencies:
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/logger" "^2.0.0"
    "@parcel/types" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    chrome-trace-event "^1.0.2"
    nullthrows "^1.1.1"

"@popperjs/core@^2.10.1", "@popperjs/core@^2.8.6":
  version "2.10.2"
  resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590"
  integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==

"@react-aria/ssr@^3.0.1":
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.1.0.tgz#b7163e6224725c30121932a8d1422ef91d1fab22"
  integrity sha512-RxqQKmE8sO7TGdrcSlHTcVzMP450hqowtBSd2bBS9oPlcokVkaGq28c3Rwa8ty5ctw4EBCjXqjP7xdcKMGDzug==
  dependencies:
    "@babel/runtime" "^7.6.2"

"@restart/context@^2.1.4":
  version "2.1.4"
  resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02"
  integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==

"@restart/hooks@^0.3.26":
  version "0.3.27"
  resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.27.tgz#91f356d66d4699a8cd8b3d008402708b6a9dc505"
  integrity sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==
  dependencies:
    dequal "^2.0.2"

"@restart/hooks@^0.4.0":
  version "0.4.1"
  resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.1.tgz#716b1fd7a67650a6d4ed441b5d704b4f73ca2612"
  integrity sha512-87UMGZcFwbj0Gr+8eEBAzL6H8xF5pMwq/S3LWeFK9cg4+lTqLFMsiVQFT4ncMJzqgpdD7T6ktF8PsEHeN2O+MQ==
  dependencies:
    dequal "^2.0.2"

"@restart/ui@^0.2.3":
  version "0.2.3"
  resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-0.2.3.tgz#8b68aa2ca07af799a65b288cc3c6039915c46a4c"
  integrity sha512-FDhtjIR9QvUfMwvFsgVurRA1qdYxM0F0S07acywjG7gNI2YmQo78rtCYIe553V/pyBjEjaKAg3fzBFCocFTqyQ==
  dependencies:
    "@babel/runtime" "^7.13.16"
    "@popperjs/core" "^2.10.1"
    "@react-aria/ssr" "^3.0.1"
    "@restart/hooks" "^0.4.0"
    "@types/warning" "^3.0.0"
    dequal "^2.0.2"
    dom-helpers "^5.2.0"
    prop-types "^15.7.2"
    uncontrollable "^7.2.1"
    warning "^4.0.3"

"@swc/helpers@^0.2.11":
  version "0.2.13"
  resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.2.13.tgz#95d69aaed0998040d455832efbe1342ed79d0809"
  integrity sha512-HxfZHtTgDlME7fH+KIwBrm1B1+2iB3UpbcSbPCZzDAHxZ3z+qfjflHverm33sXrdyQYx4s3J7r6ot76433mwEg==

"@trysound/sax@0.2.0":
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
  integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==

"@types/debug@^4.0.0":
  version "4.1.7"
  resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
  integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==
  dependencies:
    "@types/ms" "*"

"@types/hast@^2.0.0":
  version "2.3.4"
  resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc"
  integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==
  dependencies:
    "@types/unist" "*"

"@types/history@*":
  version "4.7.9"
  resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724"
  integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ==

"@types/http-proxy@^1.17.5":
  version "1.17.7"
  resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f"
  integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==
  dependencies:
    "@types/node" "*"

"@types/invariant@^2.2.33":
  version "2.2.35"
  resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be"
  integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==

"@types/mdast@^3.0.0", "@types/mdast@^3.0.3":
  version "3.0.10"
  resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af"
  integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==
  dependencies:
    "@types/unist" "*"

"@types/mdurl@^1.0.0":
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9"
  integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==

"@types/ms@*":
  version "0.7.31"
  resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
  integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==

"@types/node@*", "@types/node@^16.10.1":
  version "16.11.6"
  resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae"
  integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==

"@types/parse-json@^4.0.0":
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
  integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==

"@types/prop-types@*", "@types/prop-types@^15.7.3":
  version "15.7.4"
  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11"
  integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==

"@types/react-dom@^17.0.9":
  version "17.0.11"
  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.11.tgz#e1eadc3c5e86bdb5f7684e00274ae228e7bcc466"
  integrity sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==
  dependencies:
    "@types/react" "*"

"@types/react-router-dom@^5.3.1":
  version "5.3.2"
  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.2.tgz#ebd8e145cf056db5c66eb1dac63c72f52e8542ee"
  integrity sha512-ELEYRUie2czuJzaZ5+ziIp9Hhw+juEw8b7C11YNA4QdLCVbQ3qLi2l4aq8XnlqM7V31LZX8dxUuFUCrzHm6sqQ==
  dependencies:
    "@types/history" "*"
    "@types/react" "*"
    "@types/react-router" "*"

"@types/react-router@*":
  version "5.1.17"
  resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.17.tgz#087091006213b11042f39570e5cd414863693968"
  integrity sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ==
  dependencies:
    "@types/history" "*"
    "@types/react" "*"

"@types/react-syntax-highlighter@^13.5.2":
  version "13.5.2"
  resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-13.5.2.tgz#357cc03581dc434c57c3b31f70e0eecdbf7b3ab0"
  integrity sha512-sRZoKZBGKaE7CzMvTTgz+0x/aVR58ZYUTfB7HN76vC+yQnvo1FWtzNARBt0fGqcLGEVakEzMu/CtPzssmanu8Q==
  dependencies:
    "@types/react" "*"

"@types/react-transition-group@^4.4.1":
  version "4.4.4"
  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e"
  integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==
  dependencies:
    "@types/react" "*"

"@types/react@*", "@types/react@>=16.0.0", "@types/react@>=16.14.8", "@types/react@>=16.9.11", "@types/react@^17.0.20":
  version "17.0.34"
  resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.34.tgz#797b66d359b692e3f19991b6b07e4b0c706c0102"
  integrity sha512-46FEGrMjc2+8XhHXILr+3+/sTe3OfzSPU9YGKILLrUYbQ1CLQC9Daqo1KzENGXAWwrFwiY0l4ZbF20gRvgpWTg==
  dependencies:
    "@types/prop-types" "*"
    "@types/scheduler" "*"
    csstype "^3.0.2"

"@types/scheduler@*":
  version "0.16.2"
  resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
  integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==

"@types/unist@*", "@types/unist@^2.0.0":
  version "2.0.6"
  resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
  integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==

"@types/warning@^3.0.0":
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52"
  integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=

"@zeit/schemas@2.6.0":
  version "2.6.0"
  resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.6.0.tgz#004e8e553b4cd53d538bd38eac7bcbf58a867fe3"
  integrity sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg==

abab@^2.0.0:
  version "2.0.5"
  resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
  integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==

abortcontroller-polyfill@^1.1.9:
  version "1.7.3"
  resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5"
  integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==

accepts@~1.3.5:
  version "1.3.7"
  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
  integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
  dependencies:
    mime-types "~2.1.24"
    negotiator "0.6.2"

acorn-globals@^4.3.0:
  version "4.3.4"
  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
  integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
  dependencies:
    acorn "^6.0.1"
    acorn-walk "^6.0.1"

acorn-walk@^6.0.1:
  version "6.2.0"
  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
  integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==

acorn@^6.0.1, acorn@^6.0.4:
  version "6.4.2"
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
  integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==

ajv@6.12.6, ajv@^6.12.3:
  version "6.12.6"
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
  integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
  dependencies:
    fast-deep-equal "^3.1.1"
    fast-json-stable-stringify "^2.0.0"
    json-schema-traverse "^0.4.1"
    uri-js "^4.2.2"

alphanum-sort@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
  integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=

ansi-align@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
  integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==
  dependencies:
    string-width "^4.1.0"

ansi-escapes@^4.2.1:
  version "4.3.2"
  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
  integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
  dependencies:
    type-fest "^0.21.3"

ansi-html-community@0.0.8:
  version "0.0.8"
  resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
  integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==

ansi-regex@^2.0.0:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
  integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=

ansi-regex@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
  integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==

ansi-styles@^2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
  integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=

ansi-styles@^3.2.1:
  version "3.2.1"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
  dependencies:
    color-convert "^1.9.0"

ansi-styles@^4.0.0, ansi-styles@^4.1.0:
  version "4.3.0"
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
  dependencies:
    color-convert "^2.0.1"

anymatch@~3.1.2:
  version "3.1.2"
  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
  integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
  dependencies:
    normalize-path "^3.0.0"
    picomatch "^2.0.4"

arch@^2.1.1:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
  integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==

arg@2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545"
  integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w==

array-equal@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
  integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=

array-union@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==

asn1.js@^5.2.0:
  version "5.4.1"
  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
  integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
  dependencies:
    bn.js "^4.0.0"
    inherits "^2.0.1"
    minimalistic-assert "^1.0.0"
    safer-buffer "^2.1.0"

asn1@~0.2.3:
  version "0.2.6"
  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
  integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
  dependencies:
    safer-buffer "~2.1.0"

assert-plus@1.0.0, assert-plus@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
  integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=

assert@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32"
  integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==
  dependencies:
    es6-object-assign "^1.1.0"
    is-nan "^1.2.1"
    object-is "^1.0.1"
    util "^0.12.0"

astral-regex@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
  integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==

astring@^1.6.2:
  version "1.7.5"
  resolved "https://registry.yarnpkg.com/astring/-/astring-1.7.5.tgz#a7d47fceaf32b052d33a3d07c511efeec67447ca"
  integrity sha512-lobf6RWXb8c4uZ7Mdq0U12efYmpD1UFnyOWVJPTa3ukqZrMopav+2hdNu0hgBF0JIBFK9QgrBDfwYvh3DFJDAA==

async-limiter@~1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
  integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==

async@0.9.x:
  version "0.9.2"
  resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
  integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=

asynckit@^0.4.0:
  version "0.4.0"
  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
  integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=

available-typed-arrays@^1.0.5:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
  integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==

aws-sign2@~0.7.0:
  version "0.7.0"
  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
  integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=

aws4@^1.8.0:
  version "1.11.0"
  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
  integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==

bail@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.1.tgz#d676736373a374058a935aec81b94c12ba815771"
  integrity sha512-d5FoTAr2S5DSUPKl85WNm2yUwsINN8eidIdIwsOge2t33DaOfOdSmmsI11jMN3GmALCXaw+Y6HMVHDzePshFAA==

balanced-match@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==

base-x@^3.0.8:
  version "3.0.9"
  resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320"
  integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==
  dependencies:
    safe-buffer "^5.0.1"

base64-js@^1.3.1:
  version "1.5.1"
  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
  integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==

bcrypt-pbkdf@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
  integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
  dependencies:
    tweetnacl "^0.14.3"

big.js@^5.2.2:
  version "5.2.2"
  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==

binary-extensions@^2.0.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
  integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==

bl@^4.1.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
  integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
  dependencies:
    buffer "^5.5.0"
    inherits "^2.0.4"
    readable-stream "^3.4.0"

bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
  version "4.12.0"
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
  integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==

bn.js@^5.0.0, bn.js@^5.1.1:
  version "5.2.0"
  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
  integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==

boolbase@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
  integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=

bootstrap@^5.1.1:
  version "5.1.3"
  resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.1.3.tgz#ba081b0c130f810fa70900acbc1c6d3c28fa8f34"
  integrity sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==

boxen@5.1.2:
  version "5.1.2"
  resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50"
  integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==
  dependencies:
    ansi-align "^3.0.0"
    camelcase "^6.2.0"
    chalk "^4.1.0"
    cli-boxes "^2.2.1"
    string-width "^4.2.2"
    type-fest "^0.20.2"
    widest-line "^3.1.0"
    wrap-ansi "^7.0.0"

brace-expansion@^1.1.7:
  version "1.1.11"
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
  dependencies:
    balanced-match "^1.0.0"
    concat-map "0.0.1"

braces@^3.0.1, braces@~3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
  dependencies:
    fill-range "^7.0.1"

brorand@^1.0.1, brorand@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
  integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=

browser-process-hrtime@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
  integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==

browserify-aes@^1.0.0, browserify-aes@^1.0.4:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
  integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
  dependencies:
    buffer-xor "^1.0.3"
    cipher-base "^1.0.0"
    create-hash "^1.1.0"
    evp_bytestokey "^1.0.3"
    inherits "^2.0.1"
    safe-buffer "^5.0.1"

browserify-cipher@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
  integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
  dependencies:
    browserify-aes "^1.0.4"
    browserify-des "^1.0.0"
    evp_bytestokey "^1.0.0"

browserify-des@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
  integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
  dependencies:
    cipher-base "^1.0.1"
    des.js "^1.0.0"
    inherits "^2.0.1"
    safe-buffer "^5.1.2"

browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
  integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
  dependencies:
    bn.js "^5.0.0"
    randombytes "^2.0.1"

browserify-sign@^4.0.0:
  version "4.2.1"
  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
  integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
  dependencies:
    bn.js "^5.1.1"
    browserify-rsa "^4.0.1"
    create-hash "^1.2.0"
    create-hmac "^1.1.7"
    elliptic "^6.5.3"
    inherits "^2.0.4"
    parse-asn1 "^5.1.5"
    readable-stream "^3.6.0"
    safe-buffer "^5.2.0"

browserify-zlib@^0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
  integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
  dependencies:
    pako "~1.0.5"

browserslist@^4.0.0, browserslist@^4.16.0, browserslist@^4.16.6, browserslist@^4.6.6:
  version "4.17.6"
  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d"
  integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==
  dependencies:
    caniuse-lite "^1.0.30001274"
    electron-to-chromium "^1.3.886"
    escalade "^3.1.1"
    node-releases "^2.0.1"
    picocolors "^1.0.0"

buffer-from@^1.0.0:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
  integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==

buffer-xor@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
  integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=

buffer@^5.5.0:
  version "5.7.1"
  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
  integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
  dependencies:
    base64-js "^1.3.1"
    ieee754 "^1.1.13"

builtin-status-codes@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
  integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=

bytes@3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
  integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=

call-bind@^1.0.0, call-bind@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
  integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
  dependencies:
    function-bind "^1.1.1"
    get-intrinsic "^1.0.2"

callsites@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==

camelcase@^6.2.0:
  version "6.2.0"
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
  integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==

caniuse-api@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
  integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
  dependencies:
    browserslist "^4.0.0"
    caniuse-lite "^1.0.0"
    lodash.memoize "^4.1.2"
    lodash.uniq "^4.5.0"

caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001274:
  version "1.0.30001277"
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001277.tgz#9416dae5e075f47eacd8e0475ae1dcc5a20e9ca5"
  integrity sha512-J2WtYj2Pl6LBEG214XmbGw1gzZEsYuinQFPqYtpZDB3/vm49qNlrcbJrTMkHKmdRDdmXYwkG0tgOBJsuI+J12Q==

caseless@~0.12.0:
  version "0.12.0"
  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
  integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=

ccount@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5"
  integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==

chalk@2.4.1:
  version "2.4.1"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
  integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==
  dependencies:
    ansi-styles "^3.2.1"
    escape-string-regexp "^1.0.5"
    supports-color "^5.3.0"

chalk@^1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
  integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
  dependencies:
    ansi-styles "^2.2.1"
    escape-string-regexp "^1.0.2"
    has-ansi "^2.0.0"
    strip-ansi "^3.0.0"
    supports-color "^2.0.0"

chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
  version "2.4.2"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
  dependencies:
    ansi-styles "^3.2.1"
    escape-string-regexp "^1.0.5"
    supports-color "^5.3.0"

chalk@^4.0.0, chalk@^4.1.0:
  version "4.1.2"
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
  dependencies:
    ansi-styles "^4.1.0"
    supports-color "^7.1.0"

character-entities-legacy@^1.0.0:
  version "1.1.4"
  resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
  integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==

character-entities-legacy@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b"
  integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==

character-entities@^1.0.0:
  version "1.2.4"
  resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
  integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==

character-entities@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.1.tgz#98724833e1e27990dee0bd0f2b8a859c3476aac7"
  integrity sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ==

character-reference-invalid@^1.0.0:
  version "1.1.4"
  resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
  integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==

character-reference-invalid@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9"
  integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==

"chokidar@>=3.0.0 <4.0.0":
  version "3.5.2"
  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
  integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
  dependencies:
    anymatch "~3.1.2"
    braces "~3.0.2"
    glob-parent "~5.1.2"
    is-binary-path "~2.1.0"
    is-glob "~4.0.1"
    normalize-path "~3.0.0"
    readdirp "~3.6.0"
  optionalDependencies:
    fsevents "~2.3.2"

chrome-trace-event@^1.0.2:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
  integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==

cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
  integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
  dependencies:
    inherits "^2.0.1"
    safe-buffer "^5.0.1"

classnames@^2.2.0, classnames@^2.3.1:
  version "2.3.1"
  resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e"
  integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==

cli-boxes@^2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
  integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==

cli-cursor@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
  integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
  dependencies:
    restore-cursor "^3.1.0"

cli-spinners@^2.5.0:
  version "2.6.1"
  resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d"
  integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==

clipboardy@2.3.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290"
  integrity sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==
  dependencies:
    arch "^2.1.1"
    execa "^1.0.0"
    is-wsl "^2.1.1"

clone@^1.0.2:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
  integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=

clone@^2.1.1:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
  integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=

color-convert@^1.9.0:
  version "1.9.3"
  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
  dependencies:
    color-name "1.1.3"

color-convert@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
  dependencies:
    color-name "~1.1.4"

color-name@1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=

color-name@~1.1.4:
  version "1.1.4"
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==

colord@^2.9.1:
  version "2.9.1"
  resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.1.tgz#c961ea0efeb57c9f0f4834458f26cb9cc4a3f90e"
  integrity sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw==

combined-stream@^1.0.6, combined-stream@~1.0.6:
  version "1.0.8"
  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
  dependencies:
    delayed-stream "~1.0.0"

comma-separated-tokens@^1.0.0:
  version "1.0.8"
  resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea"
  integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==

comma-separated-tokens@^2.0.0:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz#d4c25abb679b7751c880be623c1179780fe1dd98"
  integrity sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==

command-exists@^1.2.6:
  version "1.2.9"
  resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69"
  integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==

commander@^2.20.0:
  version "2.20.3"
  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==

commander@^6.0.0:
  version "6.2.1"
  resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
  integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==

commander@^7.0.0, commander@^7.2.0:
  version "7.2.0"
  resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
  integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==

compressible@~2.0.14:
  version "2.0.18"
  resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
  integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
  dependencies:
    mime-db ">= 1.43.0 < 2"

compression@1.7.3:
  version "1.7.3"
  resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db"
  integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==
  dependencies:
    accepts "~1.3.5"
    bytes "3.0.0"
    compressible "~2.0.14"
    debug "2.6.9"
    on-headers "~1.0.1"
    safe-buffer "5.1.2"
    vary "~1.1.2"

compute-scroll-into-view@^1.0.17:
  version "1.0.17"
  resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab"
  integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==

concat-map@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=

connect@^3.7.0:
  version "3.7.0"
  resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8"
  integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==
  dependencies:
    debug "2.6.9"
    finalhandler "1.1.2"
    parseurl "~1.3.3"
    utils-merge "1.0.1"

console-browserify@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
  integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==

constants-browserify@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
  integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=

content-disposition@0.5.2:
  version "0.5.2"
  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
  integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ=

convert-source-map@^1.7.0:
  version "1.8.0"
  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
  integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
  dependencies:
    safe-buffer "~5.1.1"

core-js@^3.2.1:
  version "3.19.1"
  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.1.tgz#f6f173cae23e73a7d88fa23b6e9da329276c6641"
  integrity sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==

core-util-is@1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=

core-util-is@~1.0.0:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
  integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==

cosmiconfig@^7.0.1:
  version "7.0.1"
  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
  integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
  dependencies:
    "@types/parse-json" "^4.0.0"
    import-fresh "^3.2.1"
    parse-json "^5.0.0"
    path-type "^4.0.0"
    yaml "^1.10.0"

create-ecdh@^4.0.0:
  version "4.0.4"
  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
  integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
  dependencies:
    bn.js "^4.1.0"
    elliptic "^6.5.3"

create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
  dependencies:
    cipher-base "^1.0.1"
    inherits "^2.0.1"
    md5.js "^1.3.4"
    ripemd160 "^2.0.1"
    sha.js "^2.4.0"

create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
  version "1.1.7"
  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
  integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
  dependencies:
    cipher-base "^1.0.3"
    create-hash "^1.1.0"
    inherits "^2.0.1"
    ripemd160 "^2.0.0"
    safe-buffer "^5.0.1"
    sha.js "^2.4.8"

cross-spawn@^6.0.0, cross-spawn@^6.0.4:
  version "6.0.5"
  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
  integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
  dependencies:
    nice-try "^1.0.4"
    path-key "^2.0.1"
    semver "^5.5.0"
    shebang-command "^1.2.0"
    which "^1.2.9"

crypto-browserify@^3.12.0:
  version "3.12.0"
  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
  integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
  dependencies:
    browserify-cipher "^1.0.0"
    browserify-sign "^4.0.0"
    create-ecdh "^4.0.0"
    create-hash "^1.1.0"
    create-hmac "^1.1.0"
    diffie-hellman "^5.0.0"
    inherits "^2.0.1"
    pbkdf2 "^3.0.3"
    public-encrypt "^4.0.0"
    randombytes "^2.0.0"
    randomfill "^1.0.3"

css-color-names@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67"
  integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==

css-declaration-sorter@^6.0.3:
  version "6.1.3"
  resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz#e9852e4cf940ba79f509d9425b137d1f94438dc2"
  integrity sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==
  dependencies:
    timsort "^0.3.0"

css-modules-loader-core@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16"
  integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=
  dependencies:
    icss-replace-symbols "1.1.0"
    postcss "6.0.1"
    postcss-modules-extract-imports "1.1.0"
    postcss-modules-local-by-default "1.2.0"
    postcss-modules-scope "1.1.0"
    postcss-modules-values "1.3.0"

css-select@^4.1.3:
  version "4.1.3"
  resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067"
  integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==
  dependencies:
    boolbase "^1.0.0"
    css-what "^5.0.0"
    domhandler "^4.2.0"
    domutils "^2.6.0"
    nth-check "^2.0.0"

css-selector-tokenizer@^0.7.0:
  version "0.7.3"
  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1"
  integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==
  dependencies:
    cssesc "^3.0.0"
    fastparse "^1.1.2"

css-tree@^1.1.2, css-tree@^1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
  dependencies:
    mdn-data "2.0.14"
    source-map "^0.6.1"

css-what@^5.0.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe"
  integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==

cssesc@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
  integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==

cssnano-preset-default@^5.1.5:
  version "5.1.5"
  resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.5.tgz#6effb7175ee5d296f95330e137587e27ee974d44"
  integrity sha512-fF00UI+d3PWkGfMd62geqmoUe5h+LOhGE2GH4Fqq3beNKdCU1LWwLUyIcu4/A72lWv0737cHey5zhhWw3rW0sA==
  dependencies:
    css-declaration-sorter "^6.0.3"
    cssnano-utils "^2.0.1"
    postcss-calc "^8.0.0"
    postcss-colormin "^5.2.1"
    postcss-convert-values "^5.0.2"
    postcss-discard-comments "^5.0.1"
    postcss-discard-duplicates "^5.0.1"
    postcss-discard-empty "^5.0.1"
    postcss-discard-overridden "^5.0.1"
    postcss-merge-longhand "^5.0.2"
    postcss-merge-rules "^5.0.2"
    postcss-minify-font-values "^5.0.1"
    postcss-minify-gradients "^5.0.3"
    postcss-minify-params "^5.0.1"
    postcss-minify-selectors "^5.1.0"
    postcss-normalize-charset "^5.0.1"
    postcss-normalize-display-values "^5.0.1"
    postcss-normalize-positions "^5.0.1"
    postcss-normalize-repeat-style "^5.0.1"
    postcss-normalize-string "^5.0.1"
    postcss-normalize-timing-functions "^5.0.1"
    postcss-normalize-unicode "^5.0.1"
    postcss-normalize-url "^5.0.2"
    postcss-normalize-whitespace "^5.0.1"
    postcss-ordered-values "^5.0.2"
    postcss-reduce-initial "^5.0.1"
    postcss-reduce-transforms "^5.0.1"
    postcss-svgo "^5.0.3"
    postcss-unique-selectors "^5.0.1"

cssnano-utils@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2"
  integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==

cssnano@^5.0.5, cssnano@^5.0.8:
  version "5.0.9"
  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.9.tgz#bd03168835c0883c16754085704f57861a32d99c"
  integrity sha512-Y4olTKBKsPKl5izpcXHRDiB/1rVdbIDM4qVXgEKBt466kYT42SEEsnCYOQFFXzEkUYV8pJNCII9JKzb8KfDk+g==
  dependencies:
    cssnano-preset-default "^5.1.5"
    is-resolvable "^1.1.0"
    lilconfig "^2.0.3"
    yaml "^1.10.2"

csso@^4.2.0:
  version "4.2.0"
  resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
  integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
  dependencies:
    css-tree "^1.1.2"

cssom@0.3.x, cssom@^0.3.4:
  version "0.3.8"
  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
  integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==

cssstyle@^1.1.1:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1"
  integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==
  dependencies:
    cssom "0.3.x"

csstype@^3.0.2:
  version "3.0.9"
  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b"
  integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==

dashdash@^1.12.0:
  version "1.14.1"
  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
  integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
  dependencies:
    assert-plus "^1.0.0"

data-urls@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
  integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
  dependencies:
    abab "^2.0.0"
    whatwg-mimetype "^2.2.0"
    whatwg-url "^7.0.0"

debug@2.6.9:
  version "2.6.9"
  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
  dependencies:
    ms "2.0.0"

debug@^4.0.0, debug@^4.1.0:
  version "4.3.2"
  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
  integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
  dependencies:
    ms "2.1.2"

deep-equal@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
  integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
  dependencies:
    is-arguments "^1.0.4"
    is-date-object "^1.0.1"
    is-regex "^1.0.4"
    object-is "^1.0.1"
    object-keys "^1.1.1"
    regexp.prototype.flags "^1.2.0"

deep-extend@^0.6.0:
  version "0.6.0"
  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
  integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==

deep-is@~0.1.3:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==

defaults@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
  integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
  dependencies:
    clone "^1.0.2"

define-properties@^1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
  integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
  dependencies:
    object-keys "^1.0.12"

delayed-stream@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
  integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=

dequal@^2.0.0, dequal@^2.0.2:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d"
  integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==

des.js@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
  integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
  dependencies:
    inherits "^2.0.1"
    minimalistic-assert "^1.0.0"

detect-libc@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
  integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=

diff@^5.0.0:
  version "5.0.0"
  resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
  integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==

diffie-hellman@^5.0.0:
  version "5.0.3"
  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
  integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
  dependencies:
    bn.js "^4.1.0"
    miller-rabin "^4.0.0"
    randombytes "^2.0.0"

dir-glob@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
  dependencies:
    path-type "^4.0.0"

dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1:
  version "5.2.1"
  resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
  integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
  dependencies:
    "@babel/runtime" "^7.8.7"
    csstype "^3.0.2"

dom-serializer@^1.0.1:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91"
  integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==
  dependencies:
    domelementtype "^2.0.1"
    domhandler "^4.2.0"
    entities "^2.0.0"

domain-browser@^3.5.0:
  version "3.5.0"
  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-3.5.0.tgz#3a11f5df52fd9d60d7f1c79a62fde2d158c42b09"
  integrity sha512-zrzUu6auyZWRexjCEPJnfWc30Hupxh2lJZOJAF3qa2bCuD4O/55t0FvQt3ZMhEw++gjNkwdkOVZh8yA32w/Vfw==

domelementtype@^2.0.1, domelementtype@^2.2.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
  integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==

domexception@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
  integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
  dependencies:
    webidl-conversions "^4.0.2"

domhandler@^4.2.0, domhandler@^4.2.2:
  version "4.2.2"
  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f"
  integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==
  dependencies:
    domelementtype "^2.2.0"

domutils@^2.6.0, domutils@^2.8.0:
  version "2.8.0"
  resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
  integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
  dependencies:
    dom-serializer "^1.0.1"
    domelementtype "^2.2.0"
    domhandler "^4.2.0"

dotenv-expand@^5.1.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
  integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==

dotenv@^7.0.0:
  version "7.0.0"
  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c"
  integrity sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==

ecc-jsbn@~0.1.1:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
  integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
  dependencies:
    jsbn "~0.1.0"
    safer-buffer "^2.1.0"

ee-first@1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
  integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=

ejs@^3.1.6:
  version "3.1.6"
  resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a"
  integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==
  dependencies:
    jake "^10.6.1"

electron-to-chromium@^1.3.886:
  version "1.3.889"
  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.889.tgz#0b7c6f7628559592d5406deda281788f37107790"
  integrity sha512-suEUoPTD1mExjL9TdmH7cvEiWJVM2oEiAi+Y1p0QKxI2HcRlT44qDTP2c1aZmVwRemIPYOpxmV7CxQCOWcm4XQ==

elliptic@^6.5.3:
  version "6.5.4"
  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
  integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
  dependencies:
    bn.js "^4.11.9"
    brorand "^1.1.0"
    hash.js "^1.0.0"
    hmac-drbg "^1.0.1"
    inherits "^2.0.4"
    minimalistic-assert "^1.0.1"
    minimalistic-crypto-utils "^1.0.1"

emoji-regex@^8.0.0:
  version "8.0.0"
  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==

emojis-list@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
  integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==

emphasize@^4.2.0:
  version "4.2.0"
  resolved "https://registry.yarnpkg.com/emphasize/-/emphasize-4.2.0.tgz#6b6fdc4d212cb7eafea1c7cdd595dfd6cfc508d9"
  integrity sha512-yGKvcFUHlBsUPwlxTlzKLR8+zhpbitkFOMCUxN8fTJng9bdH3WNzUGkhdaGdjndSUgqmMPBN7umfwnUdLz5Axg==
  dependencies:
    chalk "^4.0.0"
    highlight.js "~10.4.0"
    lowlight "~1.17.0"

encodeurl@~1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
  integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=

end-of-stream@^1.1.0:
  version "1.4.4"
  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
  dependencies:
    once "^1.4.0"

entities@^2.0.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
  integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==

entities@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4"
  integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==

error-ex@^1.3.1:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
  dependencies:
    is-arrayish "^0.2.1"

es-abstract@^1.18.5:
  version "1.19.1"
  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3"
  integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==
  dependencies:
    call-bind "^1.0.2"
    es-to-primitive "^1.2.1"
    function-bind "^1.1.1"
    get-intrinsic "^1.1.1"
    get-symbol-description "^1.0.0"
    has "^1.0.3"
    has-symbols "^1.0.2"
    internal-slot "^1.0.3"
    is-callable "^1.2.4"
    is-negative-zero "^2.0.1"
    is-regex "^1.1.4"
    is-shared-array-buffer "^1.0.1"
    is-string "^1.0.7"
    is-weakref "^1.0.1"
    object-inspect "^1.11.0"
    object-keys "^1.1.1"
    object.assign "^4.1.2"
    string.prototype.trimend "^1.0.4"
    string.prototype.trimstart "^1.0.4"
    unbox-primitive "^1.0.1"

es-to-primitive@^1.2.1:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
  integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
  dependencies:
    is-callable "^1.1.4"
    is-date-object "^1.0.1"
    is-symbol "^1.0.2"

es6-object-assign@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
  integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=

escalade@^3.1.1:
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
  integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==

escape-html@~1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
  integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=

escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=

escape-string-regexp@^5.0.0:
  version "5.0.0"
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8"
  integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==

escodegen@^1.11.0:
  version "1.14.3"
  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
  integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
  dependencies:
    esprima "^4.0.1"
    estraverse "^4.2.0"
    esutils "^2.0.2"
    optionator "^0.8.1"
  optionalDependencies:
    source-map "~0.6.1"

esprima@^4.0.1:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==

estraverse@^4.2.0:
  version "4.3.0"
  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==

esutils@^2.0.2:
  version "2.0.3"
  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
  integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==

eventemitter3@^4.0.0:
  version "4.0.7"
  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
  integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==

events@^3.1.0:
  version "3.3.0"
  resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
  integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==

evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
  integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
  dependencies:
    md5.js "^1.3.4"
    safe-buffer "^5.1.1"

execa@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
  integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
  dependencies:
    cross-spawn "^6.0.0"
    get-stream "^4.0.0"
    is-stream "^1.1.0"
    npm-run-path "^2.0.0"
    p-finally "^1.0.0"
    signal-exit "^3.0.0"
    strip-eof "^1.0.0"

extend@^3.0.0, extend@~3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==

extsprintf@1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
  integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=

extsprintf@^1.2.0:
  version "1.4.1"
  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
  integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==

fast-deep-equal@^3.1.1:
  version "3.1.3"
  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==

fast-glob@3.1.1:
  version "3.1.1"
  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82"
  integrity sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==
  dependencies:
    "@nodelib/fs.stat" "^2.0.2"
    "@nodelib/fs.walk" "^1.2.3"
    glob-parent "^5.1.0"
    merge2 "^1.3.0"
    micromatch "^4.0.2"

fast-glob@^3.1.1:
  version "3.2.7"
  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
  integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
  dependencies:
    "@nodelib/fs.stat" "^2.0.2"
    "@nodelib/fs.walk" "^1.2.3"
    glob-parent "^5.1.2"
    merge2 "^1.3.0"
    micromatch "^4.0.4"

fast-json-stable-stringify@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
  integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==

fast-levenshtein@~2.0.6:
  version "2.0.6"
  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
  integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=

fast-url-parser@1.1.3:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d"
  integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=
  dependencies:
    punycode "^1.3.2"

fastest-levenshtein@^1.0.8:
  version "1.0.12"
  resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
  integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==

fastparse@^1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
  integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==

fastq@^1.6.0:
  version "1.13.0"
  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
  integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
  dependencies:
    reusify "^1.0.4"

fault@^1.0.0:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
  integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==
  dependencies:
    format "^0.2.0"

filelist@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b"
  integrity sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==
  dependencies:
    minimatch "^3.0.4"

filesize@^6.1.0:
  version "6.4.0"
  resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd"
  integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==

fill-range@^7.0.1:
  version "7.0.1"
  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
  dependencies:
    to-regex-range "^5.0.1"

finalhandler@1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
  integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
  dependencies:
    debug "2.6.9"
    encodeurl "~1.0.2"
    escape-html "~1.0.3"
    on-finished "~2.3.0"
    parseurl "~1.3.3"
    statuses "~1.5.0"
    unpipe "~1.0.0"

follow-redirects@^1.0.0:
  version "1.14.5"
  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381"
  integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==

foreach@^2.0.5:
  version "2.0.5"
  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
  integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=

forever-agent@~0.6.1:
  version "0.6.1"
  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
  integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=

form-data@~2.3.2:
  version "2.3.3"
  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
  integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
  dependencies:
    asynckit "^0.4.0"
    combined-stream "^1.0.6"
    mime-types "^2.1.12"

format@^0.2.0:
  version "0.2.2"
  resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
  integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=

fs.realpath@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=

fsevents@~2.3.2:
  version "2.3.2"
  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
  integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==

function-bind@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==

generic-names@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872"
  integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==
  dependencies:
    loader-utils "^1.1.0"

gensync@^1.0.0-beta.2:
  version "1.0.0-beta.2"
  resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
  integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==

get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
  integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
  dependencies:
    function-bind "^1.1.1"
    has "^1.0.3"
    has-symbols "^1.0.1"

get-port@^4.2.0:
  version "4.2.0"
  resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119"
  integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==

get-stream@^4.0.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
  integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
  dependencies:
    pump "^3.0.0"

get-symbol-description@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
  integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
  dependencies:
    call-bind "^1.0.2"
    get-intrinsic "^1.1.1"

getpass@^0.1.1:
  version "0.1.7"
  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
  integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
  dependencies:
    assert-plus "^1.0.0"

glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.2:
  version "5.1.2"
  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
  dependencies:
    is-glob "^4.0.1"

glob@^7.0.0, glob@^7.1.3, glob@^7.1.4:
  version "7.2.0"
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
  integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
  dependencies:
    fs.realpath "^1.0.0"
    inflight "^1.0.4"
    inherits "2"
    minimatch "^3.0.4"
    once "^1.3.0"
    path-is-absolute "^1.0.0"

globals@^11.1.0:
  version "11.12.0"
  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==

globals@^13.2.0:
  version "13.12.0"
  resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e"
  integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==
  dependencies:
    type-fest "^0.20.2"

globby@^11.0.3:
  version "11.0.4"
  resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
  integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
  dependencies:
    array-union "^2.1.0"
    dir-glob "^3.0.1"
    fast-glob "^3.1.1"
    ignore "^5.1.4"
    merge2 "^1.3.0"
    slash "^3.0.0"

graceful-fs@^4.1.2, graceful-fs@^4.2.4:
  version "4.2.8"
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
  integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==

gud@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
  integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==

har-schema@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
  integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=

har-validator@~5.1.3:
  version "5.1.5"
  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
  integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
  dependencies:
    ajv "^6.12.3"
    har-schema "^2.0.0"

has-ansi@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
  integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
  dependencies:
    ansi-regex "^2.0.0"

has-bigints@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
  integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==

has-flag@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
  integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=

has-flag@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=

has-flag@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==

has-symbols@^1.0.1, has-symbols@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
  integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==

has-tostringtag@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
  integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
  dependencies:
    has-symbols "^1.0.2"

has@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
  integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
  dependencies:
    function-bind "^1.1.1"

hash-base@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
  integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
  dependencies:
    inherits "^2.0.4"
    readable-stream "^3.6.0"
    safe-buffer "^5.2.0"

hash.js@^1.0.0, hash.js@^1.0.3:
  version "1.1.7"
  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
  integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
  dependencies:
    inherits "^2.0.3"
    minimalistic-assert "^1.0.1"

hast-util-parse-selector@^2.0.0:
  version "2.2.5"
  resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a"
  integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==

hast-util-whitespace@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c"
  integrity sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==

hastscript@^6.0.0:
  version "6.0.0"
  resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640"
  integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==
  dependencies:
    "@types/hast" "^2.0.0"
    comma-separated-tokens "^1.0.0"
    hast-util-parse-selector "^2.0.0"
    property-information "^5.0.0"
    space-separated-tokens "^1.0.0"

highlight.js@^10.4.1, highlight.js@~10.7.0:
  version "10.7.3"
  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
  integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==

highlight.js@~10.4.0:
  version "10.4.1"
  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.1.tgz#d48fbcf4a9971c4361b3f95f302747afe19dbad0"
  integrity sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg==

history@^5.0.3:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/history/-/history-5.1.0.tgz#2e93c09c064194d38d52ed62afd0afc9d9b01ece"
  integrity sha512-zPuQgPacm2vH2xdORvGGz1wQMuHSIB56yNAy5FnLuwOwgSYyPKptJtcMm6Ev+hRGeS+GzhbmRacHzvlESbFwDg==
  dependencies:
    "@babel/runtime" "^7.7.6"

hmac-drbg@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
  integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
  dependencies:
    hash.js "^1.0.3"
    minimalistic-assert "^1.0.0"
    minimalistic-crypto-utils "^1.0.1"

html-encoding-sniffer@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
  integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
  dependencies:
    whatwg-encoding "^1.0.1"

html-tags@^1.0.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-1.2.0.tgz#c78de65b5663aa597989dd2b7ab49200d7e4db98"
  integrity sha1-x43mW1Zjqll5id0rerSSANfk25g=

htmlnano@^1.0.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-1.1.1.tgz#aea50e1d7ac156370ea766d4cd75f2d3d1a953cc"
  integrity sha512-diMNyqTPx4uGwlxrTs0beZCy8L/GxGIFGHWv20OYhthLcdYkDOP/d4Ja5MbGgVJZMakZUM21KpMk5qWZrBGSdw==
  dependencies:
    cosmiconfig "^7.0.1"
    cssnano "^5.0.8"
    postcss "^8.3.6"
    posthtml "^0.16.5"
    purgecss "^4.0.0"
    relateurl "^0.2.7"
    srcset "^4.0.0"
    svgo "^2.6.1"
    terser "^5.8.0"
    timsort "^0.3.0"
    uncss "^0.17.3"

htmlparser2@^7.1.1:
  version "7.1.2"
  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.1.2.tgz#587923d38f03bc89e03076e00cba2c7473f37f7c"
  integrity sha512-d6cqsbJba2nRdg8WW2okyD4ceonFHn9jLFxhwlNcLhQWcFPdxXeJulgOLjLKtAK9T6ahd+GQNZwG9fjmGW7lyg==
  dependencies:
    domelementtype "^2.0.1"
    domhandler "^4.2.2"
    domutils "^2.8.0"
    entities "^3.0.1"

http-proxy-middleware@^1.0.0:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665"
  integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==
  dependencies:
    "@types/http-proxy" "^1.17.5"
    http-proxy "^1.18.1"
    is-glob "^4.0.1"
    is-plain-obj "^3.0.0"
    micromatch "^4.0.2"

http-proxy@^1.18.1:
  version "1.18.1"
  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
  integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
  dependencies:
    eventemitter3 "^4.0.0"
    follow-redirects "^1.0.0"
    requires-port "^1.0.0"

http-signature@~1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
  integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
  dependencies:
    assert-plus "^1.0.0"
    jsprim "^1.2.2"
    sshpk "^1.7.0"

https-browserify@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
  integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=

human-time@0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/human-time/-/human-time-0.0.1.tgz#280d0336379199306b2e1518e3d5f6381cb8507d"
  integrity sha1-KA0DNjeRmTBrLhUY49X2OBy4UH0=

iconv-lite@0.4.24:
  version "0.4.24"
  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
  dependencies:
    safer-buffer ">= 2.1.2 < 3"

icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
  integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=

icss-utils@^4.0.0, icss-utils@^4.1.1:
  version "4.1.1"
  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
  integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
  dependencies:
    postcss "^7.0.14"

ieee754@^1.1.13:
  version "1.2.1"
  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
  integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==

iferr@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/iferr/-/iferr-1.0.2.tgz#e9fde49a9da06dc4a4194c6c9ed6d08305037a6d"
  integrity sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg==

ignore@^5.1.4:
  version "5.1.9"
  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb"
  integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==

import-fresh@^3.2.1:
  version "3.3.0"
  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
  integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
  dependencies:
    parent-module "^1.0.0"
    resolve-from "^4.0.0"

imurmurhash@^0.1.4:
  version "0.1.4"
  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
  integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=

indexes-of@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
  integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=

inflight@^1.0.4:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
  dependencies:
    once "^1.3.0"
    wrappy "1"

inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4:
  version "2.0.4"
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==

ini@~1.3.0:
  version "1.3.8"
  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
  integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==

inline-style-parser@0.1.1:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1"
  integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==

internal-slot@^1.0.3:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
  integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
  dependencies:
    get-intrinsic "^1.1.0"
    has "^1.0.3"
    side-channel "^1.0.4"

invariant@^2.2.1, invariant@^2.2.4:
  version "2.2.4"
  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
  integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
  dependencies:
    loose-envify "^1.0.0"

is-absolute-url@^3.0.1, is-absolute-url@^3.0.3:
  version "3.0.3"
  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
  integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==

is-alphabetical@^1.0.0:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
  integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==

is-alphabetical@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b"
  integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==

is-alphanumerical@^1.0.0:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
  integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
  dependencies:
    is-alphabetical "^1.0.0"
    is-decimal "^1.0.0"

is-alphanumerical@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875"
  integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==
  dependencies:
    is-alphabetical "^2.0.0"
    is-decimal "^2.0.0"

is-arguments@^1.0.4:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
  integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
  dependencies:
    call-bind "^1.0.2"
    has-tostringtag "^1.0.0"

is-arrayish@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
  integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=

is-bigint@^1.0.1:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
  integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
  dependencies:
    has-bigints "^1.0.1"

is-binary-path@~2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
  integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
  dependencies:
    binary-extensions "^2.0.0"

is-boolean-object@^1.1.0:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
  integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
  dependencies:
    call-bind "^1.0.2"
    has-tostringtag "^1.0.0"

is-buffer@^2.0.0:
  version "2.0.5"
  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
  integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==

is-callable@^1.1.4, is-callable@^1.2.4:
  version "1.2.4"
  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
  integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==

is-date-object@^1.0.1:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
  integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
  dependencies:
    has-tostringtag "^1.0.0"

is-decimal@^1.0.0:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
  integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==

is-decimal@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7"
  integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==

is-docker@^2.0.0:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
  integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==

is-extglob@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=

is-fullwidth-code-point@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==

is-generator-function@^1.0.7:
  version "1.0.10"
  resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
  integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
  dependencies:
    has-tostringtag "^1.0.0"

is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
  version "4.0.3"
  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
  dependencies:
    is-extglob "^2.1.1"

is-hexadecimal@^1.0.0:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
  integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==

is-hexadecimal@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027"
  integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==

is-html@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464"
  integrity sha1-4E8cGNOUhRETlvmgJz6rUa8hhGQ=
  dependencies:
    html-tags "^1.0.0"

is-interactive@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
  integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==

is-json@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/is-json/-/is-json-2.0.1.tgz#6be166d144828a131d686891b983df62c39491ff"
  integrity sha1-a+Fm0USCihMdaGiRuYPfYsOUkf8=

is-nan@^1.2.1:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d"
  integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==
  dependencies:
    call-bind "^1.0.0"
    define-properties "^1.1.3"

is-negative-zero@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
  integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==

is-number-object@^1.0.4:
  version "1.0.6"
  resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
  integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==
  dependencies:
    has-tostringtag "^1.0.0"

is-number@^7.0.0:
  version "7.0.0"
  resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==

is-plain-obj@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7"
  integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==

is-plain-obj@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22"
  integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==

is-regex@^1.0.4, is-regex@^1.1.4:
  version "1.1.4"
  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
  integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
  dependencies:
    call-bind "^1.0.2"
    has-tostringtag "^1.0.0"

is-resolvable@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
  integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==

is-shared-array-buffer@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
  integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==

is-stream@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
  integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=

is-string@^1.0.5, is-string@^1.0.7:
  version "1.0.7"
  resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
  integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
  dependencies:
    has-tostringtag "^1.0.0"

is-symbol@^1.0.2, is-symbol@^1.0.3:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
  integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
  dependencies:
    has-symbols "^1.0.2"

is-typed-array@^1.1.3, is-typed-array@^1.1.7:
  version "1.1.8"
  resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79"
  integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==
  dependencies:
    available-typed-arrays "^1.0.5"
    call-bind "^1.0.2"
    es-abstract "^1.18.5"
    foreach "^2.0.5"
    has-tostringtag "^1.0.0"

is-typedarray@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=

is-unicode-supported@^0.1.0:
  version "0.1.0"
  resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
  integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==

is-url@^1.2.2:
  version "1.2.4"
  resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
  integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==

is-weakref@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2"
  integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==
  dependencies:
    call-bind "^1.0.0"

is-wsl@^2.1.1:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
  dependencies:
    is-docker "^2.0.0"

isarray@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=

isexe@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=

isstream@~0.1.2:
  version "0.1.2"
  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
  integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=

jake@^10.6.1:
  version "10.8.2"
  resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b"
  integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==
  dependencies:
    async "0.9.x"
    chalk "^2.4.2"
    filelist "^1.0.1"
    minimatch "^3.0.4"

"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==

jsbn@~0.1.0:
  version "0.1.1"
  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
  integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=

jsdom@^14.1.0:
  version "14.1.0"
  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b"
  integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==
  dependencies:
    abab "^2.0.0"
    acorn "^6.0.4"
    acorn-globals "^4.3.0"
    array-equal "^1.0.0"
    cssom "^0.3.4"
    cssstyle "^1.1.1"
    data-urls "^1.1.0"
    domexception "^1.0.1"
    escodegen "^1.11.0"
    html-encoding-sniffer "^1.0.2"
    nwsapi "^2.1.3"
    parse5 "5.1.0"
    pn "^1.1.0"
    request "^2.88.0"
    request-promise-native "^1.0.5"
    saxes "^3.1.9"
    symbol-tree "^3.2.2"
    tough-cookie "^2.5.0"
    w3c-hr-time "^1.0.1"
    w3c-xmlserializer "^1.1.2"
    webidl-conversions "^4.0.2"
    whatwg-encoding "^1.0.5"
    whatwg-mimetype "^2.3.0"
    whatwg-url "^7.0.0"
    ws "^6.1.2"
    xml-name-validator "^3.0.0"

jsesc@^2.5.1:
  version "2.5.2"
  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==

json-parse-even-better-errors@^2.3.0:
  version "2.3.1"
  resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
  integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==

json-schema-traverse@^0.4.1:
  version "0.4.1"
  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
  integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==

json-schema@0.2.3:
  version "0.2.3"
  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
  integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=

json-source-map@^0.6.1:
  version "0.6.1"
  resolved "https://registry.yarnpkg.com/json-source-map/-/json-source-map-0.6.1.tgz#e0b1f6f4ce13a9ad57e2ae165a24d06e62c79a0f"
  integrity sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==

json-stringify-safe@~5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
  integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=

json5@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
  integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
  dependencies:
    minimist "^1.2.0"

json5@^2.1.0, json5@^2.1.2:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
  integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
  dependencies:
    minimist "^1.2.5"

jsprim@^1.2.2:
  version "1.4.1"
  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
  integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
  dependencies:
    assert-plus "1.0.0"
    extsprintf "1.3.0"
    json-schema "0.2.3"
    verror "1.10.0"

kleur@^4.0.3:
  version "4.1.4"
  resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d"
  integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==

levn@~0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
  integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
  dependencies:
    prelude-ls "~1.1.2"
    type-check "~0.3.2"

lilconfig@^2.0.3:
  version "2.0.3"
  resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd"
  integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==

lines-and-columns@^1.1.6:
  version "1.1.6"
  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
  integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=

lmdb-store@^1.5.5:
  version "1.6.12"
  resolved "https://registry.yarnpkg.com/lmdb-store/-/lmdb-store-1.6.12.tgz#95edc584992b558632a95ad82dc429be89dcabe9"
  integrity sha512-zFQS4J0dmMamAH+oF1keWS7MlYW4rjX3+qsYvpZu5jU9AR2vSRnzMRFrc/R94uwOkyMptR7hT2fzqaQ/DcrDeg==
  dependencies:
    nan "^2.14.2"
    node-gyp-build "^4.2.3"
    ordered-binary "^1.0.0"
    weak-lru-cache "^1.0.0"
  optionalDependencies:
    msgpackr "^1.4.7"

loader-utils@^1.1.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
  integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
  dependencies:
    big.js "^5.2.2"
    emojis-list "^3.0.0"
    json5 "^1.0.1"

lodash.camelcase@^4.3.0:
  version "4.3.0"
  resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
  integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=

lodash.clone@^4.5.0:
  version "4.5.0"
  resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
  integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=

lodash.debounce@^4.0.8:
  version "4.0.8"
  resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
  integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=

lodash.memoize@^4.1.2:
  version "4.1.2"
  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
  integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=

lodash.sortby@^4.7.0:
  version "4.7.0"
  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
  integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=

lodash.uniq@^4.5.0:
  version "4.5.0"
  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
  integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=

lodash@^4.17.15, lodash@^4.17.19:
  version "4.17.21"
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==

log-symbols@^4.1.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
  integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
  dependencies:
    chalk "^4.1.0"
    is-unicode-supported "^0.1.0"

longest-streak@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.0.1.tgz#c97315b7afa0e7d9525db9a5a2953651432bdc5d"
  integrity sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==

loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
  integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
  dependencies:
    js-tokens "^3.0.0 || ^4.0.0"

lowlight@^1.17.0:
  version "1.20.0"
  resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888"
  integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==
  dependencies:
    fault "^1.0.0"
    highlight.js "~10.7.0"

lowlight@~1.17.0:
  version "1.17.0"
  resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.17.0.tgz#a1143b2fba8239df8cd5893f9fe97aaf8465af4a"
  integrity sha512-vmtBgYKD+QVNy7tIa7ulz5d//Il9R4MooOVh4nkOf9R9Cb/Dk5TXMSTieg/vDulkBkIWj59/BIlyFQxT9X1oAQ==
  dependencies:
    fault "^1.0.0"
    highlight.js "~10.4.0"

lru-cache@^6.0.0:
  version "6.0.0"
  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
  dependencies:
    yallist "^4.0.0"

markdown-table@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.1.tgz#88c48957aaf2a8014ccb2ba026776a1d736fe3dc"
  integrity sha512-CBbaYXKSGnE1uLRpKA1SWgIRb2PQrpkllNWpZtZe6VojOJ4ysqiq7/2glYcmKsOYN09QgH/HEBX5hIshAeiK6A==

md5.js@^1.3.4:
  version "1.3.5"
  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
  integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
  dependencies:
    hash-base "^3.0.0"
    inherits "^2.0.1"
    safe-buffer "^5.1.2"

mdast-util-definitions@^5.0.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz#b6d10ef00a3c4cf191e8d9a5fa58d7f4a366f817"
  integrity sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ==
  dependencies:
    "@types/mdast" "^3.0.0"
    "@types/unist" "^2.0.0"
    unist-util-visit "^3.0.0"

mdast-util-find-and-replace@^2.0.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.1.0.tgz#69728acd250749f8aac6e150e07d1fd15619e829"
  integrity sha512-1w1jbqAd13oU78QPBf5223+xB+37ecNtQ1JElq2feWols5oEYAl+SgNDnOZipe7NfLemoEt362yUS15/wip4mw==
  dependencies:
    escape-string-regexp "^5.0.0"
    unist-util-is "^5.0.0"
    unist-util-visit-parents "^4.0.0"

mdast-util-from-markdown@^1.0.0:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.0.4.tgz#b1fefae59cf4a6368779e01b7e830281ee277532"
  integrity sha512-BlL42o885QO+6o43ceoc6KBdp/bi9oYyamj0hUbeu730yhP1WDC7m2XYSBfmQkOb0TdoHSAJ3de3SMqse69u+g==
  dependencies:
    "@types/mdast" "^3.0.0"
    "@types/unist" "^2.0.0"
    mdast-util-to-string "^3.1.0"
    micromark "^3.0.0"
    micromark-util-decode-numeric-character-reference "^1.0.0"
    micromark-util-decode-string "^1.0.0"
    micromark-util-normalize-identifier "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"
    parse-entities "^3.0.0"
    unist-util-stringify-position "^3.0.0"
    uvu "^0.5.0"

mdast-util-gfm-autolink-literal@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz#4032dcbaddaef7d4f2f3768ed830475bb22d3970"
  integrity sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==
  dependencies:
    "@types/mdast" "^3.0.0"
    ccount "^2.0.0"
    mdast-util-find-and-replace "^2.0.0"
    micromark-util-character "^1.0.0"

mdast-util-gfm-footnote@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.0.tgz#355c1e8dc9e17e871d1b3fa5da8824923fc756e0"
  integrity sha512-qeg9YoS2YYP6OBmMyUFxKXb6BLwAsbGidIxgwDAXHIMYZQhIwe52L9BSJs+zP29Jp5nSERPkmG3tSwAN23/ZbQ==
  dependencies:
    "@types/mdast" "^3.0.0"
    mdast-util-to-markdown "^1.0.0"
    micromark-util-normalize-identifier "^1.0.0"
    unist-util-visit "^4.0.0"

mdast-util-gfm-strikethrough@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.0.tgz#6cc72ef5d9539f4cee76af3f15dd0daa9e3af40f"
  integrity sha512-gM9ipBUdRxYa6Yq1Hd8Otg6jEn/dRxFZ1F9ZX4QHosHOexLGqNZO2dh0A+YFbUEd10RcKjnjb4jOfJJzoXXUew==
  dependencies:
    "@types/mdast" "^3.0.3"
    mdast-util-to-markdown "^1.0.0"

mdast-util-gfm-table@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.1.tgz#07c269a219d66ec2deb6de38aed0ba1d1f9442df"
  integrity sha512-NByKuaSg5+M6r9DZBPXFUmhMHGFf9u+WE76EeStN01ghi8hpnydiWBXr+qj0XCRWI7SAMNtEjGvip6zci9axQA==
  dependencies:
    markdown-table "^3.0.0"
    mdast-util-to-markdown "^1.0.0"

mdast-util-gfm-task-list-item@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.0.tgz#a0aa2a00c893f9f006d13ba096cbc64608559c7f"
  integrity sha512-dwkzOTjQe8JCCHVE3Cb0pLHTYLudf7t9WCAnb20jI8/dW+VHjgWhjtIUVA3oigNkssgjEwX+i+3XesUdCnXGyA==
  dependencies:
    "@types/mdast" "^3.0.3"
    mdast-util-to-markdown "^1.0.0"

mdast-util-gfm@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.0.tgz#2545856bc18a66d5cc63fbef0b097a020a8e9e3d"
  integrity sha512-wMwejlTN3EQADPFuvxe8lmGsay3+f6gSJKdAHR6KBJzpcxvsjJSILB9K6u6G7eQLC7iOTyVIHYGui9uBc9r1Tg==
  dependencies:
    mdast-util-gfm-autolink-literal "^1.0.0"
    mdast-util-gfm-footnote "^1.0.0"
    mdast-util-gfm-strikethrough "^1.0.0"
    mdast-util-gfm-table "^1.0.0"
    mdast-util-gfm-task-list-item "^1.0.0"

mdast-util-to-hast@^11.0.0:
  version "11.3.0"
  resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-11.3.0.tgz#ea9220617a710e80aa5cc3ac7cc9d4bb0440ae7a"
  integrity sha512-4o3Cli3hXPmm1LhB+6rqhfsIUBjnKFlIUZvudaermXB+4/KONdd/W4saWWkC+LBLbPMqhFSSTSRgafHsT5fVJw==
  dependencies:
    "@types/hast" "^2.0.0"
    "@types/mdast" "^3.0.0"
    "@types/mdurl" "^1.0.0"
    mdast-util-definitions "^5.0.0"
    mdurl "^1.0.0"
    unist-builder "^3.0.0"
    unist-util-generated "^2.0.0"
    unist-util-position "^4.0.0"
    unist-util-visit "^4.0.0"

mdast-util-to-markdown@^1.0.0:
  version "1.2.4"
  resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.2.4.tgz#f67173bb95526a4d93454021aa4602f165ad3858"
  integrity sha512-Wive3NvrNS4OY5yYKBADdK1QSlbJUZyZ2ssanITUzNQ7sxMfBANTVjLrAA9BFXshaeG9G77xpOK/z+TTret5Hg==
  dependencies:
    "@types/mdast" "^3.0.0"
    "@types/unist" "^2.0.0"
    longest-streak "^3.0.0"
    mdast-util-to-string "^3.0.0"
    micromark-util-decode-string "^1.0.0"
    unist-util-visit "^4.0.0"
    zwitch "^2.0.0"

mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9"
  integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==

mdn-data@2.0.14:
  version "2.0.14"
  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
  integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==

mdurl@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
  integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=

merge2@^1.3.0:
  version "1.4.1"
  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==

micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.4.tgz#fee459d29c5912a32f059c3a9836d4318ac85f30"
  integrity sha512-HAtoZisp1M/sQFuw2zoUKGo1pMKod7GSvdM6B2oBU0U2CEN5/C6Tmydmi1rmvEieEhGQsjMyiiSoYgxISNxGFA==
  dependencies:
    micromark-factory-destination "^1.0.0"
    micromark-factory-label "^1.0.0"
    micromark-factory-space "^1.0.0"
    micromark-factory-title "^1.0.0"
    micromark-factory-whitespace "^1.0.0"
    micromark-util-character "^1.0.0"
    micromark-util-chunked "^1.0.0"
    micromark-util-classify-character "^1.0.0"
    micromark-util-html-tag-name "^1.0.0"
    micromark-util-normalize-identifier "^1.0.0"
    micromark-util-resolve-all "^1.0.0"
    micromark-util-subtokenize "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.1"
    parse-entities "^3.0.0"
    uvu "^0.5.0"

micromark-extension-gfm-autolink-literal@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.2.tgz#aafadc9ef2f8078d359eb635f144d913c669e0f6"
  integrity sha512-z2Asd0v4iV/QoI1l23J1qB6G8IqVWTKmwdlP45YQfdGW47ZzpddyzSxZ78YmlucOLqIbS5H98ekKf9GunFfnLA==
  dependencies:
    micromark-util-character "^1.0.0"
    micromark-util-sanitize-uri "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"
    uvu "^0.5.0"

micromark-extension-gfm-footnote@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.2.tgz#cd6309f842db8859556b3708302abc7721351b5f"
  integrity sha512-C6o+B7w1wDM4JjDJeHCTszFYF1q46imElNY6mfXsBfw4E91M9TvEEEt3sy0FbJmGVzdt1pqFVRYWT9ZZ0FjFuA==
  dependencies:
    micromark-core-commonmark "^1.0.0"
    micromark-factory-space "^1.0.0"
    micromark-util-character "^1.0.0"
    micromark-util-normalize-identifier "^1.0.0"
    micromark-util-sanitize-uri "^1.0.0"
    micromark-util-symbol "^1.0.0"
    uvu "^0.5.0"

micromark-extension-gfm-strikethrough@^1.0.0:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.3.tgz#010900cfc9a2bf35d2859612c356a21d7fb19af5"
  integrity sha512-PJKhBNyrNIo694ZQCE/FBBQOQSb6YC0Wi5Sv0OCah5XunnNaYbtak9CSv9/eq4YeFMMyd1jX84IRwUSE+7ioLA==
  dependencies:
    micromark-util-chunked "^1.0.0"
    micromark-util-classify-character "^1.0.0"
    micromark-util-resolve-all "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"
    uvu "^0.5.0"

micromark-extension-gfm-table@^1.0.0:
  version "1.0.3"
  resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.3.tgz#4761e35e3d21bde691aa06313406e1124a319239"
  integrity sha512-JIfE1DGi64zzOx39/pGg6cZbiaUAF/MXbBLZnVl4aFz6Mja7GYMZjksfTGm9NzbgZkiZvbD77NLPuwGIRcFMjg==
  dependencies:
    micromark-factory-space "^1.0.0"
    micromark-util-character "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"
    uvu "^0.5.0"

micromark-extension-gfm-tagfilter@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.0.tgz#a38c7c462c2007b534fcb485e9310165879654a7"
  integrity sha512-GGUZhzQrOdHR8RHU2ru6K+4LMlj+pBdNuXRtw5prOflDOk2hHqDB0xEgej1AHJ2VETeycX7tzQh2EmaTUOmSKg==
  dependencies:
    micromark-util-types "^1.0.0"

micromark-extension-gfm-task-list-item@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.2.tgz#953c1cd565df864790815c3a162d452d004255ed"
  integrity sha512-8AZib9xxPtppTKig/d00i9uKi96kVgoqin7+TRtGprDb8uTUrN1ZfJ38ga8yUdmu7EDQxr2xH8ltZdbCcmdshg==
  dependencies:
    micromark-factory-space "^1.0.0"
    micromark-util-character "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"
    uvu "^0.5.0"

micromark-extension-gfm@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.0.tgz#d9d1b82967f43c346a335864060c16b735e3861f"
  integrity sha512-yYPlZ48Ss8fRFSmlQP/QXt3/M6tEvawEVFO+jDPnFA3mGeVgzIyaeHgrIV/9AMFAjQhctKA47Bk8xBhcuaL74Q==
  dependencies:
    micromark-extension-gfm-autolink-literal "^1.0.0"
    micromark-extension-gfm-footnote "^1.0.0"
    micromark-extension-gfm-strikethrough "^1.0.0"
    micromark-extension-gfm-table "^1.0.0"
    micromark-extension-gfm-tagfilter "^1.0.0"
    micromark-extension-gfm-task-list-item "^1.0.0"
    micromark-util-combine-extensions "^1.0.0"
    micromark-util-types "^1.0.0"

micromark-factory-destination@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e"
  integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==
  dependencies:
    micromark-util-character "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"

micromark-factory-label@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137"
  integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==
  dependencies:
    micromark-util-character "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"
    uvu "^0.5.0"

micromark-factory-space@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633"
  integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==
  dependencies:
    micromark-util-character "^1.0.0"
    micromark-util-types "^1.0.0"

micromark-factory-title@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f"
  integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==
  dependencies:
    micromark-factory-space "^1.0.0"
    micromark-util-character "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"
    uvu "^0.5.0"

micromark-factory-whitespace@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c"
  integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==
  dependencies:
    micromark-factory-space "^1.0.0"
    micromark-util-character "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"

micromark-util-character@^1.0.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86"
  integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==
  dependencies:
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"

micromark-util-chunked@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06"
  integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==
  dependencies:
    micromark-util-symbol "^1.0.0"

micromark-util-classify-character@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20"
  integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==
  dependencies:
    micromark-util-character "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"

micromark-util-combine-extensions@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5"
  integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==
  dependencies:
    micromark-util-chunked "^1.0.0"
    micromark-util-types "^1.0.0"

micromark-util-decode-numeric-character-reference@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946"
  integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==
  dependencies:
    micromark-util-symbol "^1.0.0"

micromark-util-decode-string@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.1.tgz#fa779dcef7f2dc2c9e4b759abd85e553674eea4f"
  integrity sha512-Wf3H6jLaO3iIlHEvblESXaKAr72nK7JtBbLLICPwuZc3eJkMcp4j8rJ5Xv1VbQWMCWWDvKUbVUbE2MfQNznwTA==
  dependencies:
    micromark-util-character "^1.0.0"
    micromark-util-decode-numeric-character-reference "^1.0.0"
    micromark-util-symbol "^1.0.0"
    parse-entities "^3.0.0"

micromark-util-encode@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.0.tgz#c409ecf751a28aa9564b599db35640fccec4c068"
  integrity sha512-cJpFVM768h6zkd8qJ1LNRrITfY4gwFt+tziPcIf71Ui8yFzY9wG3snZQqiWVq93PG4Sw6YOtcNiKJfVIs9qfGg==

micromark-util-html-tag-name@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz#75737e92fef50af0c6212bd309bc5cb8dbd489ed"
  integrity sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==

micromark-util-normalize-identifier@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828"
  integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==
  dependencies:
    micromark-util-symbol "^1.0.0"

micromark-util-resolve-all@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88"
  integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==
  dependencies:
    micromark-util-types "^1.0.0"

micromark-util-sanitize-uri@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz#27dc875397cd15102274c6c6da5585d34d4f12b2"
  integrity sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==
  dependencies:
    micromark-util-character "^1.0.0"
    micromark-util-encode "^1.0.0"
    micromark-util-symbol "^1.0.0"

micromark-util-subtokenize@^1.0.0:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105"
  integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==
  dependencies:
    micromark-util-chunked "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.0"
    uvu "^0.5.0"

micromark-util-symbol@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.0.tgz#91cdbcc9b2a827c0129a177d36241bcd3ccaa34d"
  integrity sha512-NZA01jHRNCt4KlOROn8/bGi6vvpEmlXld7EHcRH+aYWUfL3Wc8JLUNNlqUMKa0hhz6GrpUWsHtzPmKof57v0gQ==

micromark-util-types@^1.0.0, micromark-util-types@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.1.tgz#8bb8a092d93d326bd29fe29602799f2d0d922fd4"
  integrity sha512-UT0ylWEEy80RFYzK9pEaugTqaxoD/j0Y9WhHpSyitxd99zjoQz7JJ+iKuhPAgOW2MiPSUAx+c09dcqokeyaROA==

micromark@^3.0.0:
  version "3.0.7"
  resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.0.7.tgz#036dfc974ddf8e6e773b197839c5671d92d0928c"
  integrity sha512-67ipZ2CzQVsDyH1kqNLh7dLwe5QMPJwjFBGppW7JCLByaSc6ZufV0ywPOxt13MIDAzzmj3wctDL6Ov5w0fOHXw==
  dependencies:
    "@types/debug" "^4.0.0"
    debug "^4.0.0"
    micromark-core-commonmark "^1.0.1"
    micromark-factory-space "^1.0.0"
    micromark-util-character "^1.0.0"
    micromark-util-chunked "^1.0.0"
    micromark-util-combine-extensions "^1.0.0"
    micromark-util-decode-numeric-character-reference "^1.0.0"
    micromark-util-encode "^1.0.0"
    micromark-util-normalize-identifier "^1.0.0"
    micromark-util-resolve-all "^1.0.0"
    micromark-util-sanitize-uri "^1.0.0"
    micromark-util-subtokenize "^1.0.0"
    micromark-util-symbol "^1.0.0"
    micromark-util-types "^1.0.1"
    parse-entities "^3.0.0"
    uvu "^0.5.0"

micromatch@^4.0.2, micromatch@^4.0.4:
  version "4.0.4"
  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
  integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
  dependencies:
    braces "^3.0.1"
    picomatch "^2.2.3"

miller-rabin@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
  integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
  dependencies:
    bn.js "^4.0.0"
    brorand "^1.0.1"

mime-db@1.50.0, "mime-db@>= 1.43.0 < 2":
  version "1.50.0"
  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f"
  integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==

mime-db@~1.33.0:
  version "1.33.0"
  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
  integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==

mime-types@2.1.18:
  version "2.1.18"
  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
  integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==
  dependencies:
    mime-db "~1.33.0"

mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24:
  version "2.1.33"
  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb"
  integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==
  dependencies:
    mime-db "1.50.0"

mimic-fn@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==

minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
  integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==

minimalistic-crypto-utils@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=

minimatch@3.0.4, minimatch@^3.0.4:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
  dependencies:
    brace-expansion "^1.1.7"

minimist@^1.2.0, minimist@^1.2.5:
  version "1.2.5"
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
  integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==

mkdirp@^0.5.1:
  version "0.5.5"
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
  integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
  dependencies:
    minimist "^1.2.5"

mri@^1.1.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
  integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==

ms@2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=

ms@2.1.2:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==

msgpackr-extract@^1.0.14:
  version "1.0.15"
  resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-1.0.15.tgz#3010a3ff0b033782d525116071b6c32864a79db2"
  integrity sha512-vgJgzFva0/4/mt84wXf3CRCDPHKqiqk5t7/kVSjk/V2IvwSjoStHhxyq/b2+VrWcch3sxiNQOJEWXgI86Fm7AQ==
  dependencies:
    nan "^2.14.2"
    node-gyp-build "^4.2.3"

msgpackr@^1.4.7:
  version "1.4.7"
  resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.4.7.tgz#d802ade841e7d2e873000b491cdda6574a3d5748"
  integrity sha512-bhC8Ed1au3L3oHaR/fe4lk4w7PLGFcWQ5XY/Tk9N6tzDRz8YndjCG68TD8zcvYZoxNtw767eF/7VpaTpU9kf9w==
  optionalDependencies:
    msgpackr-extract "^1.0.14"

nan@^2.14.2:
  version "2.15.0"
  resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
  integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==

nanoid@^3.1.30:
  version "3.1.30"
  resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362"
  integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==

ncp@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
  integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=

negotiator@0.6.2:
  version "0.6.2"
  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
  integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==

nice-try@^1.0.4:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
  integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==

node-addon-api@^3.2.1:
  version "3.2.1"
  resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
  integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==

node-forge@^0.10.0:
  version "0.10.0"
  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
  integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==

node-gyp-build@^4.2.3, node-gyp-build@^4.3.0:
  version "4.3.0"
  resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3"
  integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==

node-releases@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
  integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==

normalize-path@^3.0.0, normalize-path@~3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==

normalize-url@^6.0.1:
  version "6.1.0"
  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
  integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==

npm-run-path@^2.0.0:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
  integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
  dependencies:
    path-key "^2.0.0"

nth-check@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2"
  integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==
  dependencies:
    boolbase "^1.0.0"

nullthrows@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1"
  integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==

nwsapi@^2.1.3:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
  integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==

oauth-sign@~0.9.0:
  version "0.9.0"
  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
  integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==

object-assign@^4.1.1:
  version "4.1.1"
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=

object-inspect@^1.11.0, object-inspect@^1.9.0:
  version "1.11.0"
  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
  integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==

object-is@^1.0.1:
  version "1.1.5"
  resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
  integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
  dependencies:
    call-bind "^1.0.2"
    define-properties "^1.1.3"

object-keys@^1.0.12, object-keys@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
  integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==

object.assign@^4.1.2:
  version "4.1.2"
  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
  integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
  dependencies:
    call-bind "^1.0.0"
    define-properties "^1.1.3"
    has-symbols "^1.0.1"
    object-keys "^1.1.1"

on-finished@~2.3.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
  integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
  dependencies:
    ee-first "1.1.1"

on-headers@~1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
  integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==

once@^1.3.0, once@^1.3.1, once@^1.4.0:
  version "1.4.0"
  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
  dependencies:
    wrappy "1"

onetime@^5.1.0:
  version "5.1.2"
  resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
  integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
  dependencies:
    mimic-fn "^2.1.0"

open@^7.0.3:
  version "7.4.2"
  resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
  integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
  dependencies:
    is-docker "^2.0.0"
    is-wsl "^2.1.1"

optionator@^0.8.1:
  version "0.8.3"
  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
  integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
  dependencies:
    deep-is "~0.1.3"
    fast-levenshtein "~2.0.6"
    levn "~0.3.0"
    prelude-ls "~1.1.2"
    type-check "~0.3.2"
    word-wrap "~1.2.3"

ora@^5.2.0:
  version "5.4.1"
  resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
  integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
  dependencies:
    bl "^4.1.0"
    chalk "^4.1.0"
    cli-cursor "^3.1.0"
    cli-spinners "^2.5.0"
    is-interactive "^1.0.0"
    is-unicode-supported "^0.1.0"
    log-symbols "^4.1.0"
    strip-ansi "^6.0.0"
    wcwidth "^1.0.1"

ordered-binary@^1.0.0:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.1.3.tgz#11dbc0a4cb7f8248183b9845e031b443be82571e"
  integrity sha512-tDTls+KllrZKJrqRXUYJtIcWIyoQycP7cVN7kzNNnhHKF2bMKHflcAQK+pF2Eb1iVaQodHxqZQr0yv4HWLGBhQ==

os-browserify@^0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
  integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=

p-finally@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
  integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=

pako@~1.0.5:
  version "1.0.11"
  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==

parcel@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/parcel/-/parcel-2.0.0.tgz#c5e203bf12b29f5489f426d7fb4826e6b463ebcd"
  integrity sha512-vALKLDWz9DF3YD4oGcG1UpMR32TXHr3wj0OZTCo0nLuP8LqNNhG7Twf+ZIpVf2r1b5Glex5eUl0vcx/x2xY6pw==
  dependencies:
    "@parcel/config-default" "^2.0.0"
    "@parcel/core" "^2.0.0"
    "@parcel/diagnostic" "^2.0.0"
    "@parcel/events" "^2.0.0"
    "@parcel/fs" "^2.0.0"
    "@parcel/logger" "^2.0.0"
    "@parcel/package-manager" "^2.0.0"
    "@parcel/reporter-cli" "^2.0.0"
    "@parcel/reporter-dev-server" "^2.0.0"
    "@parcel/utils" "^2.0.0"
    chalk "^4.1.0"
    commander "^7.0.0"
    get-port "^4.2.0"
    v8-compile-cache "^2.0.0"

parent-module@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
  dependencies:
    callsites "^3.0.0"

parse-asn1@^5.0.0, parse-asn1@^5.1.5:
  version "5.1.6"
  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
  integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
  dependencies:
    asn1.js "^5.2.0"
    browserify-aes "^1.0.0"
    evp_bytestokey "^1.0.0"
    pbkdf2 "^3.0.3"
    safe-buffer "^5.1.1"

parse-entities@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
  integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
  dependencies:
    character-entities "^1.0.0"
    character-entities-legacy "^1.0.0"
    character-reference-invalid "^1.0.0"
    is-alphanumerical "^1.0.0"
    is-decimal "^1.0.0"
    is-hexadecimal "^1.0.0"

parse-entities@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-3.1.0.tgz#82b04f2c26f2b3604e4df1972beb231f20d207e2"
  integrity sha512-xf2yeHbsfg1vJySsQelVwgtI/67eAndVU05skrr/XN6KFMoVVA95BYrW8y78OfW4jqcuHwB7tlMlLkvbq4WbHQ==
  dependencies:
    "@types/unist" "^2.0.0"
    character-entities "^2.0.0"
    character-entities-legacy "^3.0.0"
    character-reference-invalid "^2.0.0"
    is-alphanumerical "^2.0.0"
    is-decimal "^2.0.0"
    is-hexadecimal "^2.0.0"

parse-json@^5.0.0:
  version "5.2.0"
  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
  integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
  dependencies:
    "@babel/code-frame" "^7.0.0"
    error-ex "^1.3.1"
    json-parse-even-better-errors "^2.3.0"
    lines-and-columns "^1.1.6"

parse5@5.1.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
  integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==

parseurl@~1.3.3:
  version "1.3.3"
  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
  integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==

path-browserify@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
  integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==

path-is-absolute@^1.0.0:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=

path-is-inside@1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
  integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=

path-key@^2.0.0, path-key@^2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
  integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=

path-to-regexp@2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45"
  integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==

path-type@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
  integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==

pbkdf2@^3.0.3:
  version "3.1.2"
  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
  integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
  dependencies:
    create-hash "^1.1.2"
    create-hmac "^1.1.4"
    ripemd160 "^2.0.1"
    safe-buffer "^5.0.1"
    sha.js "^2.4.8"

performance-now@^2.1.0:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
  integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=

picocolors@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
  integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==

picocolors@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
  integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==

picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
  integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==

pn@^1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
  integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==

popper.js@^1.14.4:
  version "1.16.1"
  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
  integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==

postcss-calc@^8.0.0:
  version "8.0.0"
  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a"
  integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==
  dependencies:
    postcss-selector-parser "^6.0.2"
    postcss-value-parser "^4.0.2"

postcss-colormin@^5.2.1:
  version "5.2.1"
  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.1.tgz#6e444a806fd3c578827dbad022762df19334414d"
  integrity sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA==
  dependencies:
    browserslist "^4.16.6"
    caniuse-api "^3.0.0"
    colord "^2.9.1"
    postcss-value-parser "^4.1.0"

postcss-convert-values@^5.0.2:
  version "5.0.2"
  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz#879b849dc3677c7d6bc94b6a2c1a3f0808798059"
  integrity sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==
  dependencies:
    postcss-value-parser "^4.1.0"

postcss-discard-comments@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe"
  integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==

postcss-discard-duplicates@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d"
  integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==

postcss-discard-empty@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8"
  integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==

postcss-discard-overridden@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6"
  integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==

postcss-merge-longhand@^5.0.2:
  version "5.0.2"
  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz#277ada51d9a7958e8ef8cf263103c9384b322a41"
  integrity sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==
  dependencies:
    css-color-names "^1.0.1"
    postcss-value-parser "^4.1.0"
    stylehacks "^5.0.1"

postcss-merge-rules@^5.0.2:
  version "5.0.2"
  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz#d6e4d65018badbdb7dcc789c4f39b941305d410a"
  integrity sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==
  dependencies:
    browserslist "^4.16.6"
    caniuse-api "^3.0.0"
    cssnano-utils "^2.0.1"
    postcss-selector-parser "^6.0.5"
    vendors "^1.0.3"

postcss-minify-font-values@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf"
  integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==
  dependencies:
    postcss-value-parser "^4.1.0"

postcss-minify-gradients@^5.0.3:
  version "5.0.3"
  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.3.tgz#f970a11cc71e08e9095e78ec3a6b34b91c19550e"
  integrity sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q==
  dependencies:
    colord "^2.9.1"
    cssnano-utils "^2.0.1"
    postcss-value-parser "^4.1.0"

postcss-minify-params@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz#371153ba164b9d8562842fdcd929c98abd9e5b6c"
  integrity sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==
  dependencies:
    alphanum-sort "^1.0.2"
    browserslist "^4.16.0"
    cssnano-utils "^2.0.1"
    postcss-value-parser "^4.1.0"
    uniqs "^2.0.0"

postcss-minify-selectors@^5.1.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54"
  integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==
  dependencies:
    alphanum-sort "^1.0.2"
    postcss-selector-parser "^6.0.5"

postcss-modules-extract-imports@1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb"
  integrity sha1-thTJcgvmgW6u41+zpfqh26agXds=
  dependencies:
    postcss "^6.0.1"

postcss-modules-extract-imports@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
  integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
  dependencies:
    postcss "^7.0.5"

postcss-modules-local-by-default@1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
  integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
  dependencies:
    css-selector-tokenizer "^0.7.0"
    postcss "^6.0.1"

postcss-modules-local-by-default@^3.0.2:
  version "3.0.3"
  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0"
  integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==
  dependencies:
    icss-utils "^4.1.1"
    postcss "^7.0.32"
    postcss-selector-parser "^6.0.2"
    postcss-value-parser "^4.1.0"

postcss-modules-scope@1.1.0:
  version "1.1.0"
  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
  integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
  dependencies:
    css-selector-tokenizer "^0.7.0"
    postcss "^6.0.1"

postcss-modules-scope@^2.2.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
  integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
  dependencies:
    postcss "^7.0.6"
    postcss-selector-parser "^6.0.0"

postcss-modules-values@1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
  integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=
  dependencies:
    icss-replace-symbols "^1.1.0"
    postcss "^6.0.1"

postcss-modules-values@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
  integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
  dependencies:
    icss-utils "^4.0.0"
    postcss "^7.0.6"

postcss-modules@^3.2.2:
  version "3.2.2"
  resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-3.2.2.tgz#ee390de0f9f18e761e1778dfb9be26685c02c51f"
  integrity sha512-JQ8IAqHELxC0N6tyCg2UF40pACY5oiL6UpiqqcIFRWqgDYO8B0jnxzoQ0EOpPrWXvcpu6BSbQU/3vSiq7w8Nhw==
  dependencies:
    generic-names "^2.0.1"
    icss-replace-symbols "^1.1.0"
    lodash.camelcase "^4.3.0"
    postcss "^7.0.32"
    postcss-modules-extract-imports "^2.0.0"
    postcss-modules-local-by-default "^3.0.2"
    postcss-modules-scope "^2.2.0"
    postcss-modules-values "^3.0.0"
    string-hash "^1.1.1"

postcss-normalize-charset@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0"
  integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==

postcss-normalize-display-values@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd"
  integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==
  dependencies:
    cssnano-utils "^2.0.1"
    postcss-value-parser "^4.1.0"

postcss-normalize-positions@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5"
  integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==
  dependencies:
    postcss-value-parser "^4.1.0"

postcss-normalize-repeat-style@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5"
  integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==
  dependencies:
    cssnano-utils "^2.0.1"
    postcss-value-parser "^4.1.0"

postcss-normalize-string@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0"
  integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==
  dependencies:
    postcss-value-parser "^4.1.0"

postcss-normalize-timing-functions@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c"
  integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==
  dependencies:
    cssnano-utils "^2.0.1"
    postcss-value-parser "^4.1.0"

postcss-normalize-unicode@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37"
  integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==
  dependencies:
    browserslist "^4.16.0"
    postcss-value-parser "^4.1.0"

postcss-normalize-url@^5.0.2:
  version "5.0.2"
  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz#ddcdfb7cede1270740cf3e4dfc6008bd96abc763"
  integrity sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==
  dependencies:
    is-absolute-url "^3.0.3"
    normalize-url "^6.0.1"
    postcss-value-parser "^4.1.0"

postcss-normalize-whitespace@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a"
  integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==
  dependencies:
    postcss-value-parser "^4.1.0"

postcss-ordered-values@^5.0.2:
  version "5.0.2"
  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044"
  integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==
  dependencies:
    cssnano-utils "^2.0.1"
    postcss-value-parser "^4.1.0"

postcss-reduce-initial@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz#9d6369865b0f6f6f6b165a0ef5dc1a4856c7e946"
  integrity sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==
  dependencies:
    browserslist "^4.16.0"
    caniuse-api "^3.0.0"

postcss-reduce-transforms@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640"
  integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==
  dependencies:
    cssnano-utils "^2.0.1"
    postcss-value-parser "^4.1.0"

postcss-selector-parser@6.0.2:
  version "6.0.2"
  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
  integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
  dependencies:
    cssesc "^3.0.0"
    indexes-of "^1.0.1"
    uniq "^1.0.1"

postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5:
  version "6.0.6"
  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea"
  integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==
  dependencies:
    cssesc "^3.0.0"
    util-deprecate "^1.0.2"

postcss-svgo@^5.0.3:
  version "5.0.3"
  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.3.tgz#d945185756e5dfaae07f9edb0d3cae7ff79f9b30"
  integrity sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==
  dependencies:
    postcss-value-parser "^4.1.0"
    svgo "^2.7.0"

postcss-unique-selectors@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz#3be5c1d7363352eff838bd62b0b07a0abad43bfc"
  integrity sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==
  dependencies:
    alphanum-sort "^1.0.2"
    postcss-selector-parser "^6.0.5"
    uniqs "^2.0.0"

postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
  integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==

postcss@6.0.1:
  version "6.0.1"
  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2"
  integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=
  dependencies:
    chalk "^1.1.3"
    source-map "^0.5.6"
    supports-color "^3.2.3"

postcss@^6.0.1:
  version "6.0.23"
  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
  integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
  dependencies:
    chalk "^2.4.1"
    source-map "^0.6.1"
    supports-color "^5.4.0"

postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
  version "7.0.39"
  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
  integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
  dependencies:
    picocolors "^0.2.1"
    source-map "^0.6.1"

postcss@^8.2.1, postcss@^8.3.0, postcss@^8.3.6:
  version "8.3.11"
  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858"
  integrity sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==
  dependencies:
    nanoid "^3.1.30"
    picocolors "^1.0.0"
    source-map-js "^0.6.2"

posthtml-parser@^0.10.0, posthtml-parser@^0.10.1:
  version "0.10.1"
  resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.10.1.tgz#63c41931a9339cc2c32aba14f06286d98f107abf"
  integrity sha512-i7w2QEHqiGtsvNNPty0Mt/+ERch7wkgnFh3+JnBI2VgDbGlBqKW9eDVd3ENUhE1ujGFe3e3E/odf7eKhvLUyDg==
  dependencies:
    htmlparser2 "^7.1.1"

posthtml-render@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-3.0.0.tgz#97be44931496f495b4f07b99e903cc70ad6a3205"
  integrity sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==
  dependencies:
    is-json "^2.0.1"

posthtml@^0.16.4, posthtml@^0.16.5:
  version "0.16.5"
  resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.16.5.tgz#d32f5cf32436516d49e0884b2367d0a1424136f6"
  integrity sha512-1qOuPsywVlvymhTFIBniDXwUDwvlDri5KUQuBqjmCc8Jj4b/HDSVWU//P6rTWke5rzrk+vj7mms2w8e1vD0nnw==
  dependencies:
    posthtml-parser "^0.10.0"
    posthtml-render "^3.0.0"

prelude-ls@~1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
  integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=

prettier@2.4.1:
  version "2.4.1"
  resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c"
  integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==

prismjs@^1.22.0, prismjs@~1.25.0:
  version "1.25.0"
  resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756"
  integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==

process-nextick-args@~2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==

process@^0.11.10:
  version "0.11.10"
  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=

prop-types-extra@^1.1.0:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b"
  integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==
  dependencies:
    react-is "^16.3.2"
    warning "^4.0.0"

prop-types@^15.0.0, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
  version "15.7.2"
  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
  integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
  dependencies:
    loose-envify "^1.4.0"
    object-assign "^4.1.1"
    react-is "^16.8.1"

property-information@^5.0.0:
  version "5.6.0"
  resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69"
  integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==
  dependencies:
    xtend "^4.0.0"

property-information@^6.0.0:
  version "6.1.0"
  resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.0.tgz#a95d849f024a3173041e46589da2a07fcb2458ab"
  integrity sha512-aTSKXRnBlDpqo6cHVuZ88oaW1XGjABV10cV8RhK7AwBRjX+/D/LqspUF9f+TFSprZwXAsdJhx3KaJCdj8xZygw==

psl@^1.1.28:
  version "1.8.0"
  resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
  integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==

public-encrypt@^4.0.0:
  version "4.0.3"
  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
  integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
  dependencies:
    bn.js "^4.1.0"
    browserify-rsa "^4.0.0"
    create-hash "^1.1.0"
    parse-asn1 "^5.0.0"
    randombytes "^2.0.1"
    safe-buffer "^5.1.2"

pump@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
  dependencies:
    end-of-stream "^1.1.0"
    once "^1.3.1"

punycode@1.3.2:
  version "1.3.2"
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
  integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=

punycode@^1.3.2, punycode@^1.4.1:
  version "1.4.1"
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
  integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=

punycode@^2.1.0, punycode@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==

purgecss@^4.0.0:
  version "4.0.3"
  resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.0.3.tgz#8147b429f9c09db719e05d64908ea8b672913742"
  integrity sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==
  dependencies:
    commander "^6.0.0"
    glob "^7.0.0"
    postcss "^8.2.1"
    postcss-selector-parser "^6.0.2"

qs@~6.5.2:
  version "6.5.2"
  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
  integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==

querystring-es3@^0.2.1:
  version "0.2.1"
  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
  integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=

querystring@0.2.0:
  version "0.2.0"
  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
  integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=

queue-microtask@^1.2.2:
  version "1.2.3"
  resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==

randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
  version "2.1.0"
  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
  dependencies:
    safe-buffer "^5.1.0"

randomfill@^1.0.3:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
  integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
  dependencies:
    randombytes "^2.0.5"
    safe-buffer "^5.1.0"

range-parser@1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
  integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=

rc@^1.0.1, rc@^1.1.6:
  version "1.2.8"
  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
  integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
  dependencies:
    deep-extend "^0.6.0"
    ini "~1.3.0"
    minimist "^1.2.0"
    strip-json-comments "~2.0.1"

react-bootstrap-icons@^1.5.0:
  version "1.6.1"
  resolved "https://registry.yarnpkg.com/react-bootstrap-icons/-/react-bootstrap-icons-1.6.1.tgz#253e6bf637c983edfb82af0554454a22c5937731"
  integrity sha512-0xoFKK0soRBx7F0+R8lHmNp7THqaCMnAKm2SfySeTTmyk2HOG6SMXuoqlEI8SPZu2ez4u3dHlrXoo5/2IGWCeA==
  dependencies:
    prop-types "^15.7.2"

react-bootstrap-typeahead@^5.2.1:
  version "5.2.1"
  resolved "https://registry.yarnpkg.com/react-bootstrap-typeahead/-/react-bootstrap-typeahead-5.2.1.tgz#bf88607b004e2aa93094eac057422126a89e9bf2"
  integrity sha512-ARFFz/jdz4DVA1Qi/mANsmi8/ZUYcoEE63Er4PQUG3iM2b7RwgPs8K+CANHj6dugT4CX4knbfLLWHbb3IMTOEw==
  dependencies:
    "@babel/runtime" "^7.14.6"
    "@restart/hooks" "^0.4.0"
    classnames "^2.2.0"
    fast-deep-equal "^3.1.1"
    invariant "^2.2.1"
    lodash.debounce "^4.0.8"
    prop-types "^15.5.8"
    react-overlays "^5.1.0"
    react-popper "^1.0.0"
    scroll-into-view-if-needed "^2.2.20"
    warning "^4.0.1"

react-bootstrap@^2.0.0-beta.6:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.0.2.tgz#ec3492513066038bcf612ab8fcab46f88d254ab9"
  integrity sha512-QuMqJ+WJmd6dUyOys6OF3nr6T/FjUVAoEMbSjsFrwVufJtvMox0SU1Dvz/cDID+Dl6Rz2RLcJzyqkdl+DEK2Gg==
  dependencies:
    "@babel/runtime" "^7.14.0"
    "@restart/context" "^2.1.4"
    "@restart/hooks" "^0.3.26"
    "@restart/ui" "^0.2.3"
    "@types/invariant" "^2.2.33"
    "@types/prop-types" "^15.7.3"
    "@types/react" ">=16.14.8"
    "@types/react-transition-group" "^4.4.1"
    "@types/warning" "^3.0.0"
    classnames "^2.3.1"
    dom-helpers "^5.2.1"
    invariant "^2.2.4"
    prop-types "^15.7.2"
    prop-types-extra "^1.1.0"
    react-transition-group "^4.4.1"
    uncontrollable "^7.2.1"
    warning "^4.0.3"

react-dom@^17.0.2:
  version "17.0.2"
  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
  integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
  dependencies:
    loose-envify "^1.1.0"
    object-assign "^4.1.1"
    scheduler "^0.20.2"

react-human-time@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/react-human-time/-/react-human-time-1.2.0.tgz#a75be05e72ae690dbd16ff4e4a2c3b1fe6a3a98b"
  integrity sha512-4pKOGL4eswR9O4K+TD9uhjglCH6Tv96nN4y9Mpgx317gY013ld3f6dxml8hZoj2iedcfHgFYrh26uo5l99vpIw==
  dependencies:
    "@types/react" ">=16.0.0"
    human-time "0.0.1"
    react ">=16.0.0"

react-is@^16.3.2, react-is@^16.8.1:
  version "16.13.1"
  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
  integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==

react-is@^17.0.0:
  version "17.0.2"
  resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
  integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==

react-lifecycles-compat@^3.0.4:
  version "3.0.4"
  resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
  integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==

react-markdown@^7.0.1:
  version "7.1.0"
  resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-7.1.0.tgz#0ba62a4459daab6600ede83495a9228dae9d8f8e"
  integrity sha512-hL8cLLkTydyoKlZWZOjlU6TvMYIw9qKLh1CCzVfnhKt/R/SnKVAqiyugetXY61CkjhBqJl2C5FdU3OwHYo7SrQ==
  dependencies:
    "@types/hast" "^2.0.0"
    "@types/unist" "^2.0.0"
    comma-separated-tokens "^2.0.0"
    hast-util-whitespace "^2.0.0"
    prop-types "^15.0.0"
    property-information "^6.0.0"
    react-is "^17.0.0"
    remark-parse "^10.0.0"
    remark-rehype "^9.0.0"
    space-separated-tokens "^2.0.0"
    style-to-object "^0.3.0"
    unified "^10.0.0"
    unist-util-visit "^4.0.0"
    vfile "^5.0.0"

react-overlays@^5.1.0:
  version "5.1.1"
  resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.1.1.tgz#2e7cf49744b56537c7828ccb94cfc63dd778ae4f"
  integrity sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q==
  dependencies:
    "@babel/runtime" "^7.13.8"
    "@popperjs/core" "^2.8.6"
    "@restart/hooks" "^0.3.26"
    "@types/warning" "^3.0.0"
    dom-helpers "^5.2.0"
    prop-types "^15.7.2"
    uncontrollable "^7.2.1"
    warning "^4.0.3"

react-placeholder@^4.1.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/react-placeholder/-/react-placeholder-4.1.0.tgz#943128820b3b0a6f94371655aadec18d306e05e3"
  integrity sha512-z1HGD86NWJTYTQumHsmGH9jkozv4QHa9dju/vHVUd4f1svu23pf5v7QoBLBfs3kA1S9GLJaCeRMHLbO2SCdz5A==

react-popper@^1.0.0:
  version "1.3.11"
  resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.11.tgz#a2cc3f0a67b75b66cfa62d2c409f9dd1fcc71ffd"
  integrity sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg==
  dependencies:
    "@babel/runtime" "^7.1.2"
    "@hypnosphi/create-react-context" "^0.3.1"
    deep-equal "^1.1.1"
    popper.js "^1.14.4"
    prop-types "^15.6.1"
    typed-styles "^0.0.7"
    warning "^4.0.2"

react-refresh@^0.9.0:
  version "0.9.0"
  resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf"
  integrity sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==

react-router-dom@^6.0.0:
  version "6.0.0"
  resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.0.0.tgz#8a55a9ab3cc12f7eb06472f6c8001515af651c6a"
  integrity sha512-bPXyYipf0zu6K7mHSEmNO5YqLKq2q9N+Dsahw9Xh3oq1IirsI3vbnIYcVWin6A0zWyHmKhMGoV7Gr0j0kcuVFg==
  dependencies:
    react-router "6.0.0"

react-router@6.0.0:
  version "6.0.0"
  resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.0.0.tgz#a8803ac7b612c2a2d31cc466ceda656cf31fdfb9"
  integrity sha512-FcTRCihYZvERMNbG54D9+Wkv2cj/OtoxNlA/87D7vxKYlmSmbF9J9XChI9Is44j/behEiOhbovgVZBhKQn+wgA==
  dependencies:
    history "^5.0.3"

react-syntax-highlighter@^15.4.4:
  version "15.4.4"
  resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.4.4.tgz#dc9043f19e7bd063ff3ea78986d22a6eaa943b2a"
  integrity sha512-PsOFHNTzkb3OroXdoR897eKN5EZ6grht1iM+f1lJSq7/L0YVnkJaNVwC3wEUYPOAmeyl5xyer1DjL6MrumO6Zw==
  dependencies:
    "@babel/runtime" "^7.3.1"
    highlight.js "^10.4.1"
    lowlight "^1.17.0"
    prismjs "^1.22.0"
    refractor "^3.2.0"

react-transition-group@^4.4.1:
  version "4.4.2"
  resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470"
  integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==
  dependencies:
    "@babel/runtime" "^7.5.5"
    dom-helpers "^5.0.1"
    loose-envify "^1.4.0"
    prop-types "^15.6.2"

react@>=16.0.0, react@^17.0.2:
  version "17.0.2"
  resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
  integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
  dependencies:
    loose-envify "^1.1.0"
    object-assign "^4.1.1"

"readable-stream@1 || 2":
  version "2.3.7"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
  integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
  dependencies:
    core-util-is "~1.0.0"
    inherits "~2.0.3"
    isarray "~1.0.0"
    process-nextick-args "~2.0.0"
    safe-buffer "~5.1.1"
    string_decoder "~1.1.1"
    util-deprecate "~1.0.1"

readable-stream@^3.0.0, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0:
  version "3.6.0"
  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
  dependencies:
    inherits "^2.0.3"
    string_decoder "^1.1.1"
    util-deprecate "^1.0.1"

readdirp@~3.6.0:
  version "3.6.0"
  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
  integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
  dependencies:
    picomatch "^2.2.1"

refractor@^3.2.0:
  version "3.5.0"
  resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.5.0.tgz#334586f352dda4beaf354099b48c2d18e0819aec"
  integrity sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==
  dependencies:
    hastscript "^6.0.0"
    parse-entities "^2.0.0"
    prismjs "~1.25.0"

regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7:
  version "0.13.9"
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
  integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==

regexp.prototype.flags@^1.2.0:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
  integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
  dependencies:
    call-bind "^1.0.2"
    define-properties "^1.1.3"

registry-auth-token@3.3.2:
  version "3.3.2"
  resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20"
  integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==
  dependencies:
    rc "^1.1.6"
    safe-buffer "^5.0.1"

registry-url@3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
  integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
  dependencies:
    rc "^1.0.1"

relateurl@^0.2.7:
  version "0.2.7"
  resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
  integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=

remark-gfm@^3.0.1:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f"
  integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==
  dependencies:
    "@types/mdast" "^3.0.0"
    mdast-util-gfm "^2.0.0"
    micromark-extension-gfm "^2.0.0"
    unified "^10.0.0"

remark-parse@^10.0.0:
  version "10.0.0"
  resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.0.tgz#65e2b2b34d8581d36b97f12a2926bb2126961cb4"
  integrity sha512-07ei47p2Xl7Bqbn9H2VYQYirnAFJPwdMuypdozWsSbnmrkgA2e2sZLZdnDNrrsxR4onmIzH/J6KXqKxCuqHtPQ==
  dependencies:
    "@types/mdast" "^3.0.0"
    mdast-util-from-markdown "^1.0.0"
    unified "^10.0.0"

remark-rehype@^9.0.0:
  version "9.1.0"
  resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-9.1.0.tgz#e4b5b6e19c125b3780343eb66c3e9b99b0f06a81"
  integrity sha512-oLa6YmgAYg19zb0ZrBACh40hpBLteYROaPLhBXzLgjqyHQrN+gVP9N/FJvfzuNNuzCutktkroXEZBrxAxKhh7Q==
  dependencies:
    "@types/hast" "^2.0.0"
    "@types/mdast" "^3.0.0"
    mdast-util-to-hast "^11.0.0"
    unified "^10.0.0"

request-promise-core@1.1.4:
  version "1.1.4"
  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
  integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==
  dependencies:
    lodash "^4.17.19"

request-promise-native@^1.0.5:
  version "1.0.9"
  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28"
  integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==
  dependencies:
    request-promise-core "1.1.4"
    stealthy-require "^1.1.1"
    tough-cookie "^2.3.3"

request@^2.88.0:
  version "2.88.2"
  resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
  integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
  dependencies:
    aws-sign2 "~0.7.0"
    aws4 "^1.8.0"
    caseless "~0.12.0"
    combined-stream "~1.0.6"
    extend "~3.0.2"
    forever-agent "~0.6.1"
    form-data "~2.3.2"
    har-validator "~5.1.3"
    http-signature "~1.2.0"
    is-typedarray "~1.0.0"
    isstream "~0.1.2"
    json-stringify-safe "~5.0.1"
    mime-types "~2.1.19"
    oauth-sign "~0.9.0"
    performance-now "^2.1.0"
    qs "~6.5.2"
    safe-buffer "^5.1.2"
    tough-cookie "~2.5.0"
    tunnel-agent "^0.6.0"
    uuid "^3.3.2"

requires-port@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
  integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=

resolve-from@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==

restore-cursor@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
  integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
  dependencies:
    onetime "^5.1.0"
    signal-exit "^3.0.2"

reusify@^1.0.4:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==

rimraf@^3.0.2:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
  dependencies:
    glob "^7.1.3"

ripemd160@^2.0.0, ripemd160@^2.0.1:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
  integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
  dependencies:
    hash-base "^3.0.0"
    inherits "^2.0.1"

run-parallel@^1.1.9:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
  dependencies:
    queue-microtask "^1.2.2"

sade@^1.7.3:
  version "1.7.4"
  resolved "https://registry.yarnpkg.com/sade/-/sade-1.7.4.tgz#ea681e0c65d248d2095c90578c03ca0bb1b54691"
  integrity sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==
  dependencies:
    mri "^1.1.0"

safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
  version "5.1.2"
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==

safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
  version "5.2.1"
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==

"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
  version "2.1.2"
  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==

sass@^1.38.0, sass@^1.39.2:
  version "1.43.4"
  resolved "https://registry.yarnpkg.com/sass/-/sass-1.43.4.tgz#68c7d6a1b004bef49af0d9caf750e9b252105d1f"
  integrity sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==
  dependencies:
    chokidar ">=3.0.0 <4.0.0"

saxes@^3.1.9:
  version "3.1.11"
  resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
  integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==
  dependencies:
    xmlchars "^2.1.1"

scheduler@^0.20.2:
  version "0.20.2"
  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
  integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
  dependencies:
    loose-envify "^1.1.0"
    object-assign "^4.1.1"

scroll-into-view-if-needed@^2.2.20:
  version "2.2.28"
  resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz#5a15b2f58a52642c88c8eca584644e01703d645a"
  integrity sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w==
  dependencies:
    compute-scroll-into-view "^1.0.17"

semver@^5.4.1, semver@^5.5.0, semver@^5.7.0:
  version "5.7.1"
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==

semver@^6.3.0:
  version "6.3.0"
  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==

serve-handler@6.1.3, serve-handler@^6.0.0:
  version "6.1.3"
  resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8"
  integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==
  dependencies:
    bytes "3.0.0"
    content-disposition "0.5.2"
    fast-url-parser "1.1.3"
    mime-types "2.1.18"
    minimatch "3.0.4"
    path-is-inside "1.0.2"
    path-to-regexp "2.2.1"
    range-parser "1.2.0"

serve@^13.0.2:
  version "13.0.2"
  resolved "https://registry.yarnpkg.com/serve/-/serve-13.0.2.tgz#b19ccb854dfdf3085613cd3a4033c7807aeaf85b"
  integrity sha512-71R6fKvNgKrqARAag6lYJNnxDzpH7DCNrMuvPY5PLVaC2PDhJsGTj/34o4o4tPWhTuLgEXqvgnAWbATQ9zGZTQ==
  dependencies:
    "@zeit/schemas" "2.6.0"
    ajv "6.12.6"
    arg "2.0.0"
    boxen "5.1.2"
    chalk "2.4.1"
    clipboardy "2.3.0"
    compression "1.7.3"
    serve-handler "6.1.3"
    update-check "1.5.2"

setimmediate@^1.0.4:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
  integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=

sha.js@^2.4.0, sha.js@^2.4.8:
  version "2.4.11"
  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
  integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
  dependencies:
    inherits "^2.0.1"
    safe-buffer "^5.0.1"

shebang-command@^1.2.0:
  version "1.2.0"
  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
  integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
  dependencies:
    shebang-regex "^1.0.0"

shebang-regex@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
  integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=

side-channel@^1.0.4:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
  integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
  dependencies:
    call-bind "^1.0.0"
    get-intrinsic "^1.0.2"
    object-inspect "^1.9.0"

signal-exit@^3.0.0, signal-exit@^3.0.2:
  version "3.0.5"
  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f"
  integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==

slash@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==

slice-ansi@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
  integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
  dependencies:
    ansi-styles "^4.0.0"
    astral-regex "^2.0.0"
    is-fullwidth-code-point "^3.0.0"

source-code-pro@^2.38.0:
  version "2.38.0"
  resolved "https://registry.yarnpkg.com/source-code-pro/-/source-code-pro-2.38.0.tgz#85c57689f7386bb9d0515fb00ba4845bfb7b485b"
  integrity sha512-JMXu7l3XrLREG17eEwY66ANG9716WTu6OeNvZfRKQKANEvbSERDZjk5AYTHeV6owQNPQTeiiW3ri2Ou93XFGvg==

source-map-js@^0.6.2:
  version "0.6.2"
  resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
  integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==

source-map-support@~0.5.20:
  version "0.5.20"
  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9"
  integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==
  dependencies:
    buffer-from "^1.0.0"
    source-map "^0.6.0"

source-map@^0.5.0, source-map@^0.5.6:
  version "0.5.7"
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=

source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
  version "0.6.1"
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==

source-map@~0.7.2:
  version "0.7.3"
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
  integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==

space-separated-tokens@^1.0.0:
  version "1.1.5"
  resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899"
  integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==

space-separated-tokens@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz#43193cec4fb858a2ce934b7f98b7f2c18107098b"
  integrity sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==

split2@^3.1.1:
  version "3.2.2"
  resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
  integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
  dependencies:
    readable-stream "^3.0.0"

srcset@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4"
  integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==

sshpk@^1.7.0:
  version "1.16.1"
  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
  integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
  dependencies:
    asn1 "~0.2.3"
    assert-plus "^1.0.0"
    bcrypt-pbkdf "^1.0.0"
    dashdash "^1.12.0"
    ecc-jsbn "~0.1.1"
    getpass "^0.1.1"
    jsbn "~0.1.0"
    safer-buffer "^2.0.2"
    tweetnacl "~0.14.0"

stable@^0.1.8:
  version "0.1.8"
  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==

statuses@~1.5.0:
  version "1.5.0"
  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
  integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=

stealthy-require@^1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
  integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=

stream-browserify@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
  integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==
  dependencies:
    inherits "~2.0.4"
    readable-stream "^3.5.0"

stream-http@^3.1.0:
  version "3.2.0"
  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5"
  integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==
  dependencies:
    builtin-status-codes "^3.0.0"
    inherits "^2.0.4"
    readable-stream "^3.6.0"
    xtend "^4.0.2"

string-hash@^1.1.1:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b"
  integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=

string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2:
  version "4.2.3"
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
  dependencies:
    emoji-regex "^8.0.0"
    is-fullwidth-code-point "^3.0.0"
    strip-ansi "^6.0.1"

string.prototype.trimend@^1.0.4:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
  integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
  dependencies:
    call-bind "^1.0.2"
    define-properties "^1.1.3"

string.prototype.trimstart@^1.0.4:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
  integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
  dependencies:
    call-bind "^1.0.2"
    define-properties "^1.1.3"

string_decoder@^1.1.1, string_decoder@^1.3.0:
  version "1.3.0"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
  dependencies:
    safe-buffer "~5.2.0"

string_decoder@~1.1.1:
  version "1.1.1"
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
  dependencies:
    safe-buffer "~5.1.0"

strip-ansi@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
  integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
  dependencies:
    ansi-regex "^2.0.0"

strip-ansi@^6.0.0, strip-ansi@^6.0.1:
  version "6.0.1"
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
  dependencies:
    ansi-regex "^5.0.1"

strip-eof@^1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
  integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=

strip-json-comments@~2.0.1:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
  integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=

style-to-object@^0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46"
  integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==
  dependencies:
    inline-style-parser "0.1.1"

stylehacks@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb"
  integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==
  dependencies:
    browserslist "^4.16.0"
    postcss-selector-parser "^6.0.4"

supports-color@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
  integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=

supports-color@^3.2.3:
  version "3.2.3"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
  integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
  dependencies:
    has-flag "^1.0.0"

supports-color@^5.3.0, supports-color@^5.4.0:
  version "5.5.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
  dependencies:
    has-flag "^3.0.0"

supports-color@^7.0.0, supports-color@^7.1.0:
  version "7.2.0"
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
  dependencies:
    has-flag "^4.0.0"

supports-hyperlinks@^2.0.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
  integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
  dependencies:
    has-flag "^4.0.0"
    supports-color "^7.0.0"

svgo@^2.4.0, svgo@^2.6.1, svgo@^2.7.0:
  version "2.8.0"
  resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24"
  integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
  dependencies:
    "@trysound/sax" "0.2.0"
    commander "^7.2.0"
    css-select "^4.1.3"
    css-tree "^1.1.3"
    csso "^4.2.0"
    picocolors "^1.0.0"
    stable "^0.1.8"

symbol-tree@^3.2.2:
  version "3.2.4"
  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
  integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==

term-size@^2.2.1:
  version "2.2.1"
  resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54"
  integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==

terminal-link@^2.1.1:
  version "2.1.1"
  resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
  integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
  dependencies:
    ansi-escapes "^4.2.1"
    supports-hyperlinks "^2.0.0"

terser@^5.2.0, terser@^5.8.0:
  version "5.9.0"
  resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351"
  integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==
  dependencies:
    commander "^2.20.0"
    source-map "~0.7.2"
    source-map-support "~0.5.20"

timers-browserify@^2.0.11:
  version "2.0.12"
  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee"
  integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==
  dependencies:
    setimmediate "^1.0.4"

timsort@^0.3.0:
  version "0.3.0"
  resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
  integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=

to-fast-properties@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
  integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=

to-regex-range@^5.0.1:
  version "5.0.1"
  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
  dependencies:
    is-number "^7.0.0"

totalist@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/totalist/-/totalist-2.0.0.tgz#db6f1e19c0fa63e71339bbb8fba89653c18c7eec"
  integrity sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==

tough-cookie@^2.3.3, tough-cookie@^2.5.0, tough-cookie@~2.5.0:
  version "2.5.0"
  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
  integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
  dependencies:
    psl "^1.1.28"
    punycode "^2.1.1"

tr46@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
  integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
  dependencies:
    punycode "^2.1.0"

trough@^2.0.0:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/trough/-/trough-2.0.2.tgz#94a3aa9d5ce379fc561f6244905b3f36b7458d96"
  integrity sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==

tty-browserify@^0.0.1:
  version "0.0.1"
  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
  integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==

tunnel-agent@^0.6.0:
  version "0.6.0"
  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
  integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
  dependencies:
    safe-buffer "^5.0.1"

tweetnacl@^0.14.3, tweetnacl@~0.14.0:
  version "0.14.5"
  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
  integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=

type-check@~0.3.2:
  version "0.3.2"
  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
  integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
  dependencies:
    prelude-ls "~1.1.2"

type-fest@^0.20.2:
  version "0.20.2"
  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
  integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==

type-fest@^0.21.3:
  version "0.21.3"
  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
  integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==

typed-styles@^0.0.7:
  version "0.0.7"
  resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9"
  integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==

typescript@^4.4.2:
  version "4.4.4"
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c"
  integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==

unbox-primitive@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
  integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
  dependencies:
    function-bind "^1.1.1"
    has-bigints "^1.0.1"
    has-symbols "^1.0.2"
    which-boxed-primitive "^1.0.2"

uncontrollable@^7.2.1:
  version "7.2.1"
  resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738"
  integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==
  dependencies:
    "@babel/runtime" "^7.6.3"
    "@types/react" ">=16.9.11"
    invariant "^2.2.4"
    react-lifecycles-compat "^3.0.4"

uncss@^0.17.3:
  version "0.17.3"
  resolved "https://registry.yarnpkg.com/uncss/-/uncss-0.17.3.tgz#50fc1eb4ed573ffff763458d801cd86e4d69ea11"
  integrity sha512-ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog==
  dependencies:
    commander "^2.20.0"
    glob "^7.1.4"
    is-absolute-url "^3.0.1"
    is-html "^1.1.0"
    jsdom "^14.1.0"
    lodash "^4.17.15"
    postcss "^7.0.17"
    postcss-selector-parser "6.0.2"
    request "^2.88.0"

unified@^10.0.0:
  version "10.1.0"
  resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.0.tgz#4e65eb38fc2448b1c5ee573a472340f52b9346fe"
  integrity sha512-4U3ru/BRXYYhKbwXV6lU6bufLikoAavTwev89H5UxY8enDFaAT2VXmIXYNm6hb5oHPng/EXr77PVyDFcptbk5g==
  dependencies:
    "@types/unist" "^2.0.0"
    bail "^2.0.0"
    extend "^3.0.0"
    is-buffer "^2.0.0"
    is-plain-obj "^4.0.0"
    trough "^2.0.0"
    vfile "^5.0.0"

uniq@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
  integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=

uniqs@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
  integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=

unist-builder@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.0.tgz#728baca4767c0e784e1e64bb44b5a5a753021a04"
  integrity sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==
  dependencies:
    "@types/unist" "^2.0.0"

unist-util-generated@^2.0.0:
  version "2.0.0"
  resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.0.tgz#86fafb77eb6ce9bfa6b663c3f5ad4f8e56a60113"
  integrity sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==

unist-util-is@^5.0.0:
  version "5.1.1"
  resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236"
  integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==

unist-util-position@^4.0.0:
  version "4.0.1"
  resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.1.tgz#f8484b2da19a897a0180556d160c28633070dbb9"
  integrity sha512-mgy/zI9fQ2HlbOtTdr2w9lhVaiFUHWQnZrFF2EUoVOqtAUdzqMtNiD99qA5a1IcjWVR8O6aVYE9u7Z2z1v0SQA==

unist-util-stringify-position@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9"
  integrity sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==
  dependencies:
    "@types/unist" "^2.0.0"

unist-util-visit-parents@^4.0.0:
  version "4.1.1"
  resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz#e83559a4ad7e6048a46b1bdb22614f2f3f4724f2"
  integrity sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==
  dependencies:
    "@types/unist" "^2.0.0"
    unist-util-is "^5.0.0"

unist-util-visit-parents@^5.0.0:
  version "5.1.0"
  resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521"
  integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==
  dependencies:
    "@types/unist" "^2.0.0"
    unist-util-is "^5.0.0"

unist-util-visit@^3.0.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b"
  integrity sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==
  dependencies:
    "@types/unist" "^2.0.0"
    unist-util-is "^5.0.0"
    unist-util-visit-parents "^4.0.0"

unist-util-visit@^4.0.0:
  version "4.1.0"
  resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5"
  integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==
  dependencies:
    "@types/unist" "^2.0.0"
    unist-util-is "^5.0.0"
    unist-util-visit-parents "^5.0.0"

unpipe@~1.0.0:
  version "1.0.0"
  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
  integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=

update-check@1.5.2:
  version "1.5.2"
  resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.2.tgz#2fe09f725c543440b3d7dabe8971f2d5caaedc28"
  integrity sha512-1TrmYLuLj/5ZovwUS7fFd1jMH3NnFDN1y1A8dboedIDt7zs/zJMo6TwwlhYKkSeEwzleeiSBV5/3c9ufAQWDaQ==
  dependencies:
    registry-auth-token "3.3.2"
    registry-url "3.1.0"

uri-js@^4.2.2:
  version "4.4.1"
  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
  integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
  dependencies:
    punycode "^2.1.0"

url@^0.11.0:
  version "0.11.0"
  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
  integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
  dependencies:
    punycode "1.3.2"
    querystring "0.2.0"

util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=

util@^0.12.0, util@^0.12.3:
  version "0.12.4"
  resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253"
  integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==
  dependencies:
    inherits "^2.0.3"
    is-arguments "^1.0.4"
    is-generator-function "^1.0.7"
    is-typed-array "^1.1.3"
    safe-buffer "^5.1.2"
    which-typed-array "^1.1.2"

utility-types@^3.10.0:
  version "3.10.0"
  resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b"
  integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==

utils-merge@1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
  integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=

uuid@^3.3.2:
  version "3.4.0"
  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
  integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==

uvu@^0.5.0:
  version "0.5.2"
  resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.2.tgz#c145e7f4b5becf80099cf22fd8a4a05f0112b2c0"
  integrity sha512-m2hLe7I2eROhh+tm3WE5cTo/Cv3WQA7Oc9f7JB6uWv+/zVKvfAm53bMyOoGOSZeQ7Ov2Fu9pLhFr7p07bnT20w==
  dependencies:
    dequal "^2.0.0"
    diff "^5.0.0"
    kleur "^4.0.3"
    sade "^1.7.3"
    totalist "^2.0.0"

v8-compile-cache@^2.0.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
  integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==

vary@~1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
  integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=

vendors@^1.0.3:
  version "1.0.4"
  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
  integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==

verror@1.10.0:
  version "1.10.0"
  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
  integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
  dependencies:
    assert-plus "^1.0.0"
    core-util-is "1.0.2"
    extsprintf "^1.2.0"

vfile-message@^3.0.0:
  version "3.0.2"
  resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.0.2.tgz#db7eaebe7fecb853010f2ef1664427f52baf8f74"
  integrity sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==
  dependencies:
    "@types/unist" "^2.0.0"
    unist-util-stringify-position "^3.0.0"

vfile@^5.0.0:
  version "5.2.0"
  resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.2.0.tgz#a32a646ff9251c274dbe8675644a39031025b369"
  integrity sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==
  dependencies:
    "@types/unist" "^2.0.0"
    is-buffer "^2.0.0"
    unist-util-stringify-position "^3.0.0"
    vfile-message "^3.0.0"

vm-browserify@^1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
  integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==

w3c-hr-time@^1.0.1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
  integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
  dependencies:
    browser-process-hrtime "^1.0.0"

w3c-xmlserializer@^1.1.2:
  version "1.1.2"
  resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"
  integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==
  dependencies:
    domexception "^1.0.1"
    webidl-conversions "^4.0.2"
    xml-name-validator "^3.0.0"

warning@^4.0.0, warning@^4.0.1, warning@^4.0.2, warning@^4.0.3:
  version "4.0.3"
  resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
  integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
  dependencies:
    loose-envify "^1.0.0"

wcwidth@^1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
  integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
  dependencies:
    defaults "^1.0.3"

weak-lru-cache@^1.0.0:
  version "1.1.3"
  resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.1.3.tgz#8a691884501b611d2b5aeac1ee5a011b2a97d9a8"
  integrity sha512-5LDIv+sr6uzT94Hhcq7Qv7gt3jxol4iMWUqOgJSLYbB5oO7bTSMqIBtKsytm8N2BufYOdJw86/qu+SDfbo/wKQ==

webidl-conversions@^4.0.2:
  version "4.0.2"
  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
  integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==

whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5:
  version "1.0.5"
  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
  integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
  dependencies:
    iconv-lite "0.4.24"

whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
  version "2.3.0"
  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
  integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==

whatwg-url@^7.0.0:
  version "7.1.0"
  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
  integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==
  dependencies:
    lodash.sortby "^4.7.0"
    tr46 "^1.0.1"
    webidl-conversions "^4.0.2"

which-boxed-primitive@^1.0.2:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
  integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
  dependencies:
    is-bigint "^1.0.1"
    is-boolean-object "^1.1.0"
    is-number-object "^1.0.4"
    is-string "^1.0.5"
    is-symbol "^1.0.3"

which-typed-array@^1.1.2:
  version "1.1.7"
  resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793"
  integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==
  dependencies:
    available-typed-arrays "^1.0.5"
    call-bind "^1.0.2"
    es-abstract "^1.18.5"
    foreach "^2.0.5"
    has-tostringtag "^1.0.0"
    is-typed-array "^1.1.7"

which@^1.2.9:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
  dependencies:
    isexe "^2.0.0"

widest-line@^3.1.0:
  version "3.1.0"
  resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
  integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
  dependencies:
    string-width "^4.0.0"

word-wrap@~1.2.3:
  version "1.2.3"
  resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
  integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==

wrap-ansi@^7.0.0:
  version "7.0.0"
  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
  dependencies:
    ansi-styles "^4.0.0"
    string-width "^4.1.0"
    strip-ansi "^6.0.0"

wrappy@1:
  version "1.0.2"
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=

ws@^6.1.2:
  version "6.2.2"
  resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e"
  integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==
  dependencies:
    async-limiter "~1.0.0"

ws@^7.0.0:
  version "7.5.5"
  resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881"
  integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==

xml-name-validator@^3.0.0:
  version "3.0.0"
  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
  integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==

xmlchars@^2.1.1:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
  integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==

xtend@^4.0.0, xtend@^4.0.2:
  version "4.0.2"
  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==

xxhash-wasm@^0.4.1:
  version "0.4.2"
  resolved "https://registry.yarnpkg.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz#752398c131a4dd407b5132ba62ad372029be6f79"
  integrity sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==

yallist@^4.0.0:
  version "4.0.0"
  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==

yaml@^1.10.0, yaml@^1.10.2:
  version "1.10.2"
  resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
  integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==

zwitch@^2.0.0:
  version "2.0.2"
  resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.2.tgz#91f8d0e901ffa3d66599756dde7f57b17c95dce1"
  integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==
diff --git a/chartered-frontend/src/app.d.ts b/chartered-frontend/src/app.d.ts
new file mode 100644
index 0000000..4ce2990 100644
--- /dev/null
+++ a/chartered-frontend/src/app.d.ts
@@ -1,0 +1,8 @@
// See https://kit.svelte.dev/docs/types#app
// for information about these interfaces
// and what to do when importing types
declare namespace App {
    // interface Locals {}
    // interface PageData {}
    // interface Platform {}
}
diff --git a/chartered-frontend/src/app.html b/chartered-frontend/src/app.html
new file mode 100644
index 0000000..c6173d0 100644
--- /dev/null
+++ a/chartered-frontend/src/app.html
@@ -1,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <link rel="icon" href="%sveltekit.assets%/favicon.png" />
        <meta name="viewport" content="width=device-width" />
        %sveltekit.head%
    </head>
    <body>
        <div>%sveltekit.body%</div>
    </body>
</html>
diff --git a/chartered-frontend/src/app.pcss b/chartered-frontend/src/app.pcss
new file mode 100644
index 0000000..7e4634c 100644
--- /dev/null
+++ a/chartered-frontend/src/app.pcss
@@ -1,0 +1,58 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

body {
    @apply bg-blue-100 dark:bg-slate-800 text-black dark:text-slate-400;
}

@layer components {
    .card {
        @apply block p-6 bg-white rounded-lg border border-gray-200 dark:border-gray-700 shadow-md dark:bg-transparent;
    }

    .card-hr {
        @apply border-gray-200 dark:border-gray-700;
    }

    .card-divide {
        @apply divide-gray-200 dark:divide-gray-700;
    }

    a.card,
    button.card {
        @apply hover:bg-gray-100 dark:hover:bg-gray-700;
    }

    .card-header {
        @apply mb-2 text-2xl font-bold tracking-tight text-gray-900 dark:text-white;
    }

    .card-body {
        @apply font-normal text-gray-700 dark:text-gray-400;
    }

    header {
        @apply dark:bg-gradient-to-b dark:from-gray-900 dark:to-slate-800 text-black dark:text-inherit;
    }

    .btn-green {
        @apply w-fit mt-3 text-white border border-green-700 bg-green-700 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 focus:outline-none dark:focus:ring-blue-800 transition duration-150 ease-out;
    }

    .btn-red {
        @apply w-fit mt-3 text-white border border-red-700 bg-red-700 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 focus:outline-none dark:focus:ring-blue-800 transition duration-150 ease-out;
    }

    .btn-blue {
        @apply w-fit mt-3 text-white border border-blue-700 bg-blue-700 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 focus:outline-none dark:focus:ring-blue-800 transition duration-150 ease-out;
    }

    .btn-blue-outline {
        @apply w-fit mt-3 text-blue-700 dark:text-inherit hover:text-white border border-blue-700 hover:bg-blue-700 dark:bg-transparent focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 dark:border-blue-600 dark:hover:bg-blue-600 focus:outline-none dark:focus:ring-blue-800 transition duration-150 ease-out;
    }
}

.text-highlight {
    @apply text-blue-700 dark:text-blue-600;
}
diff --git a/chartered-frontend/src/dark.sass b/chartered-frontend/src/dark.sass
deleted file mode 100644
index f0669bf..0000000 100644
--- a/chartered-frontend/src/dark.sass
+++ /dev/null
@@ -1,133 +1,0 @@
@import "../node_modules/bootstrap/scss/functions"
@import "../node_modules/bootstrap/scss/variables"
@import "../node_modules/bootstrap/scss/mixins"
@import "../node_modules/bootstrap/scss/_navbar"

$dark-bg-color: hsl(213, 44%, 10%)

html, body
  @media(prefers-color-scheme: dark)
    background: $dark-bg-color

.dark
  $primary: hsl(212, 70%, 49%)
  $secondary: $dark-bg-color
  $dark: hsl(0, 0%, 0%)
  $card-border-color: hsl(212, 25%, 22%)
  $light: rgba(255, 255, 255, 0.55)
  $link-color: $primary

  $body-color: $light
  $body-bg: $secondary

  $theme-colors: ("primary": $primary, "secondary": $secondary, "danger": $danger, "info": $indigo, "dark": $dark, "light": $light)

  @each $color, $value in $theme-colors
    --#{$variable-prefix}#{$color}: #{$value}

  $theme-colors-rgb: map-loop($theme-colors, to-rgb, "$value")
  @each $color, $value in $theme-colors-rgb
    --#{$variable-prefix}#{$color}-rgb: #{$value}

  .dropdown-menu
    background: $card-border-color
    border-color: darken($card-border-color, 10%)

    .dropdown-item:hover
      color: $link-color
      background: darken($card-border-color, 3%)

  .bg-default-profile-picture
    background: $card-border-color

  a
    color: $link-color

  table td
    color: $body-color !important

  table th
    color: $primary !important

  a.btn
    color: $link-color

    &.btn-danger
      color: white

  .btn-outline-primary:hover
    color: white

  .btn-outline-light
    border-color: $link-color

    &:hover
      color: $body-color
      background-color: $link-color

  .modal-content
    background: $dark-bg-color
    color: $body-color

    .modal-header, .modal-footer
      border-color: $card-border-color

  table
    border-color: $card-border-color !important

  .nav-pills .nav-item .nav-link.active
    background: $card-border-color !important

  .list-group-item
    background: transparent !important
    color: rgba(255, 255, 255, 0.55) !important

  .card
    background: $body-bg !important
    border: 1px solid $card-border-color !important
    color: rgba(255, 255, 255, 0.55) !important

    .card-header
      border-bottom: 1px solid $card-border-color !important

    .list-group
      border-top: none

    .card
      background: $card-border-color !important

  pre > pre
    text-shadow: rgba(0, 0, 0, .2) 0 1px !important
    background: $card-border-color !important

    code
      text-shadow: rgba(0, 0, 0, .2) 0 1px !important

  code
    background: $card-border-color !important

  .form-control, .form-control:focus
    background: transparent !important
    color: white
    border-color: $card-border-color !important

  .input-group
    border-color: $card-border-color

    .input-group-text
      background: $body-bg !important
      color: white
      border-color: $card-border-color

    .form-control
      background: $secondary !important

  .navbar
    background: $card-border-color !important
    @extend .navbar-dark

    .navbar-brand
      color: $body-color !important

  --#{$variable-prefix}body-color: #{$body-color}
  --#{$variable-prefix}body-bg: #{$body-bg}
diff --git a/chartered-frontend/src/index.sass b/chartered-frontend/src/index.sass
deleted file mode 100644
index d5aeecc..0000000 100644
--- a/chartered-frontend/src/index.sass
+++ /dev/null
@@ -1,66 +1,0 @@
@import "../node_modules/bootstrap/scss/functions"
@import "../node_modules/bootstrap/scss/variables"
@import "../node_modules/bootstrap/scss/mixins"
@import "../node_modules/bootstrap/scss/root"

$primary: #0d6efd
$body-bg: $primary
$body-color: white
$font-family-monospace: "Source Code Pro", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace
$font-size-base: 0.875rem
$enable-cssgrid: true

@import "../node_modules/react-placeholder/lib/reactPlaceholder.css"
@import "../node_modules/bootstrap/scss/bootstrap.scss"
@import "../node_modules/source-code-pro/source-code-pro.css"

html
    background: white

code
    background: #f5f2f0
    padding: .1rem .2rem
    border-radius: 3px

    pre &
        padding: 0

p:last-of-type
    margin-bottom: 0

td.fit, th.fit
    width: 0.1%
    white-space: nowrap

.text-decoration-underline-dotted
    text-decoration: underline dotted

.side-lines
    display: grid
    grid-template-columns: minmax(20px, 1fr) auto minmax(20px, 1fr)
    align-items: center
    text-align: center
    grid-gap: 20px
    width: 100%

    &::before
        content: ""
        border-top: 1px solid

    &::after
        content: ""
        border-top: 1px solid

.navbar .form-control
    transition: width 0.5s ease-in-out
    width: 250px

    &:focus, &:not(:placeholder-shown)
        width: 350px

.modal-content
    color: black

.bg-default-profile-picture
    background: rgb(235, 235, 235)
    color: rgba(0, 0, 0, .2)
diff --git a/chartered-frontend/src/index.tsx b/chartered-frontend/src/index.tsx
deleted file mode 100644
index ebcfc00..0000000 100644
--- a/chartered-frontend/src/index.tsx
+++ /dev/null
@@ -1,123 +1,0 @@
import "./dark.sass"; // TODO: lazyload
import "./index.sass";

import "./overscrollColourFixer.ts";

import { useEffect } from "react";
import ReactDOM from "react-dom";
import {
  BrowserRouter as Router,
  Routes,
  Route,
  useLocation,
  Navigate,
} from "react-router-dom";

import { ProvideAuth, HandleOAuthLogin, useAuth } from "./useAuth";

import Login from "./pages/Login";
import Dashboard from "./pages/Dashboard";
import CrateView from "./pages/crate/CrateView";
import ListSshKeys from "./pages/ssh-keys/ListSshKeys";
import AddSshKeys from "./pages/ssh-keys/AddSshKeys";
import ListOrganisations from "./pages/organisations/ListOrganisations";
import OrganisationView from "./pages/crate/OrganisationView";
import CreateOrganisation from "./pages/organisations/CreateOrganisation";
import User from "./pages/User";
import Search from "./pages/Search";
import { backgroundFix } from "./overscrollColourFixer";
import Register from "./pages/Register";
import ListSessions from "./pages/sessions/ListSessions";
import NotFound from "./pages/NotFound";

if (
  window.matchMedia &&
  window.matchMedia("(prefers-color-scheme: dark)").matches
) {
  document.querySelector("body")?.classList.add("dark");
}

window
  .matchMedia("(prefers-color-scheme: dark)")
  .addEventListener("change", (e) => {
    const body = document.querySelector("body");
    body?.classList.toggle("dark", e.matches);
    backgroundFix(body);
  });

// prettier-ignore
function App() {
  return (
    <ProvideAuth>
      <Router>
        <Routes>
          {/* Public routes, visible only to unauthenticated users */}
          <Route path="/login" element={<Public element={<Login />} />} />
          <Route path="/register" element={<Public element={<Register />} />} />
          <Route path="/login/oauth" element={<Public element={<HandleOAuthLogin />} />} />

          {/* Private routes, visible only to authenticated users */}
          <Route path="/" element={<Private element={<Navigate replace to="/dashboard" />} />} />
          <Route path="/dashboard" element={<Private element={<Dashboard />} />} />
          <Route path="/search" element={<Private element={<Search />} />} />

          <Route path="/crates/:organisation" element={<Private element={<OrganisationView />} />} />
          <Route path="/crates/:organisation/:crate" element={<Private element={<CrateView />} />} />
          <Route path="/crates/:organisation/:crate/:subview" element={<Private element={<CrateView />} />} />

          <Route path="/users/:uuid" element={<Private element={<User />} />} />

          <Route path="/ssh-keys" element={<Private element={<Navigate replace to="/ssh-keys/list" />} />} />
          <Route path="/ssh-keys/list" element={<Private element={<ListSshKeys />} />} />
          <Route path="/ssh-keys/add" element={<Private element={<AddSshKeys />} />} />

          <Route path="/organisations" element={<Private element={<Navigate replace to="/organisations/list" />} />} />
          <Route path="/organisations/list" element={<Private element={<ListOrganisations />} />} />
          <Route path="/organisations/create" element={<Private element={<CreateOrganisation />} />} />

          <Route path="/sessions" element={<Private element={<Navigate replace to="/sessions/list" />} />} />
          <Route path="/sessions/list" element={<Private element={<ListSessions />} />} />

          <Route path="/404" element={<NotFound />} />
          <Route path="*" element={<Navigate replace to="/404" />} />
        </Routes>
      </Router>
    </ProvideAuth>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));

function Public(i: { element: JSX.Element }) {
  const auth = useAuth();
  const location = useLocation();

  if (auth?.getAuthKey()) {
    return (
      <Navigate
        to={location.state?.from?.pathname ?? "/dashboard"}
        state={{ from: location }}
      />
    );
  } else {
    return <>{i.element}</>;
  }
}

function Private(i: { element: JSX.Element }) {
  const auth = useAuth();
  const location = useLocation();

  const isAuthenticated = auth?.getAuthKey();
  useEffect(() => {
    if (!isAuthenticated) {
      auth?.logout();
    }
  }, [isAuthenticated]);

  if (auth && isAuthenticated) {
    return <>{i.element}</>;
  } else {
    return <Navigate to="/login" state={{ from: location }} />;
  }
}
diff --git a/chartered-frontend/src/overscrollColourFixer.ts b/chartered-frontend/src/overscrollColourFixer.ts
deleted file mode 100644
index 2b6a5d5..0000000 100644
--- a/chartered-frontend/src/overscrollColourFixer.ts
+++ /dev/null
@@ -1,33 +1,0 @@
// A quick little utility to fix the overscroll colour at the bottom
// of the page vs the top of the page. We don't have a footer so we
// just want to carry on the body background, whereas the header is
// white so we want to use that at the top of the page.

export const backgroundFix = (body: HTMLBodyElement | null) => {
  if (body?.classList.contains("dark")) {
    document.documentElement.style.backgroundColor =
      window.scrollY > 70 ? "#0e1825" : "#2a3746";
  } else {
    document.documentElement.style.backgroundColor =
      window.scrollY > 70 ? "var(--bs-primary)" : "white";
  }
};

window.addEventListener("load", () => {
  const body = document.querySelector("body");
  let ticking = false;

  const tickBackgroundFix = () => {
    if (!ticking) {
      ticking = true;

      window.requestAnimationFrame(() => {
        backgroundFix(body);
        ticking = false;
      });
    }
  };

  window.addEventListener("scroll", tickBackgroundFix, false);
  tickBackgroundFix();
});
diff --git a/chartered-frontend/src/useAuth.tsx b/chartered-frontend/src/useAuth.tsx
deleted file mode 100644
index f576a74..0000000 100644
--- a/chartered-frontend/src/useAuth.tsx
+++ /dev/null
@@ -1,247 +1,0 @@
import { useState, useEffect, useContext, createContext } from "react";
import { useLocation, Navigate, useNavigate } from "react-router-dom";
import {
  authenticatedEndpoint,
  BASE_URL,
  unauthenticatedEndpoint,
} from "./util";
import LoadingPage from "./pages/Loading";

export interface OAuthProviders {
  providers: string[];
}

interface LoginResponse {
  user_uuid: string;
  key: string;
  expires: number;
  error?: string;
  picture_url?: string;
}

interface ExtendResponse {
  expires: number;
  error?: string;
}

export interface AuthContext {
  login: (username: string, password: string) => Promise<void>;
  oauthLogin: (provider: string) => Promise<void>;
  logout: () => Promise<void>;
  getAuthKey: () => Promise<string | null>;
  getUserUuid: () => string;
  getPictureUrl: () => string;
  handleLoginResponse: (json: LoginResponse) => any;
}

const authContext = createContext<AuthContext | null>(null);

export function ProvideAuth({ children }: { children: any }) {
  const auth = useProvideAuth();
  return <authContext.Provider value={auth}>{children}</authContext.Provider>;
}

export function HandleOAuthLogin() {
  const location = useLocation();
  const auth = useAuth();
  const navigate = useNavigate();

  useEffect(async () => {
    try {
      let result = await fetch(
        unauthenticatedEndpoint(`auth/login/oauth/complete${location.search}`)
      );
      let json = await result.json();

      auth?.handleLoginResponse(json);
    } catch (err: any) {
      navigate("/login", {
        state: { prompt: { message: err.message, kind: "danger" } },
      });
    }
  });

  return <LoadingPage />;
}

export const useAuth = (): AuthContext | null => {
  return useContext(authContext);
};

function useProvideAuth(): AuthContext {
  const [auth, setAuth] = useState<any[] | null>(() => {
    let authStorage = getAuthStorage();
    return [
      authStorage.userUuid,
      authStorage.authKey,
      authStorage.expires,
      authStorage.pictureUrl,
    ];
  });

  const handleLoginResponse = (response: LoginResponse) => {
    if (response.error) {
      throw new Error(response.error);
    }

    setAuth([
      response.user_uuid,
      response.key,
      new Date(response.expires),
      response.picture_url,
    ]);
  };

  const login = async (username: string, password: string) => {
    let res = await fetch(unauthenticatedEndpoint("auth/login/password"), {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "User-Agent": window.navigator.userAgent,
      },
      body: JSON.stringify({ username, password }),
    });
    let json = await res.json();

    handleLoginResponse(json);
  };

  const oauthLogin = async (provider: string) => {
    let res = await fetch(
      unauthenticatedEndpoint(`auth/login/oauth/${provider}/begin`),
      {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
          "User-Agent": window.navigator.userAgent,
        },
      }
    );
    let json = await res.json();

    if (json.error) {
      throw new Error(json.error);
    }

    window.location.href = json.redirect_url;
  };

  const getAuthKey = () => {
    if (auth?.[2] > new Date()) {
      return auth?.[1];
    } else if (auth) {
      return null;
    }
  };

  const logout = async () => {
    if (auth === null) {
      return;
    }

    try {
      await fetch(`${BASE_URL}/a/${getAuthKey()}/web/v1/auth/logout`, {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
          "User-Agent": window.navigator.userAgent,
        },
      });
    } catch (e) {
      console.error("Failed to fully log user out of session", e);
    } finally {
      setAuth(null);
    }
  };

  const extendSession = async () => {
    if (auth === null || auth?.[2] < new Date()) {
      return;
    }

    try {
      const res = await fetch(
        `${BASE_URL}/a/${getAuthKey()}/web/v1/auth/extend`,
        {
          method: "GET",
          headers: {
            "Content-Type": "application/json",
            "User-Agent": window.navigator.userAgent,
          },
        }
      );
      const response: ExtendResponse = await res.json();

      if (response.error) {
        throw new Error(response.error);
      }

      const newAuth = [...auth];
      newAuth[2] = new Date(response.expires);
      setAuth(newAuth);
    } catch (e) {
      console.error("Failed to extend user session", e);
    }
  };

  const getUserUuid = () => {
    if (auth?.[2] > new Date()) {
      return auth?.[0];
    } else if (auth) {
      return null;
    }
  };

  const getPictureUrl = () => {
    if (auth?.[2] > new Date()) {
      return auth?.[3];
    } else if (auth) {
      return null;
    }
  };

  useEffect(() => {
    localStorage.setItem(
      "charteredAuthentication",
      JSON.stringify({
        userUuid: auth?.[0],
        authKey: auth?.[1],
        expires: auth?.[2],
        pictureUrl: auth?.[3],
      })
    );

    const extendInterval = 60000;
    if (auth?.[2] && auth?.[2].getTime() - new Date().getTime() <= 0) {
      extendSession();
    }

    const extendSessionIntervalId = setInterval(
      () => extendSession(),
      extendInterval
    );

    return () => clearInterval(extendSessionIntervalId);
  }, [auth]);

  return {
    login,
    logout,
    getAuthKey,
    getUserUuid,
    getPictureUrl,
    oauthLogin,
    handleLoginResponse,
  };
}

function getAuthStorage() {
  const saved = localStorage.getItem("charteredAuthentication");
  const initial = saved ? JSON.parse(saved) : {};
  return {
    userUuid: initial?.userUuid || null,
    authKey: initial?.authKey || null,
    expires: initial?.expires ? new Date(initial.expires) : null,
    pictureUrl: initial?.pictureUrl,
  };
}
diff --git a/chartered-frontend/src/util.tsx b/chartered-frontend/src/util.tsx
deleted file mode 100644
index 4c6443e..0000000 100644
--- a/chartered-frontend/src/util.tsx
+++ /dev/null
@@ -1,154 +1,0 @@
import { useState, useEffect } from "react";
import ReactPlaceholder from "react-placeholder";
import { AuthContext } from "./useAuth";
import { PersonFill } from "react-bootstrap-icons";

export const BASE_URL = process.env.BASE_URL || "http://localhost:8888";

export function unauthenticatedEndpoint(endpoint: string): string {
  return `${BASE_URL}/a/-/web/v1/${endpoint}`;
}

export function authenticatedEndpoint(
  auth: AuthContext,
  endpoint: string
): string {
  return `${BASE_URL}/a/${auth.getAuthKey()}/web/v1/${endpoint}`;
}

export function useAuthenticatedRequest<S>(
  { auth, endpoint }: { auth: AuthContext; endpoint: string },
  reloadOn: any[] = []
): { response: S | null; error: string | null } {
  const [error, setError] = useState(null);
  const [response, setResponse] = useState(null);

  useEffect(async () => {
    try {
      setResponse(null);
      let res = await fetch(authenticatedEndpoint(auth, endpoint));

      if (res.status == 401) {
        await auth.logout();
        return null;
      }

      let jsonRes = await res.json();

      if (jsonRes.error) {
        setError(jsonRes.error);
      } else {
        setResponse(jsonRes);
      }
    } catch (e: any) {
      setError(e.message);
    }
  }, reloadOn);

  return { response, error };
}

export function useUnauthenticatedRequest<S>(
  { endpoint }: { endpoint: string },
  reloadOn = []
): { response: S | null; error: string | null } {
  const [error, setError] = useState(null);
  const [response, setResponse] = useState(null);

  useEffect(async () => {
    try {
      let res = await fetch(unauthenticatedEndpoint(endpoint));
      let jsonRes = await res.json();

      if (jsonRes.error) {
        setError(jsonRes.error);
      } else {
        setResponse(jsonRes);
      }
    } catch (e: any) {
      setError(e.message);
    }
  }, reloadOn);

  return { response, error };
}

export function ProfilePicture({
  src,
  height,
  width,
  className,
}: {
  src?: string | null;
  height: string;
  width: string;
  className?: string;
}) {
  if (src !== null) {
    return (
      <RoundedPicture
        src={src}
        height={height}
        width={width}
        className={className}
      />
    );
  } else {
    return (
      <div
        className={`position-relative rounded-circle d-inline-flex justify-content-center align-items-center bg-default-profile-picture ${className}`}
        style={{ width, height }}
      >
        <PersonFill
          style={{
            width: `calc(${width} / 2)`,
            height: `calc(${height} / 2)`,
          }}
        />
      </div>
    );
  }
}

export function RoundedPicture({
  src,
  alt,
  height,
  width,
  className,
}: {
  src: string;
  alt?: string;
  height: string;
  width: string;
  className?: string;
}) {
  const [imageLoaded, setImageLoaded] = useState(false);

  return (
    <div
      className={`position-relative d-inline-block ${className || ""}`}
      style={{ height, width }}
    >
      <ReactPlaceholder
        showLoadingAnimation
        type="round"
        style={{ height, width, position: "absolute" }}
        ready={imageLoaded}
      >
        <></>
      </ReactPlaceholder>
      <img
        style={{
          visibility: imageLoaded ? "visible" : "hidden",
          height,
          width,
        }}
        alt={alt}
        src={src}
        onLoad={() => setImageLoaded(true)}
        className="rounded-circle"
      />
    </div>
  );
}
diff --git a/chartered-frontend/static/favicon.png b/chartered-frontend/static/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097 100644
Binary files /dev/null and a/chartered-frontend/static/favicon.png differdiff --git a/chartered-frontend/tests/test.ts b/chartered-frontend/tests/test.ts
new file mode 100644
index 0000000..8fb4a4f 100644
--- /dev/null
+++ a/chartered-frontend/tests/test.ts
@@ -1,0 +1,6 @@
import { expect, test } from '@playwright/test';

test('index page has expected h1', async ({ page }) => {
    await page.goto('/');
    expect(await page.textContent('h1')).toBe('Welcome to SvelteKit');
});
diff --git a/chartered-frontend/src/components/ErrorAlert.svelte b/chartered-frontend/src/components/ErrorAlert.svelte
new file mode 100644
index 0000000..accf540 100644
--- /dev/null
+++ a/chartered-frontend/src/components/ErrorAlert.svelte
@@ -1,0 +1,31 @@
<script type="typescript">
    import { createEventDispatcher } from 'svelte';
    import Icon from './Icon.svelte';

    /**
     * Sets whether the close button should be shown on this error alert.
     */
    export let showClose: boolean = true;

    // create the event dispatcher, so we can tell the caller when the user attempts
    // to close the prompt, so it can clear the message and hide us from display
    const dispatch = createEventDispatcher();
</script>

<div class="flex p-4 mb-2 text-sm text-red-700 bg-red-100 rounded-lg dark:bg-red-200 dark:text-red-800" role="alert">
    <div class="flex-grow flex items-center">
        <slot />
    </div>

    <div class:hidden={!showClose}>
        <button
            type="button"
            on:click={() => dispatch('close')}
            class="bg-red-100 text-red-500 rounded-lg focus:ring-2 focus:ring-red-400 p-1.5 hover:bg-red-200 inline-flex dark:bg-red-200 dark:text-red-600 dark:hover:bg-red-300"
            aria-label="Close"
        >
            <span class="sr-only">Close</span>
            <Icon name="x" />
        </button>
    </div>
</div>
diff --git a/chartered-frontend/src/components/FeaturedCrate.svelte b/chartered-frontend/src/components/FeaturedCrate.svelte
new file mode 100644
index 0000000..c67e2f9 100644
--- /dev/null
+++ a/chartered-frontend/src/components/FeaturedCrate.svelte
@@ -1,0 +1,23 @@
<script type="typescript">
    import type { Crate } from '../types/featured_crate';
    import Icon from './Icon.svelte';

    /**
     * The crate to show in the card
     */
    export let crate: Crate;
</script>

<a href={`/crates/${crate.organisation}/${crate.name}`} class="card flex items-center">
    <div class="flex-grow">
        <div class="font-semibold">
            {crate.organisation}/<span class="text-highlight">{crate.name}</span>
        </div>

        <div class="text-xs flex items-center space-x-1">
            <slot />
        </div>
    </div>

    <Icon name="chevron-right" strokeWidth="3px" />
</a>
diff --git a/chartered-frontend/src/components/Icon.svelte b/chartered-frontend/src/components/Icon.svelte
new file mode 100644
index 0000000..7d687fa 100644
--- /dev/null
+++ a/chartered-frontend/src/components/Icon.svelte
@@ -1,0 +1,35 @@
<script type="typescript">
    import feather from 'feather-icons';
    export const directions = ['n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'];

    export let name;
    export let direction = 'n';
    export let strokeWidth = null;
    export let stroke = null;
    export let width = '1em';
    export let height = '1em';

    $: icon = feather.icons[name];
    $: rotation = directions.indexOf(direction) * 45;
    $: if (icon) {
        if (stroke) icon.attrs['stroke'] = stroke;
        if (strokeWidth) icon.attrs['stroke-width'] = strokeWidth;
    }
</script>

{#if icon}
    <svg {...icon.attrs} style="width: {width}; height: {height}; transform: rotate({rotation}deg);">
        <g>
            {@html icon.contents}
        </g>
    </svg>
{/if}

<style>
    svg {
        width: 1em;
        height: 1em;
        overflow: visible;
        transform-origin: 50% 50%;
    }
</style>
diff --git a/chartered-frontend/src/components/Nav.svelte b/chartered-frontend/src/components/Nav.svelte
new file mode 100644
index 0000000..d331667 100644
--- /dev/null
+++ a/chartered-frontend/src/components/Nav.svelte
@@ -1,0 +1,150 @@
<script type="typescript">
    import { auth, logout } from '../stores/auth';
    import Icon from './Icon.svelte';
    import { goto } from '$app/navigation';

    /**
     * Nav drawer is hidden by default on screen sizes < md, if set to true the nav drawer will
     * be showing on those screen sizes.
     */
    let navDrawerShown = false;

    /**
     * If set to true, the "user menu" dropdown will be showing.
     */
    let userDropdownShown = false;

    /**
     * Binding to the search field.
     */
    let search = '';

    /**
     * Performs a search with the current value of `search`.
     */
    async function performSearch() {
        await goto(`/search?q=${search}`);
    }
</script>

<svelte:window on:click={() => (userDropdownShown = false)} />

<nav class="bg-white border-gray-200 px-2 sm:px-4 py-2.5 rounded dark:bg-gray-900">
    <div class="container flex flex-wrap items-center mx-auto">
        <a href="/" class="flex items-center flex-grow md:flex-grow-0 md:mr-3">
            <span class="self-center text-xl font-semibold whitespace-nowrap dark:text-white">
                ✈️&nbsp;&nbsp;Chartered
            </span>
        </a>

        <div class="flex md:order-2">
            <form on:submit|preventDefault={performSearch} class="hidden relative md:block">
                <div class="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none text-gray-500">
                    <span class="sr-only">Search icon</span>
                    <Icon name="search" />
                </div>

                <input
                    bind:value={search}
                    type="search"
                    class="block p-2 pl-10 w-full text-gray-900 bg-gray-50 rounded-lg border border-gray-300 sm:text-sm focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
                    placeholder="Search..."
                />
            </form>

            <button
                type="button"
                class="inline-flex items-center p-2 text-sm text-gray-500 rounded-lg md:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600"
                on:click={() => (navDrawerShown = !navDrawerShown)}
                aria-expanded={navDrawerShown}
            >
                <span class="sr-only">Open menu</span>
                <Icon height="1.5rem" width="1.5rem" strokeWidth="2" name="menu" />
            </button>

            <div class="relative">
                <button
                    on:click|stopPropagation={() => (userDropdownShown = !userDropdownShown)}
                    class="ml-2 relative flex items-center text-gray-300 dark:text-inherit"
                >
                    <span class="sr-only">Open user menu</span>
                    {#if $auth.picture_url}
                        <img
                            alt="Your profile picture"
                            src={$auth.picture_url}
                            class="rounded-[50%] h-[2.4rem] inline mr-0.5"
                        />
                    {:else}
                        <div
                            class="h-[2.4rem] w-[2.4rem] rounded-[50%] inline mr-0.5 bg-gray-100 dark:bg-gray-800 overflow-hidden"
                        >
                            <Icon height="2.4rem" width="2.4rem" name="user" />
                        </div>
                    {/if}
                    <Icon name="chevron-down" strokeWidth="3px" />
                </button>

                <div
                    class:hidden={!userDropdownShown}
                    class="absolute top-7 right-0 z-50 w-[10rem] my-4 text-base list-none bg-white rounded divide-y divide-gray-100 shadow dark:bg-gray-700 dark:divide-gray-600"
                    on:click={(e) => (e.target.tagName.toLowerCase() === 'a' ? null : e.stopPropagation())}
                >
                    <ul class="py-1">
                        <li>
                            <a
                                href={`/users/${$auth.uuid}`}
                                class="block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white"
                            >
                                Profile
                            </a>
                        </li>
                    </ul>

                    <ul class="py-1">
                        <li>
                            <a
                                href="/sessions/list"
                                class="block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white"
                            >
                                Active Sessions
                            </a>
                        </li>
                        <li>
                            <button
                                on:click={logout}
                                class="block py-2 px-4 w-full text-start text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white"
                            >
                                Sign out
                            </button>
                        </li>
                    </ul>
                </div>
            </div>
        </div>

        <div
            class:hidden={!navDrawerShown}
            class="justify-between items-center w-full md:flex md:w-auto md:flex-grow md:order-1"
            id="navbar-search"
        >
            <form on:submit|preventDefault={performSearch} class="relative mt-3 md:hidden">
                <div class="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none text-gray-500">
                    <Icon name="search" />
                </div>

                <input
                    bind:value={search}
                    type="search"
                    class="block p-2 pl-10 w-full text-gray-900 bg-gray-50 rounded-lg border border-gray-300 sm:text-sm focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
                    placeholder="Search..."
                />
            </form>

            <ul
                class="flex flex-col p-4 mt-4 bg-gray-50 rounded-lg border border-gray-100 md:flex-row md:space-x-8 md:mt-0 md:text-sm md:font-medium md:border-0 md:bg-white dark:bg-gray-800 md:dark:bg-gray-900 dark:border-gray-700"
            >
                <slot />
            </ul>
        </div>
    </div>
</nav>
diff --git a/chartered-frontend/src/components/NavItem.svelte b/chartered-frontend/src/components/NavItem.svelte
new file mode 100644
index 0000000..8349e8c 100644
--- /dev/null
+++ a/chartered-frontend/src/components/NavItem.svelte
@@ -1,0 +1,40 @@
<script type="typescript">
    import { page } from '$app/stores';

    /**
     * URL to navigate to after pressing the link
     */
    export let href: string;

    /**
     * A list of base URLs that should cause this navigation item to be marked as
     * the active page.
     */
    export let aliases: string[] = [];

    let active: boolean;
    $: if (href === '/') {
        active = $page.url.pathname === href;
    } else {
        active = $page.url.pathname.startsWith(href) || aliases.some((v) => $page.url.pathname.startsWith(v));
    }
</script>

<li>
    {#if active}
        <a
            {href}
            class="block py-2 pr-4 pl-3 text-white bg-blue-700 rounded md:bg-transparent md:text-blue-700 md:p-0 dark:text-white"
            aria-current="page"
        >
            <slot />
        </a>
    {:else}
        <a
            {href}
            class="block py-2 pr-4 pl-3 text-gray-700 rounded hover:bg-gray-100 md:hover:bg-transparent md:hover:text-blue-700 md:p-0 md:dark:hover:text-white dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white md:dark:hover:bg-transparent dark:border-gray-700"
        >
            <slot />
        </a>
    {/if}
</li>
diff --git a/chartered-frontend/src/components/RelativeTime.svelte b/chartered-frontend/src/components/RelativeTime.svelte
new file mode 100644
index 0000000..277ef77 100644
--- /dev/null
+++ a/chartered-frontend/src/components/RelativeTime.svelte
@@ -1,0 +1,11 @@
<script type="typescript">
    import { DateTime } from 'luxon';

    export let time: string;

    const date = DateTime.fromMillis(Date.parse(time));
</script>

<time title={date.toLocaleString(DateTime.DATETIME_MED)} datetime={date.toISO()}>
    {date.toRelative()}
</time>
diff --git a/chartered-frontend/src/components/Spinner.svelte b/chartered-frontend/src/components/Spinner.svelte
new file mode 100644
index 0000000..e7f9e28 100644
--- /dev/null
+++ a/chartered-frontend/src/components/Spinner.svelte
@@ -1,0 +1,22 @@
<script type="typescript">
    /**
     * Set whether this spinner should have `display: none`.
     */
    export let hidden: boolean = false;
</script>

<div class:hidden class="absolute top-0 left-0 w-full h-full flex items-center justify-center">
    <svg
        class="animate-spin h-5 w-5 text-blue-500 dark:text-white"
        xmlns="http://www.w3.org/2000/svg"
        fill="none"
        viewBox="0 0 24 24"
    >
        <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" />
        <path
            class="opacity-75"
            fill="currentColor"
            d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
        />
    </svg>
</div>
diff --git a/chartered-frontend/src/img/rust.svg b/chartered-frontend/src/img/rust.svg
new file mode 100644
index 0000000..62424d8 100644
--- /dev/null
+++ a/chartered-frontend/src/img/rust.svg
@@ -1,0 +1,61 @@
<svg version="1.1" height="106" width="106" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="logo" transform="translate(53, 53)">
  <path id="r" transform="translate(0.5, 0.5)" stroke="black" stroke-width="1" stroke-linejoin="round" d="
    M -9,-15 H 4 C 12,-15 12,-7 4,-7 H -9 Z
    M -40,22 H 0 V 11 H -9 V 3 H 1 C 12,3 6,22 15,22 H 40
    V 3 H 34 V 5 C 34,13 25,12 24,7 C 23,2 19,-2 18,-2 C 33,-10 24,-26 12,-26 H -35
    V -15 H -25 V 11 H -40 Z" />
  <g id="gear" mask="url(#holes)">
    <circle r="43" fill="none" stroke="black" stroke-width="9" />
    <g id="cogs">
      <polygon id="cog" stroke="black" stroke-width="3" stroke-linejoin="round" points="46,3 51,0 46,-3" />
      <use xlink:href="#cog" transform="rotate(11.25)" />
      <use xlink:href="#cog" transform="rotate(22.50)" />
      <use xlink:href="#cog" transform="rotate(33.75)" />
      <use xlink:href="#cog" transform="rotate(45.00)" />
      <use xlink:href="#cog" transform="rotate(56.25)" />
      <use xlink:href="#cog" transform="rotate(67.50)" />
      <use xlink:href="#cog" transform="rotate(78.75)" />
      <use xlink:href="#cog" transform="rotate(90.00)" />
      <use xlink:href="#cog" transform="rotate(101.25)" />
      <use xlink:href="#cog" transform="rotate(112.50)" />
      <use xlink:href="#cog" transform="rotate(123.75)" />
      <use xlink:href="#cog" transform="rotate(135.00)" />
      <use xlink:href="#cog" transform="rotate(146.25)" />
      <use xlink:href="#cog" transform="rotate(157.50)" />
      <use xlink:href="#cog" transform="rotate(168.75)" />
      <use xlink:href="#cog" transform="rotate(180.00)" />
      <use xlink:href="#cog" transform="rotate(191.25)" />
      <use xlink:href="#cog" transform="rotate(202.50)" />
      <use xlink:href="#cog" transform="rotate(213.75)" />
      <use xlink:href="#cog" transform="rotate(225.00)" />
      <use xlink:href="#cog" transform="rotate(236.25)" />
      <use xlink:href="#cog" transform="rotate(247.50)" />
      <use xlink:href="#cog" transform="rotate(258.75)" />
      <use xlink:href="#cog" transform="rotate(270.00)" />
      <use xlink:href="#cog" transform="rotate(281.25)" />
      <use xlink:href="#cog" transform="rotate(292.50)" />
      <use xlink:href="#cog" transform="rotate(303.75)" />
      <use xlink:href="#cog" transform="rotate(315.00)" />
      <use xlink:href="#cog" transform="rotate(326.25)" />
      <use xlink:href="#cog" transform="rotate(337.50)" />
      <use xlink:href="#cog" transform="rotate(348.75)" />
    </g>
    <g id="mounts">
      <polygon id="mount" stroke="black" stroke-width="6" stroke-linejoin="round" points="-7,-42 0,-35 7,-42" />
      <use xlink:href="#mount" transform="rotate(72)" />
      <use xlink:href="#mount" transform="rotate(144)" />
      <use xlink:href="#mount" transform="rotate(216)" />
      <use xlink:href="#mount" transform="rotate(288)" />
    </g>
  </g>
  <mask id="holes">
    <rect x="-60" y="-60" width="120" height="120" fill="white"/>
    <circle id="hole" cy="-40" r="3" />
    <use xlink:href="#hole" transform="rotate(72)" />
    <use xlink:href="#hole" transform="rotate(144)" />
    <use xlink:href="#hole" transform="rotate(216)" />
    <use xlink:href="#hole" transform="rotate(288)" />
  </mask>
</g>
</svg>
diff --git a/chartered-frontend/src/pages/Dashboard.tsx b/chartered-frontend/src/pages/Dashboard.tsx
deleted file mode 100644
index fe4847a..0000000 100644
--- a/chartered-frontend/src/pages/Dashboard.tsx
+++ /dev/null
@@ -1,189 +1,0 @@
import { PropsWithChildren } from "react";

import { Link, Navigate } from "react-router-dom";
import { useAuth } from "../useAuth";
import Nav from "../sections/Nav";
import { Calendar3, ChevronRight, Download } from "react-bootstrap-icons";
import { useAuthenticatedRequest } from "../util";
import HumanTime from "react-human-time";
import { OverlayTrigger, Tooltip } from "react-bootstrap";

interface RecentlyCreatedResponse {
  crates: RecentlyCreatedResponseVersion[];
}

interface RecentlyCreatedResponseVersion {
  name: string;
  created_at: string;
  organisation: string;
}

interface RecentlyUpdatedResponse {
  versions: RecentlyUpdatedResponseVersion[];
}

interface RecentlyUpdatedResponseVersion {
  name: string;
  version: string;
  organisation: string;
}

interface MostDownloadedResponse {
  crates: MostDownloadedResponseCrate[];
}

interface MostDownloadedResponseCrate {
  name: string;
  downloads: number;
  organisation: string;
}

export default function Dashboard() {
  const auth = useAuth();

  if (!auth) {
    return <Navigate to="/login" />;
  }

  const { response: recentlyCreated, error: recentlyCreatedError } =
    useAuthenticatedRequest<RecentlyCreatedResponse>({
      auth,
      endpoint: "crates/recently-created",
    });

  const { response: recentlyUpdated, error: recentlyUpdatedError } =
    useAuthenticatedRequest<RecentlyUpdatedResponse>({
      auth,
      endpoint: "crates/recently-updated",
    });

  const { response: mostDownloaded, error: mostDownloadedError } =
    useAuthenticatedRequest<MostDownloadedResponse>({
      auth,
      endpoint: "crates/most-downloaded",
    });

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <h1 className="mb-0">Welcome to Chartered.</h1>
        <p style={{ maxWidth: "72ch" }}>
          A private, authenticated Cargo registry. Everything published to this
          registry is <em>private and visible only to you</em>, until explicit
          permissions are granted to others.
        </p>
        <a
          href="https://book.chart.rs/"
          target="_blank"
          className="btn btn-outline-light shadow-sm"
        >
          Getting Started
        </a>

        <hr />

        <div className="row">
          <div className="col-12 col-md-4">
            <h4>Newly Created</h4>
            {recentlyCreatedError ? (
              <div className="alert alert-danger" role="alert">
                {recentlyCreatedError}
              </div>
            ) : (
              <></>
            )}
            {(recentlyCreated?.crates || []).map((v) => (
              <CrateCard
                key={v.name}
                organisation={v.organisation}
                name={v.name}
              >
                <OverlayTrigger
                  overlay={
                    <Tooltip id={`tooltip-${v.name}-date`}>
                      {new Date(v.created_at).toLocaleString()}
                    </Tooltip>
                  }
                >
                  <span>
                    <Calendar3 />{" "}
                    <HumanTime time={new Date(v.created_at).getTime()} />
                  </span>
                </OverlayTrigger>
              </CrateCard>
            ))}
          </div>

          <div className="col-12 col-md-4">
            <h4>Recently Updated</h4>
            {recentlyUpdatedError ? (
              <div className="alert alert-danger" role="alert">
                {recentlyUpdatedError}
              </div>
            ) : (
              <></>
            )}
            {(recentlyUpdated?.versions || []).map((v) => (
              <CrateCard
                key={v.name}
                organisation={v.organisation}
                name={v.name}
              >
                v{v.version}
              </CrateCard>
            ))}
          </div>

          <div className="col-12 col-md-4">
            <h4>Most Downloaded</h4>
            {mostDownloadedError ? (
              <div className="alert alert-danger" role="alert">
                {mostDownloadedError}
              </div>
            ) : (
              <></>
            )}
            {(mostDownloaded?.crates || []).map((v) => (
              <CrateCard
                key={v.name}
                organisation={v.organisation}
                name={v.name}
              >
                <Download /> {v.downloads.toLocaleString()}
              </CrateCard>
            ))}
          </div>
        </div>
      </div>
    </div>
  );
}

function CrateCard({
  name,
  organisation,
  children,
}: PropsWithChildren<{ name: string; organisation: string }>) {
  return (
    <Link
      to={`/crates/${organisation}/${name}`}
      className="text-decoration-none"
    >
      <div className="card border-0 mb-2 shadow-sm">
        <div className="card-body d-flex flex-row">
          <div className="flex-grow-1 align-self-center">
            <h6 className="text-primary my-0">
              <span className="text-muted">{organisation}/</span>
              {name}
            </h6>
            <small className="text-muted">{children}</small>
          </div>

          <ChevronRight size={16} className="align-self-center" />
        </div>
      </div>
    </Link>
  );
}
diff --git a/chartered-frontend/src/pages/ErrorPage.tsx b/chartered-frontend/src/pages/ErrorPage.tsx
deleted file mode 100644
index a08b5b4..0000000 100644
--- a/chartered-frontend/src/pages/ErrorPage.tsx
+++ /dev/null
@@ -1,9 +1,0 @@
export default function ErrorPage({ message }: { message: string }) {
  return (
    <div className="min-vh-100 d-flex justify-content-center align-items-center">
      <div className="alert alert-danger" role="alert">
        {message}
      </div>
    </div>
  );
}
diff --git a/chartered-frontend/src/pages/Loading.tsx b/chartered-frontend/src/pages/Loading.tsx
deleted file mode 100644
index 7cc5020..0000000 100644
--- a/chartered-frontend/src/pages/Loading.tsx
+++ /dev/null
@@ -1,19 +1,0 @@
export function LoadingSpinner() {
  return (
    <div className="p-4 d-flex justify-content-center align-items-center">
      <div className="spinner-border text-primary" role="status">
        <span className="visually-hidden">Loading...</span>
      </div>
    </div>
  );
}

export default function LoadingPage() {
  return (
    <div className="min-vh-100 d-flex justify-content-center align-items-center">
      <div className="spinner-border text-light" role="status">
        <span className="visually-hidden">Loading...</span>
      </div>
    </div>
  );
}
diff --git a/chartered-frontend/src/pages/Login.tsx b/chartered-frontend/src/pages/Login.tsx
deleted file mode 100644
index 3c1e2ae..0000000 100644
--- a/chartered-frontend/src/pages/Login.tsx
+++ /dev/null
@@ -1,260 +1,0 @@
import {
  useState,
  useEffect,
  useRef,
  SyntheticEvent,
  MouseEventHandler,
} from "react";
import { useLocation, Link } from "react-router-dom";

import { useAuth } from "../useAuth";
import { useUnauthenticatedRequest } from "../util";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
  faGithub,
  faGitlab,
  faGoogle,
  IconDefinition,
} from "@fortawesome/free-brands-svg-icons";
import { faSignInAlt } from "@fortawesome/free-solid-svg-icons";
import { PersonPlus } from "react-bootstrap-icons";

interface OAuthProviders {
  password: boolean;
  providers: string[];
}

interface Prompt {
  message: string;
  kind: string;
}

export default function Login() {
  const location = useLocation();
  const auth = useAuth();

  const [ackLocation, setAckLocation] = useState(false);
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");
  const [prompt, setPrompt] = useState<Prompt | null>(null);
  const [loading, setLoading] = useState<string | null>(null);
  const isMountedRef = useRef<boolean | null>(null);

  const { response: oauthProviders } =
    useUnauthenticatedRequest<OAuthProviders>({
      endpoint: "auth/login/oauth/providers",
    });

  useEffect(() => {
    if (location.state?.prompt && !ackLocation) {
      setPrompt(location.state.prompt);
      setAckLocation(true);
    }

    isMountedRef.current = true;
    return () => {
      isMountedRef.current = false;
    };
  });

  const handleSubmit = async (evt: SyntheticEvent) => {
    evt.preventDefault();

    setPrompt(null);
    setLoading("password");

    try {
      await auth?.login(username, password);
    } catch (e: any) {
      setPrompt({ message: e.message, kind: "danger" });
    } finally {
      if (isMountedRef.current) {
        setLoading(null);
      }
    }
  };

  const handleOAuthLogin = async (provider: string) => {
    setPrompt(null);
    setLoading(provider);

    try {
      await auth?.oauthLogin(provider);
    } catch (e: any) {
      setPrompt({ message: e.message, kind: "danger" });
    }
  };

  return (
    <div className="p-4 min-vh-100 d-flex justify-content-center align-items-center">
      <div>
        <h1>chartered ✈️</h1>
        <h6>a private, authenticated cargo registry</h6>

        <div
          className="card border-0 shadow-sm text-black p-2"
          style={{ width: "40rem" }}
        >
          <div className="card-body">
            <div
              className={`alert alert-${prompt?.kind} alert-dismissible`}
              role="alert"
              style={{ display: prompt ? "block" : "none" }}
            >
              {prompt?.message}

              <button
                type="button"
                className="btn-close"
                aria-label="Close"
                onClick={() => setPrompt(null)}
              />
            </div>

            {oauthProviders?.password ?? true ? <>
              <form onSubmit={handleSubmit}>
                <div className="form-floating">
                  <input
                      type="text"
                      className="form-control"
                      placeholder="john.smith"
                      id="username"
                      disabled={!!loading}
                      value={username}
                      onChange={(e) => setUsername(e.target.value)}
                  />

                  <label htmlFor="email" className="form-label">
                    Username
                  </label>
                </div>

                <div className="form-floating mt-2">
                  <input
                      type="password"
                      className="form-control"
                      placeholder="&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;"
                      id="password"
                      disabled={!!loading}
                      value={password}
                      onChange={(e) => setPassword(e.target.value)}
                  />

                  <label htmlFor="password" className="form-label">
                    Password
                  </label>
                </div>

                <ButtonOrSpinner
                    type="submit"
                    variant="primary"
                    disabled={!!loading}
                    showSpinner={loading === "password"}
                    text={`Login`}
                    icon={faSignInAlt}
                    onClick={handleSubmit}
                />
              </form>

              <Link
                  to="/register"
                  className="btn btn-lg w-100 btn-outline-primary mt-2"
              >
                <PersonPlus /> Register
              </Link>
            </> : <></>}

            {oauthProviders?.providers.length > 0 ? (
              <>
                {oauthProviders?.password ? <div className="side-lines mt-2">or</div> : <></>}

                {oauthProviders.providers.map((v, i) => (
                  <ButtonOrSpinner
                    key={i}
                    type="button"
                    variant="dark"
                    disabled={!!loading}
                    showSpinner={loading === v}
                    text={`Login with ${
                      v.charAt(0).toUpperCase() + v.slice(1)
                    }`}
                    icon={getIconForProvider(v)[0]}
                    background={getIconForProvider(v)[1]}
                    onClick={(evt) => {
                      evt.preventDefault();
                      handleOAuthLogin(v);
                    }}
                    noPadding={i == 0 && !oauthProviders?.password}
                  />
                ))}
              </>
            ) : (
              <></>
            )}
          </div>
        </div>
      </div>
    </div>
  );
}

const BRANDS = {
  default: [faSignInAlt, ""],
  github: [faGithub, "#4078c0"],
  gitlab: [faGitlab, "#6E49cb"],
  google: [faGoogle, "#4285f4"],
};

function getIconForProvider(provider: string): [IconDefinition, string] {
  return BRANDS[provider] || BRANDS.default;
}

function ButtonOrSpinner({
  type,
  variant,
  disabled,
  showSpinner,
  text,
  icon,
  background,
  onClick,
  noPadding,
}: {
  type: "button" | "submit";
  variant: string;
  disabled: boolean;
  showSpinner: boolean;
  text: string;
  icon?: IconDefinition;
  background?: string;
  onClick: MouseEventHandler<HTMLButtonElement>;
  noPadding?: boolean;
}) {
  if (showSpinner) {
    return (
      <div
        className={`spinner-border text-primary ${noPadding ? '' : 'mt-3'} m-auto d-block`}
        role="status"
      >
        <span className="visually-hidden">Logging in...</span>
      </div>
    );
  }

  if (type) {
    return (
      <button
        type={type}
        disabled={disabled}
        onClick={onClick}
        className={`btn btn-lg ${noPadding ? '' : 'mt-2'} btn-${variant} w-100`}
        style={{ background, borderColor: background }}
      >
        {icon ? <FontAwesomeIcon icon={icon} className="me-2" /> : <></>}
        {text}
      </button>
    );
  }

  return <></>;
}
diff --git a/chartered-frontend/src/pages/NotFound.tsx b/chartered-frontend/src/pages/NotFound.tsx
deleted file mode 100644
index 43fa46f..0000000 100644
--- a/chartered-frontend/src/pages/NotFound.tsx
+++ /dev/null
@@ -1,32 +1,0 @@
import Nav from "../sections/Nav";
import { useAuth } from "../useAuth";

export default function NotFound() {
  return (
    <>
      <MaybeShowNav />

      <div
        className="d-flex justify-content-center align-items-center"
        style={{ minHeight: "calc(100vh - 6rem)" }}
      >
        <div className="card border-0 shadow-sm text-black p-2 m-3">
          <div className="card-body">
            Seems you've taken a wrong turn! The page you requested couldn't be
            found.
          </div>
        </div>
      </div>
    </>
  );
}

function MaybeShowNav() {
  const auth = useAuth();

  if (!auth?.getAuthKey()) {
    return <></>;
  }

  return <Nav />;
}
diff --git a/chartered-frontend/src/pages/Register.tsx b/chartered-frontend/src/pages/Register.tsx
deleted file mode 100644
index abac184..0000000 100644
--- a/chartered-frontend/src/pages/Register.tsx
+++ /dev/null
@@ -1,194 +1,0 @@
import {
  useState,
  useEffect,
  useRef,
  SyntheticEvent,
  MouseEventHandler,
} from "react";
import { useLocation, Link, Navigate } from "react-router-dom";

import { useAuth } from "../useAuth";
import { unauthenticatedEndpoint, useUnauthenticatedRequest } from "../util";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { IconDefinition } from "@fortawesome/free-brands-svg-icons";
import { faSignInAlt } from "@fortawesome/free-solid-svg-icons";

interface OAuthProviders {
  providers: string[];
}

export default function Register() {
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");
  const [error, setError] = useState("");
  const [loading, setLoading] = useState<boolean>(false);
  const [complete, setComplete] = useState<boolean>(false);

  const handleSubmit = async (evt: SyntheticEvent) => {
    evt.preventDefault();

    setError("");
    setLoading(true);

    try {
      let res = await fetch(unauthenticatedEndpoint("auth/register/password"), {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "User-Agent": window.navigator.userAgent,
        },
        body: JSON.stringify({ username, password }),
      });
      let json = await res.json();

      if (json.error) {
        throw new Error(json.error);
      } else if (!json.success) {
        throw new Error("Failed to register, please try again later.");
      } else {
        setComplete(true);
      }
    } catch (e: any) {
      setError(e.message);
    } finally {
      setLoading(false);
    }
  };

  if (complete) {
    return (
      <Navigate
        to="/login"
        state={{
          prompt: {
            message: "Successfully registered, please login.",
            kind: "success",
          },
        }}
      />
    );
  }

  return (
    <div className="p-4 min-vh-100 d-flex justify-content-center align-items-center">
      <div>
        <h1>chartered ✈️</h1>
        <h6>a private, authenticated cargo registry</h6>

        <div
          className="card border-0 shadow-sm text-black p-2"
          style={{ width: "40rem" }}
        >
          <div className="card-body">
            <div
              className="alert alert-danger alert-dismissible"
              role="alert"
              style={{ display: error ? "block" : "none" }}
            >
              {error}

              <button
                type="button"
                className="btn-close"
                aria-label="Close"
                onClick={() => setError("")}
              />
            </div>

            <form onSubmit={handleSubmit}>
              <div className="form-floating">
                <input
                  type="text"
                  className="form-control"
                  placeholder="john.smith"
                  id="username"
                  disabled={loading}
                  value={username}
                  onChange={(e) => setUsername(e.target.value)}
                />

                <label htmlFor="username" className="form-label">
                  Username
                </label>
              </div>

              <div className="form-floating mt-2">
                <input
                  type="password"
                  className="form-control"
                  placeholder="&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;&bull;"
                  id="password"
                  disabled={loading}
                  value={password}
                  onChange={(e) => setPassword(e.target.value)}
                />

                <label htmlFor="password" className="form-label">
                  Password
                </label>
              </div>

              <ButtonOrSpinner
                type="submit"
                variant="primary"
                disabled={loading}
                showSpinner={loading}
                text={`Register`}
                icon={faSignInAlt}
                onClick={handleSubmit}
              />
            </form>
          </div>
        </div>
      </div>
    </div>
  );
}

function ButtonOrSpinner({
  type,
  variant,
  disabled,
  showSpinner,
  text,
  icon,
  background,
  onClick,
}: {
  type: "button" | "submit";
  variant: string;
  disabled: boolean;
  showSpinner: boolean;
  text: string;
  icon?: IconDefinition;
  background?: string;
  onClick: MouseEventHandler<HTMLButtonElement>;
}) {
  if (showSpinner) {
    return (
      <div
        className="spinner-border text-primary mt-3 m-auto d-block"
        role="status"
      >
        <span className="visually-hidden">Logging in...</span>
      </div>
    );
  }

  if (type) {
    return (
      <button
        type={type}
        disabled={disabled}
        onClick={onClick}
        className={`btn btn-lg mt-2 btn-${variant} w-100`}
        style={{ background, borderColor: background }}
      >
        {icon ? <FontAwesomeIcon icon={icon} className="me-2" /> : <></>}
        {text}
      </button>
    );
  }

  return <></>;
}
diff --git a/chartered-frontend/src/pages/Search.tsx b/chartered-frontend/src/pages/Search.tsx
deleted file mode 100644
index 4c9290f..0000000 100644
--- a/chartered-frontend/src/pages/Search.tsx
+++ /dev/null
@@ -1,217 +1,0 @@
import { Link, useSearchParams } from "react-router-dom";

import Nav from "../sections/Nav";
import { useAuth } from "../useAuth";
import { ProfilePicture, useAuthenticatedRequest } from "../util";

import { BoxSeam } from "react-bootstrap-icons";
import { LoadingSpinner } from "./Loading";

export default function Search() {
  const [searchParams] = useSearchParams();

  const query = searchParams.get("q");

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <h1>Search Results {query ? <>for '{query}'</> : <></>}</h1>

        <UsersResults query={query} />
        <CrateResults query={query} className="mt-2" />
      </div>
    </div>
  );
}

interface UsersSearchResponse {
  users: UserSearchResponseUser[];
}

interface UserSearchResponseUser {
  user_uuid: string;
  display_name: string;
  picture_url: string;
}

function UsersResults({ query }: { query: string }) {
  const auth = useAuth();

  if (!auth) {
    return <></>;
  }

  const { response: results, error } =
    useAuthenticatedRequest<UsersSearchResponse>(
      {
        auth,
        endpoint: "users/search?q=" + encodeURIComponent(query),
      },
      [query]
    );

  if (error) {
    return <div className="alert alert-danger">{error}</div>;
  }

  if (!results) {
    return (
      <div className="card border-0 shadow-sm text-black p-2">
        <div className="card-body">
          {[0, 1, 2].map((i) => (
            <ProfilePicture
              key={i}
              height="5rem"
              width="5rem"
              className="me-2"
              src={undefined}
            />
          ))}
        </div>
      </div>
    );
  }

  if (results?.users.length === 0) {
    return <></>;
  }

  return (
    <div className="card border-0 shadow-sm text-black p-2">
      <div className="card-body d-flex">
        {results.users.map((user, i) => (
          <Link to={`/users/${user.user_uuid}`} key={i}>
            <ProfilePicture
              height="5rem"
              width="5rem"
              className="me-2"
              src={user.picture_url}
            />
          </Link>
        ))}
      </div>
    </div>
  );
}

interface CrateSearchResponse {
  crates: CrateSearchResponseCrate[];
}

interface CrateSearchResponseCrate {
  organisation: string;
  name: string;
  description: string;
  homepage?: string;
  repository?: string;
  version: string;
}

function CrateResults({
  query,
  className,
}: {
  query: string;
  className?: string;
}) {
  const auth = useAuth();

  if (!auth) {
    return <></>;
  }

  const { response: results, error } =
    useAuthenticatedRequest<CrateSearchResponse>(
      {
        auth,
        endpoint: "crates/search?q=" + encodeURIComponent(query),
      },
      [query]
    );

  if (error) {
    return <div className="alert alert-danger">{error}</div>;
  }

  if (!results) {
    return (
      <div className={`card border-0 shadow-sm text-black p-2 ${className}`}>
        <div className="card-body">
          <LoadingSpinner />
        </div>
      </div>
    );
  }

  if (results?.crates.length === 0) {
    return <></>;
  }

  return (
    <div className={`card border-0 shadow-sm text-black ${className}`}>
      <div className="table-responsive">
        <table className="table table-striped">
          <tbody>
            {results?.crates.map((crate, i) => (
              <tr key={i}>
                <td className="p-3">
                  <div className="d-flex flex-row align-items-center">
                    <div
                      className="text-white circle bg-primary bg-gradient d-inline rounded-circle d-inline-flex justify-content-center align-items-center"
                      style={{ width: "2rem", height: "2rem" }}
                    >
                      <BoxSeam />
                    </div>
                    <Link
                      to={`/crates/${crate.organisation}/${crate.name}`}
                      className="text-decoration-none"
                    >
                      <h4 className="text-primary d-inline px-2 m-0">
                        <span className="text-muted">{crate.organisation}</span>
                        /{crate.name}
                      </h4>
                    </Link>
                    <h6 className="text-muted m-0 mt-1">{crate.version}</h6>
                  </div>

                  <p className="m-0">{crate.description}</p>

                  {crate.homepage || crate.repository ? (
                    <div className="mt-2 small">
                      {crate.homepage ? (
                        <a
                          href={crate.homepage}
                          className="text-decoration-none me-2"
                          target="_blank"
                        >
                          Homepage
                        </a>
                      ) : (
                        <></>
                      )}
                      {crate.repository ? (
                        <a
                          href={crate.repository}
                          className="text-decoration-none me-2"
                          target="_blank"
                        >
                          Repository
                        </a>
                      ) : (
                        <></>
                      )}
                    </div>
                  ) : (
                    <></>
                  )}
                </td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    </div>
  );
}
diff --git a/chartered-frontend/src/pages/User.tsx b/chartered-frontend/src/pages/User.tsx
deleted file mode 100644
index e522b32..0000000 100644
--- a/chartered-frontend/src/pages/User.tsx
+++ /dev/null
@@ -1,168 +1,0 @@
import { useParams, Navigate } from "react-router-dom";
import { useAuth } from "../useAuth";
import { ProfilePicture, useAuthenticatedRequest } from "../util";
import Nav from "../sections/Nav";
import ErrorPage from "./ErrorPage";
import ReactPlaceholder from "react-placeholder/lib";
import { Envelope, HouseDoor } from "react-bootstrap-icons";

interface Response {
  uuid: string;
  username: string;
  name?: string;
  nick?: string;
  email?: string;
  external_profile_url?: string;
  picture_url?: string;
}

interface UrlParams {
  uuid: string;
}

export default function User() {
  const auth = useAuth();
  const { uuid } = useParams();

  if (!auth) {
    return <Navigate to="/login" />;
  }

  const { response: user, error } = useAuthenticatedRequest<Response>({
    auth,
    endpoint: "users/info/" + uuid,
  });

  if (error) {
    return <ErrorPage message={error} />;
  }

  const ready = !!user;

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <div className="row align-items-stretch">
          <div className="col-12 col-md-6 mb-3">
            <div className="card border-0 shadow-sm text-black h-100">
              <div className="card-body">
                <div className="d-flex flex-row align-items-center">
                  <ProfilePicture
                    src={user?.picture_url}
                    height="96px"
                    width="96px"
                  />

                  <div className="px-2">
                    <h1 className="text-primary my-0">
                      <ReactPlaceholder
                        showLoadingAnimation
                        type="text"
                        rows={1}
                        ready={ready}
                        style={{ width: "12rem" }}
                      >
                        {user?.nick || user?.name || user?.username}
                      </ReactPlaceholder>
                    </h1>
                  </div>
                </div>
              </div>
            </div>
          </div>

          <div className="col-12 col-md-6 mb-3">
            <div className="card border-0 shadow-sm text-black h-100">
              <div className="card-body">
                <h5>Aliases</h5>

                {user?.nick ? (
                  <>
                    {user?.nick}
                    <br />
                  </>
                ) : (
                  <></>
                )}
                {user?.name ? (
                  <>
                    {user?.name}
                    <br />
                  </>
                ) : (
                  <></>
                )}
                {user?.username ? (
                  <>
                    {user?.username}
                    <br />
                  </>
                ) : (
                  <></>
                )}
              </div>
            </div>
          </div>
        </div>

        <div className="row align-items-stretch">
          <div className="col-12">
            <div className="card border-0 shadow-sm text-black h-100">
              <div className="card-body">
                <h5>Links</h5>

                {ready && !user?.external_profile_url && !user?.email
                  ? `${
                      user?.nick || user?.name || user?.username
                    } hasn't added any links to their profile yet.`
                  : ""}

                {!ready || user?.external_profile_url ? (
                  <div>
                    <HouseDoor />
                    &nbsp;
                    <ReactPlaceholder
                      showLoadingAnimation
                      type="text"
                      rows={1}
                      ready={ready}
                      className="position-relative d-inline-block"
                      style={{ width: "12rem", top: "4px" }}
                    >
                      <a href={user?.external_profile_url} target="_blank">
                        {user?.external_profile_url}
                      </a>
                    </ReactPlaceholder>
                  </div>
                ) : (
                  <></>
                )}

                {!ready || user?.email ? (
                  <div>
                    <Envelope />
                    &nbsp;
                    <ReactPlaceholder
                      showLoadingAnimation
                      type="text"
                      rows={1}
                      ready={ready}
                      className="position-relative d-inline-block"
                      style={{ width: "12rem", top: "4px" }}
                    >
                      <a href={`mailto:${user?.email}`}>{user?.email}</a>
                    </ReactPlaceholder>
                  </div>
                ) : (
                  <></>
                )}
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}
diff --git a/chartered-frontend/src/routes/+error.svelte b/chartered-frontend/src/routes/+error.svelte
new file mode 100644
index 0000000..c6c266d 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/+error.svelte
@@ -1,0 +1,8 @@
<script type="typescript">
    import { page } from '$app/stores';
</script>

<div class="flex flex-col items-center justify-center text-center h-screen">
    <h1 class="text-5xl font-bold tracking-light">{$page.status}</h1>
    <h2 class="text-xl tracking-light">{$page.error.message}</h2>
</div>
diff --git a/chartered-frontend/src/routes/+layout.svelte b/chartered-frontend/src/routes/+layout.svelte
new file mode 100644
index 0000000..1ad119e 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/+layout.svelte
@@ -1,0 +1,5 @@
<script type="typescript">
    import '../app.pcss';
</script>

<slot />
diff --git a/chartered-frontend/src/routes/+layout.ts b/chartered-frontend/src/routes/+layout.ts
new file mode 100644
index 0000000..8d3a5a1 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/+layout.ts
@@ -1,0 +1,5 @@
// we're primarily behind authentication in this app, so we don't
// want any server-side rendering features
export const csr = true;
export const prerender = false;
export const ssr = false;
diff --git a/chartered-frontend/src/sections/Nav.tsx b/chartered-frontend/src/sections/Nav.tsx
deleted file mode 100644
index 340d380..0000000 100644
--- a/chartered-frontend/src/sections/Nav.tsx
+++ /dev/null
@@ -1,124 +1,0 @@
import { SyntheticEvent, useState } from "react";
import { useNavigate, useLocation } from "react-router-dom";
import { NavLink, Link } from "react-router-dom";

import { BoxArrowRight, Search } from "react-bootstrap-icons";
import { useAuth } from "../useAuth";
import { Dropdown, Navbar } from "react-bootstrap";
import { ProfilePicture } from "../util";

export default function Nav() {
  const auth = useAuth();
  const navigate = useNavigate();
  const location = useLocation();

  const logout = async (e: SyntheticEvent) => {
    e.preventDefault();
    await auth?.logout();
  };

  const [search, setSearch] = useState(
    location.pathname === "/search"
      ? new URLSearchParams(location.search).get("q") || ""
      : ""
  );
  const submitSearchForm = (e: SyntheticEvent) => {
    e.preventDefault();

    if (search != "") {
      navigate(`/search?q=${encodeURIComponent(search)}`);
    }
  };

  return (
    <Navbar bg="light" expand="md" className="bg-white shadow-sm">
      <div className="container-fluid">
        <Link className="navbar-brand" to="/dashboard">
          ✈️ chartered
        </Link>
        <Navbar.Toggle aria-controls="navbar-contents" />

        <Navbar.Collapse id="navbar-contents" role="navigation">
          <ul className="navbar-nav mb-2 mb-md-0 me-auto">
            <li className="nav-item">
              <NavLink to="/dashboard" className="nav-link">
                Home
              </NavLink>
            </li>
            <li className="nav-item">
              <NavLink to="/ssh-keys" className="nav-link">
                SSH Keys
              </NavLink>
            </li>
            <li className="nav-item">
              <NavLink to="/organisations" className="nav-link">
                Organisations
              </NavLink>
            </li>
          </ul>

          <form className="d-flex" onSubmit={submitSearchForm}>
            <div className="input-group">
              <span className="input-group-text bg-transparent border-none">
                <Search />
              </span>

              <input
                className="form-control me-2"
                type="search"
                placeholder="Search"
                aria-label="Search"
                value={search}
                onChange={(e) => setSearch(e.target.value)}
              />
            </div>
          </form>

          <ul className="navbar-nav">
            <li className="nav-item">
              <Dropdown as="div" className="mt-2 mt-md-0">
                <Dropdown.Toggle
                  as="a"
                  role="button"
                  aria-label="View profile and more"
                  style={{ color: "rgba(0, 0, 0, 0.55)" }}
                  className="d-inline-flex align-items-center"
                >
                  <ProfilePicture
                    src={auth?.getPictureUrl()}
                    height="2rem"
                    width="2rem"
                  />
                </Dropdown.Toggle>

                <Dropdown.Menu
                  align={{ md: "end" }}
                  style={{ marginTop: "5px" }}
                >
                  <Dropdown.Item as={Link} to={`/users/${auth?.getUserUuid()}`}>
                    Your profile
                  </Dropdown.Item>

                  <Dropdown.Item as={Link} to="/sessions">
                    Sessions
                  </Dropdown.Item>

                  <Dropdown.Divider />

                  <Dropdown.Item
                    as="a"
                    href="#"
                    onClick={logout}
                    className="text-danger"
                  >
                    Logout <BoxArrowRight />
                  </Dropdown.Item>
                </Dropdown.Menu>
              </Dropdown>
            </li>
          </ul>
        </Navbar.Collapse>
      </div>
    </Navbar>
  );
}
diff --git a/chartered-frontend/src/stores/auth.ts b/chartered-frontend/src/stores/auth.ts
new file mode 100644
index 0000000..a019136 100644
--- /dev/null
+++ a/chartered-frontend/src/stores/auth.ts
@@ -1,0 +1,259 @@
import { get, writable } from 'svelte/store';
import { goto } from '$app/navigation';

/**
 * The base URL of the chartered-web instance
 */
export const BASE_URL = import.meta.env.CHARTERED_WEB_URL || 'http://127.0.0.1:8888';

/**
 * Key in localStorage to store authentication information in
 */
const AUTH_LOCAL_STORAGE_KEY = 'auth.auth';

/**
 * Structure of the authentication information in local storage
 */
interface Auth {
    uuid: string;
    auth_key: string;
    expires: number;
    picture_url: string;
}

// grab the initial state from localStorage and initialise the actual store with the value we
// grabbed, if there was one.
const initialState = window.localStorage.getItem(AUTH_LOCAL_STORAGE_KEY);
export const auth = writable<Auth | null>(initialState ? JSON.parse(initialState) : null);

// subscribe to the auth store change events, so we can persist the changes to localStorage
auth.subscribe((v) => window.localStorage.setItem(AUTH_LOCAL_STORAGE_KEY, JSON.stringify(v)));

/**
 * Error response that all of our chartered-web endpoints conform to
 */
interface Error {
    error?: string;
}

/**
 * Response type of /web/v1/auth/extend, used to extend the user's current session
 */
interface ExtendResponse {
    expires: string;
}
type ExtendResult = ExtendResponse & Error;

/**
 * Attempt to extend the user's session, logging the user out if the session has already expired
 * before we were called.
 */
export async function extendSession() {
    // grab the current value of the auth store
    const currentAuth = get(auth);

    // sanity check to ensure that the user has a valid session according to what we have in our
    // store, logging the user out if our store knows the token is already expired
    if (currentAuth === null) {
        // the user has no active session, there's nothing we can do here
        return;
    } else if (currentAuth.expires < Date.now()) {
        // the store thinks that the token has expired, so it probably has. let's ensure the server
        // thinks the same by attempting a logout, and then we'll clear the session from the store
        await logout();
        return;
    }

    try {
        // call chartered-web to attempt to extend the session
        const result = await fetch(`${BASE_URL}/a/${currentAuth.auth_key}/web/v1/auth/extend`);
        const json: ExtendResult = await result.json();

        // backend returned an error, nothing we can do here
        if (json.error) {
            throw new Error(json.error);
        }

        // we got a successful response back from the server with the next expiry time so lets
        // update our local store
        currentAuth.expires = Date.parse(json.expires);
        auth.set(currentAuth);
    } catch (e) {
        // if the user's token is invalid for whatever reason after trying to refresh it,
        // we should log them out. otherwise, we don't really know how to handle the error,
        // and we should just print the error out to the console
        if (e === 'Expired auth token') {
            auth.set(null);
        } else {
            console.error('Failed to extend user session', e);
        }
    }
}

// start the cron loop to extend the session every minute
if (!(window as any).extendSessionInterval) {
    extendSession();
    (window as any).extendSessionInterval = setInterval(extendSession, 60000);
}

/**
 * Successful response type of /web/v1/auth/login/password, returned once the user has
 * an active session on the backend
 */
interface LoginResponse {
    user_uuid: string;
    key: string;
    expires: string;
    picture_url: string;
}
type LoginResult = LoginResponse & Error;

/**
 * Attempt to log the user in using password-based auth with the given credentials,
 * throwing an error if the credentials are invalid or another error occurred.
 *
 * @param username username to attempt to log in with
 * @param password password to attempt to log in with
 */
export async function login(username: string, password: string) {
    // call the backend and attempt the authentication
    const result = await fetch(`${BASE_URL}/a/-/web/v1/auth/login/password`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ username, password }),
    });
    const json: LoginResult = await result.json();

    // server returned an error, forward it on - there's nothing else we
    // can do here
    if (json.error) {
        throw new Error(json.error);
    }

    // we got a successful response back from the server, get in there son
    auth.set({
        auth_key: json.key,
        expires: Date.parse(json.expires),
        picture_url: json.picture_url,
        uuid: json.user_uuid,
    });
}

/**
 * Successful response type of /web/v1/auth/login/oauth/[provider]/begin, contains the URL
 * the user needs to visit to complete the OAuth flow.
 */
interface LoginOAuthResponse {
    redirect_url: string;
}
type LoginOAuthResult = LoginOAuthResponse & Error;

/**
 * Sends a GET request to the backend using the users current credentials.
 *
 * @param url url (without base) to send request to
 */
export async function request<T>(url: string): Promise<T> {
    let token = get(auth)?.auth_key;

    if (!token) {
        throw new Error('Not authenticated');
    }

    let result = await fetch(`${BASE_URL}/a/${token}${url}`);
    let json: T & Error = await result.json();

    // TODO: handle 404s
    if (json.error) {
        throw new Error(json.error);
    }

    return json;
}

/**
 * Grab an authentication URL for the provider and redirect the user to it.
 *
 * @param provider OAuth provider as configured on the backend to grab an auth link for
 */
export async function loginOAuth(provider: string) {
    const result = await fetch(`${BASE_URL}/a/-/web/v1/auth/login/oauth/${provider}/begin`);
    const json: LoginOAuthResult = await result.json();

    if (json.error) {
        throw new Error(json.error);
    }

    await goto(json.redirect_url);
}

/**
 * Send a request to the backend to clear this session, ignoring the response and clearing
 * our local store regardless of the result.
 *
 * If the session still happens to be active on the backend after this, the user can still
 * clear it out through the UI.
 */
export async function logout() {
    try {
        const authKey = get(auth)?.auth_key;

        if (authKey) {
            await fetch(`${BASE_URL}/a/${authKey}/web/v1/auth/logout`);
        }
    } catch (e) {
        console.error('Failed to fully log user out of session', e);
    } finally {
        auth.set(null);
    }
}

/**
 * A list of possible authentication methods for the user, returning OAuth providers and
 * whether password auth is enabled.
 */
interface OAuthProviders {
    password: boolean;
    providers: string[];
}

/**
 * Grab all the possible authentication methods from the backend.
 */
export function fetchOAuthProviders(): Promise<OAuthProviders> {
    return fetch(`${BASE_URL}/a/-/web/v1/auth/login/oauth/providers`).then((v) => v.json());
}

/**
 * Response of /web/v1/auth/register/password endpoint for password-based authentication.
 */
interface RegisterResponse {
    success: boolean;
}
type RegisterResult = RegisterResponse & Error;

/**
 * Attempt to register a user with the given credentials, throwing an error if registration
 * fails for whatever reason.
 *
 * @param username username to register
 * @param password password to register
 */
export async function register(username: string, password: string) {
    // send register request to backend
    let result = await fetch(`${BASE_URL}/a/-/web/v1/auth/register/password`, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({ username, password }),
    });
    let json: RegisterResult = await result.json();

    // throw an error if registration fails
    if (json.error) {
        throw new Error(json.error);
    } else if (!json.success) {
        throw new Error('Failed to register, please try again later.');
    }
}
diff --git a/chartered-frontend/src/types/crate.ts b/chartered-frontend/src/types/crate.ts
new file mode 100644
index 0000000..76388c1 100644
--- /dev/null
+++ a/chartered-frontend/src/types/crate.ts
@@ -1,0 +1,31 @@
export interface Crate {
    name: string;
    readme?: string;
    description?: string;
    repository?: string;
    homepage?: string;
    documentation?: string;
    versions: Version[];
}

export interface Version {
    name: string;
    deps: VersionDependency[];
    vers: string;
    features: { [key: string]: any };
    size: number;
    created_at: string;
    uploader: VersionUploader;
}

export interface VersionDependency {
    name: string;
    req: string;
    registry?: string;
}

export interface VersionUploader {
    uuid: string;
    display_name: string;
    picture_url?: string;
}
diff --git a/chartered-frontend/src/types/featured_crate.ts b/chartered-frontend/src/types/featured_crate.ts
new file mode 100644
index 0000000..578e021 100644
--- /dev/null
+++ a/chartered-frontend/src/types/featured_crate.ts
@@ -1,0 +1,16 @@
export interface Crate {
    name: string;
    organisation: string;
}

export interface MostDownloaded {
    crates: Array<Crate & { downloads: number }>;
}

export interface RecentlyCreated {
    crates: Array<Crate & { created_at: string }>;
}

export interface RecentlyUpdated {
    versions: Array<Crate & { version: string }>;
}
diff --git a/chartered-frontend/src/types/organisations.ts b/chartered-frontend/src/types/organisations.ts
new file mode 100644
index 0000000..2e13252 100644
--- /dev/null
+++ a/chartered-frontend/src/types/organisations.ts
@@ -1,0 +1,25 @@
export interface OrganisationList {
    organisations: OrganisationListItem[];
}

export interface OrganisationListItem {
    name: string;
    description: string;
}

export interface OrganisationDetail {
    description: string;
    crates: OrganisationCrate[];
}

export interface OrganisationCrate {
    name: string;
    description: string;
}

export interface OrganisationMember {
    uuid: string;
    display_name: string;
    picture_url?: string;
    permissions: string[];
}
diff --git a/chartered-frontend/src/types/sessions.ts b/chartered-frontend/src/types/sessions.ts
new file mode 100644
index 0000000..c66e01b 100644
--- /dev/null
+++ a/chartered-frontend/src/types/sessions.ts
@@ -1,0 +1,11 @@
export interface Sessions {
    sessions: Session[];
}

export interface Session {
    uuid: string;
    expires_at?: string;
    user_agent?: string;
    ip: string;
    ssh_key_fingerprint?: string;
}
diff --git a/chartered-frontend/src/types/ssh_keys.ts b/chartered-frontend/src/types/ssh_keys.ts
new file mode 100644
index 0000000..5b54637 100644
--- /dev/null
+++ a/chartered-frontend/src/types/ssh_keys.ts
@@ -1,0 +1,31 @@
/**
 * The result of a `GET /web/v1/ssh-key`
 */
export interface SshKeys {
    keys: { [k: number]: SshKey };
}

/**
 * A singular SSH key from `SshKeys`.
 */
export interface SshKey {
    uuid: string;
    name: string;
    fingerprint: string;
    created_at: string;
    last_used_at?: string;
}

/**
 * The result of a `DELETE /web/v1/ssh-key`.
 */
export interface DeleteSshKeyResult {
    error?: string;
}

/**
 * The result of a `PUT /web/v1/ssh-key`.
 */
export interface AddSshKeyResult {
    error?: string;
}
diff --git a/chartered-frontend/src/types/user.ts b/chartered-frontend/src/types/user.ts
new file mode 100644
index 0000000..66937f4 100644
--- /dev/null
+++ a/chartered-frontend/src/types/user.ts
@@ -1,0 +1,9 @@
export interface User {
    uuid: string;
    username: string;
    name?: string;
    nick?: string;
    email?: string;
    external_profile_url?: string;
    picture_url?: string;
}
diff --git a/chartered-frontend/src/pages/crate/CrateView.tsx b/chartered-frontend/src/pages/crate/CrateView.tsx
deleted file mode 100644
index 331a4a8..0000000 100644
--- a/chartered-frontend/src/pages/crate/CrateView.tsx
+++ /dev/null
@@ -1,554 +1,0 @@
import { useState, Suspense, lazy } from "react";

import { useAuth } from "../../useAuth";
import Nav from "../../sections/Nav";
import Loading, { LoadingSpinner } from "../Loading";
import ErrorPage from "../ErrorPage";
import {
  BoxSeam,
  HouseDoor,
  Book,
  Building,
  Calendar3,
  Check2Square,
  Hdd,
  CheckSquare,
  Square,
} from "react-bootstrap-icons";
import { useParams, NavLink, Navigate, Link } from "react-router-dom";
import {
  authenticatedEndpoint,
  ProfilePicture,
  useAuthenticatedRequest,
} from "../../util";

import ReactMarkdown from "react-markdown";
import remarkGfm from "remark-gfm";
import CommonMembers from "./Members";
import { OverlayTrigger, Tooltip } from "react-bootstrap";
import HumanTime from "react-human-time";

type Tab = "readme" | "versions" | "members";

const Prism = lazy(() =>
  import("react-syntax-highlighter").then((v) => ({ default: v.Prism }))
);

export interface CrateInfo {
  name: string;
  readme?: string;
  description?: string;
  repository?: string;
  homepage?: string;
  documentation?: string;
  versions: CrateInfoVersion[];
}

export interface CrateInfoVersionUploader {
  display_name: string;
  picture_url?: string;
  uuid: string;
}

export interface CrateInfoVersion {
  vers: string;
  deps: CrateInfoVersionDependency[];
  features: { [key: string]: any };
  size: number;
  uploader: CrateInfoVersionUploader;
  created_at: string;
}

export interface CrateInfoVersionDependency {
  name: string;
  req: string;
  registry?: string;
}

interface UrlParameters {
  organisation: string;
  crate: string;
  subview: Tab | undefined;
}

export default function SingleCrate() {
  const auth = useAuth();
  const { organisation, crate, subview: currentTab } = useParams();

  if (!auth) {
    return <Navigate to="/login" />;
  }

  const { response: crateInfo, error } = useAuthenticatedRequest<CrateInfo>(
    {
      auth,
      endpoint: `crates/${organisation}/${crate}`,
    },
    [organisation, crate]
  );

  if (!currentTab) {
    return <Navigate to={`/crates/${organisation}/${crate}/readme`} />;
  }

  if (error) {
    return <ErrorPage message={error} />;
  } else if (!crateInfo) {
    return <Loading />;
  }

  const crateVersion = crateInfo.versions[crateInfo.versions.length - 1];

  const showLinks =
    crateInfo.homepage || crateInfo.documentation || crateInfo.repository;

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <div className="row align-items-stretch">
          <div className={`col-12 col-md-${showLinks ? 6 : 12} mb-3 mb-md-0`}>
            <div className="card border-0 shadow-sm text-black h-100">
              <div className="card-body">
                <div className="d-flex flex-row align-items-center">
                  <div
                    className="text-white circle bg-primary bg-gradient d-inline rounded-circle d-inline-flex justify-content-center align-items-center"
                    style={{ width: "2rem", height: "2rem" }}
                  >
                    <BoxSeam />
                  </div>
                  <h1 className="text-primary d-inline px-2">
                    <Link
                      to={`/crates/${organisation}`}
                      className="text-muted text-decoration-none"
                    >
                      {organisation}/
                    </Link>
                    {crate}
                  </h1>
                  <h2 className="text-muted m-0">{crateVersion?.vers}</h2>
                </div>

                <p className="m-0">{crateInfo.description}</p>
              </div>
            </div>
          </div>

          {showLinks ? (
            <div className="col-12 col-md-6">
              <div className="card border-0 shadow-sm text-black h-100">
                <div className="card-body d-flex flex-column justify-content-center">
                  {crateInfo.homepage ? (
                    <div>
                      <HouseDoor />{" "}
                      <a href={crateInfo.homepage}>{crateInfo.homepage}</a>
                    </div>
                  ) : (
                    <></>
                  )}
                  {crateInfo.documentation ? (
                    <div>
                      <Book />{" "}
                      <a href={crateInfo.documentation}>
                        {crateInfo.documentation}
                      </a>
                    </div>
                  ) : (
                    <></>
                  )}
                  {crateInfo.repository ? (
                    <div>
                      <Building />{" "}
                      <a href={crateInfo.repository}>{crateInfo.repository}</a>
                    </div>
                  ) : (
                    <></>
                  )}
                </div>
              </div>
            </div>
          ) : (
            <></>
          )}
        </div>

        <div className="row my-4">
          <div className="col-12 col-md-9 mb-3 mb-md-0">
            <div className="card border-0 shadow-sm text-black">
              <div className="card-header">
                <ul className="nav nav-pills card-header-pills">
                  <li className="nav-item">
                    <NavLink
                      to={`/crates/${organisation}/${crate}/readme`}
                      className={({ isActive }) =>
                        "nav-link" +
                        (isActive ? " bg-primary bg-gradient active" : "")
                      }
                    >
                      Readme
                    </NavLink>
                  </li>
                  <li className="nav-item">
                    <NavLink
                      to={`/crates/${organisation}/${crate}/versions`}
                      className={({ isActive }) =>
                        "nav-link" +
                        (isActive ? " bg-primary bg-gradient active" : "")
                      }
                    >
                      Versions
                      <span className={`badge rounded-pill bg-danger ms-1`}>
                        {crateInfo.versions.length}
                      </span>
                    </NavLink>
                  </li>
                  <li className="nav-item">
                    <NavLink
                      to={`/crates/${organisation}/${crate}/members`}
                      className={({ isActive }) =>
                        "nav-link" +
                        (isActive ? " bg-primary bg-gradient active" : "")
                      }
                    >
                      Members
                    </NavLink>
                  </li>
                </ul>
              </div>

              <div className={currentTab != "members" ? "card-body" : ""}>
                {currentTab == "readme" ? (
                  <Suspense fallback={<LoadingSpinner />}>
                    <ReadMe crate={crateInfo} />
                  </Suspense>
                ) : (
                  <></>
                )}
                {currentTab == "versions" ? (
                  <Versions crate={crateInfo} />
                ) : (
                  <></>
                )}
                {currentTab == "members" ? (
                  <Members crate={crate} organisation={organisation} />
                ) : (
                  <></>
                )}
              </div>
            </div>
          </div>

          <div className="col-12 col-md-3">
            <div className="card border-0 shadow-sm text-black">
              <div className="card-body pb-0">
                <h5 className="card-title">Dependencies</h5>
              </div>

              <ul className="list-group list-group-flush mb-2">
                {(crateVersion?.deps || []).length === 0 ? (
                  <li className="list-group-item">
                    This crate has no dependencies
                  </li>
                ) : (
                  <></>
                )}
                {crateVersion?.deps.map((dep) => (
                  <Dependency
                    key={`${dep.name}-${dep.req}`}
                    organisation={organisation}
                    dep={dep}
                  />
                ))}
              </ul>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

interface CratesMembersResponse {
  possible_permissions: string[];
  implied_permissions: string[];
  members: Member[];
}

interface Member {
  uuid: string;
  display_name: string;
  permissions: string[];
}

function Dependency({
  organisation,
  dep,
}: {
  organisation: string;
  dep: CrateInfoVersionDependency;
}) {
  let link = <>{dep.name}</>;

  if (dep.registry === null || dep.registry === undefined) {
    link = (
      <a target="_blank" href={`/crates/${organisation}/${dep.name}`}>
        {link}
      </a>
    );
  } else if (dep.registry === "https://github.com/rust-lang/crates.io-index") {
    link = (
      <a target="_blank" href={`https://crates.io/crates/${dep.name}`}>
        {link}
      </a>
    );
  } else if (dep.registry.indexOf("ssh://") === 0) {
    const parts = dep.registry.split("/");
    const org = parts[parts.length - 1];
    if (org) {
      link = <Link to={`/crates/${org}/${dep.name}`}>{link}</Link>;
    }
  }

  return (
    <li className="list-group-item">
      {link} = "<strong>{dep.req}</strong>"
    </li>
  );
}

interface MembersProps {
  organisation: string;
  crate: string;
}

function Members({ organisation, crate }: MembersProps) {
  const auth = useAuth();

  if (!auth) {
    return <></>;
  }

  const [reload, setReload] = useState(0);
  const { response, error } = useAuthenticatedRequest<CratesMembersResponse>(
    {
      auth,
      endpoint: `crates/${organisation}/${crate}/members`,
    },
    [reload]
  );

  if (error) {
    return <div className="card-body">{error}</div>;
  } else if (!response) {
    return (
      <div className="card-body">
        <div className="d-flex justify-content-center align-items-center">
          <div className="spinner-border text-light" role="status">
            <span className="visually-hidden">Loading...</span>
          </div>
        </div>
      </div>
    );
  }

  const saveMemberPermissions = async (
    prospectiveMember: boolean,
    uuid: string,
    selectedPermissions: string[]
  ) => {
    let res = await fetch(
      authenticatedEndpoint(auth, `crates/${organisation}/${crate}/members`),
      {
        method: prospectiveMember ? "PUT" : "PATCH",
        headers: {
          Accept: "application/json",
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          user_uuid: uuid,
          permissions: selectedPermissions,
        }),
      }
    );
    let json = await res.json();

    if (json.error) {
      throw new Error(json.error);
    }

    setReload(reload + 1);
  };

  const deleteMember = async (uuid: string) => {
    let res = await fetch(
      authenticatedEndpoint(auth, `crates/${organisation}/${crate}/members`),
      {
        method: "DELETE",
        headers: {
          Accept: "application/json",
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          user_uuid: uuid,
        }),
      }
    );
    let json = await res.json();

    if (json.error) {
      throw new Error(json.error);
    }

    setReload(reload + 1);
  };

  return (
    <CommonMembers
      members={response.members}
      possiblePermissions={response.possible_permissions}
      impliedPermssions={response.implied_permissions}
      saveMemberPermissions={saveMemberPermissions}
      deleteMember={deleteMember}
    />
  );
}

function Versions(props: { crate: CrateInfo }) {
  const humanFileSize = (size: number) => {
    const i = Math.floor(Math.log(size) / Math.log(1024));
    return (
      Number((size / Math.pow(1024, i)).toFixed(2)) +
      " " +
      ["B", "kB", "MB", "GB", "TB"][i]
    );
  };

  if (props.crate.versions.length === 0) {
    return <>There hasn't yet been any versions published for this crate</>;
  }

  return (
    <div>
      {[...props.crate.versions].reverse().map((version, index) => (
        <div
          key={index}
          className={`card text-white bg-gradient ${
            index == 0 ? "bg-primary" : "bg-dark mt-2"
          }`}
        >
          <div className="card-body d-flex align-items-center">
            <h5 className="m-0">{version.vers}</h5>

            <div className="text-uppercase ms-4" style={{ fontSize: ".75rem" }}>
              <div>
                <div className="d-inline-block">
                  By
                  <ProfilePicture
                    src={version.uploader.picture_url}
                    height="22px"
                    width="22px"
                    className="ms-1 me-1"
                  />
                  <Link
                    to={`/users/${version.uploader.uuid}`}
                    className="link-light"
                  >
                    {version.uploader.display_name}
                  </Link>
                </div>

                <div className="ms-3 d-inline-block">
                  <OverlayTrigger
                    overlay={
                      <Tooltip
                        id={`tooltip-${props.crate.name}-version-${version.vers}-date`}
                      >
                        {new Date(version.created_at).toLocaleString()}
                      </Tooltip>
                    }
                  >
                    <span>
                      <Calendar3 />{" "}
                      <HumanTime
                        time={new Date(version.created_at).getTime()}
                      />
                    </span>
                  </OverlayTrigger>
                </div>
              </div>

              <div>
                <div className="d-inline-block">
                  <Hdd /> {humanFileSize(version.size)}
                </div>

                <div className="ms-3 d-inline-block">
                  <OverlayTrigger
                    overlay={
                      <Tooltip
                        id={`tooltip-${props.crate.name}-version-${version.vers}-feature-${index}`}
                      >
                        <div className="text-start m-2">
                          {Object.keys(version.features).map(
                            (feature, index) => (
                              <div key={index}>
                                {version.features["default"].includes(
                                  feature
                                ) ? (
                                  <CheckSquare className="me-2" />
                                ) : (
                                  <Square className="me-2" />
                                )}
                                {feature}
                              </div>
                            )
                          )}
                        </div>
                      </Tooltip>
                    }
                  >
                    <span>
                      <Check2Square /> {Object.keys(version.features).length}{" "}
                      Features
                    </span>
                  </OverlayTrigger>
                </div>
              </div>
            </div>
          </div>
        </div>
      ))}
    </div>
  );
}

function ReadMe(props: { crate: CrateInfo }) {
  if (!props.crate.readme) {
    return <>This crate has not added a README.</>;
  }

  return (
    <ReactMarkdown
      children={props.crate.readme}
      remarkPlugins={[remarkGfm]}
      components={{
        code({ node, inline, className, children, ...props }) {
          const match = /language-(\w+)/.exec(className || "");
          return !inline && match ? (
            <Prism
              children={String(children).replace(/\n$/, "")}
              language={match[1]}
              PreTag="pre"
              {...props}
            />
          ) : (
            <code className={className} {...props}>
              {children}
            </code>
          );
        },
      }}
    />
  );
}
diff --git a/chartered-frontend/src/pages/crate/Members.tsx b/chartered-frontend/src/pages/crate/Members.tsx
deleted file mode 100644
index 8dd5a9f..0000000 100644
--- a/chartered-frontend/src/pages/crate/Members.tsx
+++ /dev/null
@@ -1,490 +1,0 @@
import { useState, useEffect, useRef } from "react";
import { Link } from "react-router-dom";
import { Trash, CheckLg, PlusLg, PersonPlusFill } from "react-bootstrap-icons";
import { authenticatedEndpoint, ProfilePicture } from "../../util";
import { useAuth } from "../../useAuth";
import { Button, Modal } from "react-bootstrap";
import { AsyncTypeahead } from "react-bootstrap-typeahead";

interface Member {
  uuid: string;
  permissions: string[];
  display_name: string;
  picture_url?: string;
}

export default function Members({
  members,
  possiblePermissions,
  impliedPermissions,
  saveMemberPermissions,
  deleteMember,
}: {
  members: Member[];
  possiblePermissions?: string[];
  impliedPermissions?: string[][][];
  saveMemberPermissions: (
    prospectiveMember: boolean,
    uuid: string,
    selectedPermissions: string[]
  ) => Promise<any>;
  deleteMember: (uuid: string) => Promise<any>;
}) {
  const [prospectiveMembers, setProspectiveMembers] = useState<Member[]>([]);

  useEffect(() => {
    setProspectiveMembers(
      prospectiveMembers.filter((prospectiveMember) => {
        for (const member of members) {
          if (member.uuid === prospectiveMember.uuid) {
            return false;
          }
        }

        return true;
      })
    );
  }, [members]);

  return (
    <table className="table table-striped">
      <tbody>
        {members.map((member, index) => (
          <MemberListItem
            key={index}
            member={member}
            prospectiveMember={false}
            possiblePermissions={possiblePermissions}
            impliedPermissions={impliedPermissions}
            saveMemberPermissions={saveMemberPermissions}
            deleteMember={deleteMember}
          />
        ))}

        {prospectiveMembers.map((member, index) => (
          <MemberListItem
            key={index}
            member={member}
            prospectiveMember={true}
            possiblePermissions={possiblePermissions}
            impliedPermissions={impliedPermissions}
            saveMemberPermissions={saveMemberPermissions}
            deleteMember={deleteMember}
          />
        ))}

        {possiblePermissions ? (
          <MemberListInserter
            onInsert={(displayName, pictureUrl, userUuid) =>
              setProspectiveMembers([
                ...prospectiveMembers,
                {
                  uuid: userUuid,
                  display_name: displayName,
                  picture_url: pictureUrl,
                  permissions: ["VISIBLE"],
                },
              ])
            }
            existingMembers={members}
          />
        ) : (
          <></>
        )}
      </tbody>
    </table>
  );
}

function MemberListItem({
  member,
  prospectiveMember,
  possiblePermissions,
  impliedPermissions,
  saveMemberPermissions,
  deleteMember,
}: {
  member: Member;
  prospectiveMember: boolean;
  possiblePermissions?: string[];
  impliedPermissions?: string[][][];
  saveMemberPermissions: (
    prospectiveMember: boolean,
    uuid: string,
    selectedPermissions: string[]
  ) => Promise<any>;
  deleteMember: (uuid: string) => Promise<any>;
}) {
  const [selectedPermissions, setSelectedPermissions] = useState(
    member.permissions || []
  );
  const auth = useAuth();
  const [deleting, setDeleting] = useState(false);
  const [saving, setSaving] = useState(false);
  const [error, setError] = useState(undefined);

  let itemAction = <></>;

  const doSaveMemberPermissions = async () => {
    setSaving(true);

    try {
      await saveMemberPermissions(
        prospectiveMember,
        member.uuid,
        selectedPermissions
      );
    } catch (e) {
      setError(error);
    } finally {
      setSaving(false);
    }
  };

  const doDelete = async () => {
    setSaving(true);

    try {
      await deleteMember(member.uuid);
    } catch (e) {
      setError(error);
    } finally {
      setSaving(false);
    }
  };

  if (!possiblePermissions) {
    // the current user can't perform any actions
  } else if (saving) {
    itemAction = (
      <button type="button" className="btn">
        <div
          className="spinner-grow spinner-grow-sm text-primary"
          role="status"
        >
          <span className="visually-hidden">Loading...</span>
        </div>
      </button>
    );
  } else if (
    !prospectiveMember &&
    selectedPermissions.indexOf("VISIBLE") === -1
  ) {
    itemAction = (
      <button
        type="button"
        className="btn text-danger"
        onClick={() => setDeleting(true)}
      >
        <Trash />
      </button>
    );
  } else if (
    prospectiveMember ||
    selectedPermissions.sort().join(",") != member.permissions.sort().join(",")
  ) {
    itemAction = (
      <button
        type="button"
        className="btn text-success"
        onClick={doSaveMemberPermissions}
      >
        <CheckLg />
      </button>
    );
  }

  return (
    <>
      <DeleteModal
        show={deleting}
        onCancel={() => setDeleting(false)}
        onConfirm={() => doDelete()}
        username={member.display_name}
      />

      <ErrorModal error={error} onClose={() => setError(undefined)} />

      <tr>
        <td className="align-middle fit">
          <ProfilePicture src={member.picture_url} height="48px" width="48px" />
        </td>

        <td className="align-middle">
          <strong>
            <Link to={`/users/${member.uuid}`} className="text-decoration-none">
              {member.display_name}
            </Link>
          </strong>
          {auth?.getUserUuid() === member.uuid ? (
            <>
              <br />
              <em>(that's you!)</em>
            </>
          ) : (
            <></>
          )}
        </td>

        {possiblePermissions && member.permissions ? (
          <>
            <td className="align-middle">
              <RenderPermissions
                possiblePermissions={possiblePermissions}
                impliedPermissions={impliedPermissions}
                selectedPermissions={selectedPermissions}
                userUuid={member.uuid}
                onChange={setSelectedPermissions}
              />
            </td>

            <td className="align-middle fit">{itemAction}</td>
          </>
        ) : (
          <></>
        )}
      </tr>
    </>
  );
}

interface MemberListInserterProps {
  existingMembers: Member[];
  onInsert: (
    username: string,
    user_uuid: string,
    picture_url: string | null
  ) => any;
}

interface SearchOption {
  user_uuid: string;
  display_name: string;
  picture_url: string | null;
}

function MemberListInserter({
  onInsert,
  existingMembers,
}: MemberListInserterProps) {
  const auth = useAuth();
  const searchRef = useRef(null);
  const [loading, setLoading] = useState(false);
  const [options, setOptions] = useState([]);
  const [error, setError] = useState("");

  if (!auth) {
    return <></>;
  }

  const handleSearch = async (query: string) => {
    setLoading(true);
    setError("");

    try {
      let res = await fetch(
        authenticatedEndpoint(
          auth,
          `users/search?q=${encodeURIComponent(query)}`
        )
      );
      let json = await res.json();

      if (json.error) {
        throw new Error(json.error);
      }

      setOptions(json.users || []);
    } catch (e: any) {
      setError(e.message);
    } finally {
      setLoading(false);
    }
  };

  const handleChange = (selected: SearchOption[]) => {
    onInsert(
      selected[0].display_name,
      selected[0].picture_url,
      selected[0].user_uuid
    );
    searchRef.current?.clear();
  };

  return (
    <tr>
      <td className="align-middle fit">
        <div
          className="d-flex align-items-center justify-content-center rounded-circle bg-default-profile-picture"
          style={{
            width: "48px",
            height: "48px",
            fontSize: "1rem",
          }}
        >
          <PersonPlusFill width="24px" height="24px" />
        </div>
      </td>

      <td className="align-middle">
        <AsyncTypeahead
          id="search-new-user"
          onSearch={handleSearch}
          filterBy={(option: SearchOption) => {
            for (const existing of existingMembers) {
              if (option.user_uuid === existing.uuid) {
                return false;
              }
            }

            return true;
          }}
          labelKey="display_name"
          options={options}
          isLoading={loading}
          placeholder="Search for User"
          onChange={handleChange}
          ref={searchRef}
          renderMenuItemChildren={(option: SearchOption) => (
            <>
              <ProfilePicture
                src={option.picture_url}
                height="24px"
                width="24px"
                className="me-2"
              />
              <span>{option.display_name}</span>
            </>
          )}
        />

        <div className="text-danger">{error}</div>
      </td>

      <td className="align-middle" />

      <td className="align-middle">
        <button type="button" className="btn text-dark pe-none">
          <PlusLg />
        </button>
      </td>
    </tr>
  );
}

function RenderPermissions({
  possiblePermissions,
  selectedPermissions,
  impliedPermissions,
  userUuid,
  onChange,
}: {
  possiblePermissions: string[];
  selectedPermissions: string[];
  impliedPermissions: string[][][];
  userUuid: string;
  onChange: (permissions: string[]) => any;
}) {
  return (
    <div className="grid" style={{ "--bs-gap": 0 }}>
      {possiblePermissions.map((permission) => (
        <div
          key={permission + userUuid}
          className="form-check g-col-12 g-col-md-4"
        >
          <input
            className="form-check-input"
            type="checkbox"
            value="1"
            id={`checkbox-${userUuid}-${permission}`}
            checked={selectedPermissions.indexOf(permission) > -1}
            onChange={(e) => {
              let newUserPermissions = new Set(selectedPermissions);

              if (e.target.checked) {
                newUserPermissions.add(permission);

                for (const [a, b] of impliedPermissions) {
                  if (a[0] === permission) {
                    newUserPermissions.add(b[0]);
                  }
                }
              } else {
                newUserPermissions.delete(permission);
              }

              onChange(Array.from(newUserPermissions));
            }}
          />
          <label
            className="form-check-label"
            htmlFor={`checkbox-${userUuid}-${permission}`}
          >
            {permission}
          </label>
        </div>
      ))}
    </div>
  );
}

function DeleteModal(props: {
  show: boolean;
  onCancel: () => void;
  onConfirm: () => void;
  username: string;
}) {
  return (
    <Modal
      show={props.show}
      onHide={props.onCancel}
      size="lg"
      aria-labelledby="delete-modal-title"
      centered
    >
      <Modal.Header closeButton>
        <Modal.Title id="delete-modal-title">
          Are you sure you wish to remove this member from the crate?
        </Modal.Title>
      </Modal.Header>
      <Modal.Body>
        <p>
          Are you sure you wish to remove <strong>{props.username}</strong> from
          the crate?
        </p>
      </Modal.Body>
      <Modal.Footer>
        <Button onClick={props.onCancel} variant="primary">
          Close
        </Button>
        <Button onClick={props.onConfirm} variant="danger">
          Delete
        </Button>
      </Modal.Footer>
    </Modal>
  );
}

function ErrorModal(props: { error?: string; onClose: () => void }) {
  return (
    <Modal
      show={props.error != null}
      onHide={props.onClose}
      size="lg"
      aria-labelledby="error-modal-title"
      centered
    >
      <Modal.Header closeButton>
        <Modal.Title id="error-modal-title">Error</Modal.Title>
      </Modal.Header>
      <Modal.Body>
        <p>{props.error}</p>
      </Modal.Body>
      <Modal.Footer>
        <Button onClick={props.onClose} variant="primary">
          Close
        </Button>
      </Modal.Footer>
    </Modal>
  );
}
diff --git a/chartered-frontend/src/pages/crate/OrganisationView.tsx b/chartered-frontend/src/pages/crate/OrganisationView.tsx
deleted file mode 100644
index ed99dd1..0000000 100644
--- a/chartered-frontend/src/pages/crate/OrganisationView.tsx
+++ /dev/null
@@ -1,303 +1,0 @@
import { useState } from "react";
import { Link, Navigate, useParams } from "react-router-dom";

import Nav from "../../sections/Nav";
import { useAuth } from "../../useAuth";
import {
  useAuthenticatedRequest,
  authenticatedEndpoint,
  RoundedPicture,
} from "../../util";

import { BoxSeam } from "react-bootstrap-icons";
import ErrorPage from "../ErrorPage";
import Members from "./Members";
import ReactPlaceholder from "react-placeholder";

interface OrganisationDetails {
  possible_permissions?: string[];
  implied_permissions?: string[][][];
  crates: Crate[];
  members: Member[];
  description: string;
}

interface Crate {
  name: string;
  description?: string;
}

interface Member {
  uuid: string;
  display_name: string;
  permissions: string[];
}

interface UrlParams {
  organisation: string;
}

export default function ShowOrganisation() {
  const tabs = {
    crates: "Crates",
    members: "Members",
  };

  const { organisation } = useParams();
  const auth = useAuth();
  const [activeTab, setActiveTab] = useState(Object.keys(tabs)[0]);

  if (!auth) {
    return <Navigate to="/login" />;
  }

  const [reload, setReload] = useState(0);
  const { response: organisationDetails, error } =
    useAuthenticatedRequest<OrganisationDetails>(
      {
        auth,
        endpoint: `organisations/${organisation}`,
      },
      [reload]
    );

  if (error) {
    return <ErrorPage message={error} />;
  }

  const ready = !!organisationDetails;

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <div className="row align-items-stretch">
          <div className="col-12 mb-3">
            <div className="card border-0 shadow-sm text-black h-100">
              <div className="card-body">
                <div className="d-flex flex-row align-items-center">
                  <RoundedPicture
                    src="http://placekitten.com/96/96"
                    height="96px"
                    width="96px"
                  />

                  <div className="px-2">
                    <h1 className="text-primary my-0">{organisation}</h1>
                    <ReactPlaceholder
                      showLoadingAnimation
                      type="text"
                      rows={1}
                      ready={ready}
                      style={{ height: "1.4rem" }}
                    >
                      <p className="m-0">
                        {organisationDetails?.description || (
                          <i>No description given.</i>
                        )}
                      </p>
                    </ReactPlaceholder>
                  </div>
                </div>
              </div>
            </div>
          </div>

          <div className="col-12 mb-3">
            <div className="card border-0 shadow-sm text-black h-100">
              <div className="card-header">
                <ul className="nav nav-pills card-header-pills">
                  {Object.entries(tabs).map(([key, name]) => (
                    <li key={key} className="nav-item">
                      <a
                        href="#"
                        className={`nav-link ${
                          activeTab == key
                            ? "bg-primary bg-gradient active"
                            : ""
                        }`}
                        onClick={(e) => {
                          e.preventDefault();
                          setActiveTab(key);
                        }}
                      >
                        {name}
                      </a>
                    </li>
                  ))}
                </ul>
              </div>

              {!ready ? (
                <div className="card-body">
                  <div className="d-flex justify-content-center align-items-center">
                    <div className="spinner-border text-primary" role="status">
                      <span className="visually-hidden">Loading...</span>
                    </div>
                  </div>
                </div>
              ) : (
                <>
                  {activeTab == "crates" ? (
                    <ListCrates
                      organisation={organisation}
                      crates={organisationDetails.crates}
                    />
                  ) : (
                    <></>
                  )}
                  {activeTab == "members" ? (
                    <ListMembers
                      organisation={organisation}
                      members={organisationDetails.members}
                      possiblePermissions={
                        organisationDetails.possible_permissions
                      }
                      impliedPermissions={
                        organisationDetails.implied_permissions
                      }
                      reload={() => setReload(reload + 1)}
                    />
                  ) : (
                    <></>
                  )}
                </>
              )}
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

function ListCrates({
  organisation,
  crates,
}: {
  organisation: string;
  crates: Crate[];
}) {
  if (crates.length === 0) {
    return (
      <div className="card-body">
        This organisation doesn't have any crates yet.
      </div>
    );
  }

  return (
    <div className="table-responsive w-100">
      <table className="table table-striped">
        <tbody>
          {crates.map((v, i) => (
            <tr key={i}>
              <td className="align-middle fit">
                <div
                  className="text-white circle bg-primary bg-gradient d-inline rounded-circle d-inline-flex justify-content-center align-items-center"
                  style={{ width: "48px", height: "48px" }}
                >
                  <BoxSeam />
                </div>
              </td>

              <td className="align-middle">
                <div>
                  <Link to={`/crates/${organisation}/${v.name}`}>
                    <span className="text-muted">{organisation}/</span>
                    {v.name}
                  </Link>
                </div>
                <div className="text-muted">{v.description}</div>
              </td>
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}

interface ListMemberParams {
  organisation: string;
  members: Member[];
  possiblePermissions?: string[];
  impliedPermissions?: string[][][];
  reload: () => any;
}

function ListMembers({
  organisation,
  members,
  possiblePermissions,
  impliedPermissions,
  reload,
}: ListMemberParams) {
  const auth = useAuth();

  if (!auth) {
    return <></>;
  }

  const saveMemberPermissions = async (
    prospectiveMember: boolean,
    uuid: string,
    selectedPermissions: string[]
  ) => {
    let res = await fetch(
      authenticatedEndpoint(auth, `organisations/${organisation}/members`),
      {
        method: prospectiveMember ? "PUT" : "PATCH",
        headers: {
          Accept: "application/json",
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          user_uuid: uuid,
          permissions: selectedPermissions,
        }),
      }
    );
    let json = await res.json();

    if (json.error) {
      throw new Error(json.error);
    }

    reload();
  };

  const deleteMember = async (uuid: string) => {
    let res = await fetch(
      authenticatedEndpoint(auth, `organisations/${organisation}/members`),
      {
        method: "DELETE",
        headers: {
          Accept: "application/json",
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          user_uuid: uuid,
        }),
      }
    );
    let json = await res.json();

    if (json.error) {
      throw new Error(json.error);
    }

    reload();
  };

  return (
    <Members
      members={members}
      possiblePermissions={possiblePermissions}
      impliedPermissions={impliedPermissions}
      saveMemberPermissions={saveMemberPermissions}
      deleteMember={deleteMember}
    />
  );
}
diff --git a/chartered-frontend/src/pages/organisations/CreateOrganisation.tsx b/chartered-frontend/src/pages/organisations/CreateOrganisation.tsx
deleted file mode 100644
index 18b08ea..0000000 100644
--- a/chartered-frontend/src/pages/organisations/CreateOrganisation.tsx
+++ /dev/null
@@ -1,147 +1,0 @@
import { SyntheticEvent, useState } from "react";
import { Link, useNavigate } from "react-router-dom";

import Nav from "../../sections/Nav";
import { useAuth } from "../../useAuth";
import { authenticatedEndpoint } from "../../util";

export default function CreateOrganisation() {
  const auth = useAuth();
  const navigate = useNavigate();

  if (!auth) {
    return <></>;
  }

  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  const [name, setName] = useState("");
  const [description, setDescription] = useState("");
  const [publicOrg, setPublicOrg] = useState(false);

  const createOrganisation = async (evt: SyntheticEvent) => {
    evt.preventDefault();

    setError("");
    setLoading(true);

    try {
      let res = await fetch(authenticatedEndpoint(auth, "organisations"), {
        method: "PUT",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({ name, description, public: publicOrg }),
      });
      let json = await res.json();

      if (json.error) {
        throw new Error(json.error);
      }

      setName("");
      setDescription("");
      navigate(`/crates/${name}`);
    } catch (e: any) {
      setError(e.message);
      setLoading(false);
    }
  };

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <h1>Create New Organisation</h1>

        <div
          className="alert alert-danger alert-dismissible"
          role="alert"
          style={{ display: error ? "block" : "none" }}
        >
          {error}

          <button
            type="button"
            className="btn-close"
            aria-label="Close"
            onClick={() => setError("")}
          />
        </div>

        <div className="card border-0 shadow-sm text-black">
          <div className="card-body">
            <form onSubmit={createOrganisation}>
              <div className="mb-3">
                <label htmlFor="org-name" className="form-label">
                  Name
                </label>
                <input
                  id="org-name"
                  type="text"
                  className="form-control"
                  pattern="[a-zA-Z0-9-]*"
                  placeholder="backend-team"
                  onChange={(e) => setName(e.target.value)}
                  disabled={loading}
                  value={name}
                />
                <div className="form-text">
                  Must be in the format <code>[a-zA-Z0-9-]*</code>
                </div>
              </div>

              <div>
                <label htmlFor="org-description" className="form-label">
                  Description
                </label>
                <textarea
                  id="org-description"
                  className="form-control"
                  rows={3}
                  onChange={(e) => setDescription(e.target.value)}
                  disabled={loading}
                  value={description}
                />
              </div>

              <div className="mt-2 form-check">
                <input
                  type="checkbox"
                  checked={publicOrg}
                  id="org-public"
                  className="form-check-input"
                  onChange={(e) => setPublicOrg(e.target.checked)}
                  disabled={loading}
                />
                <label htmlFor="org-public" className="form-check-label">
                  Give <strong>VISIBLE</strong> permission to all logged in
                  users
                </label>
              </div>

              <div className="clearfix" />

              <button
                type="submit"
                className="btn btn-success mt-2"
                style={{ display: !loading ? "block" : "none" }}
              >
                Create
              </button>
              <div
                className="spinner-border text-primary mt-4"
                role="status"
                style={{ display: loading ? "block" : "none" }}
              >
                <span className="visually-hidden">Submitting...</span>
              </div>
            </form>
          </div>
        </div>
      </div>
    </div>
  );
}
diff --git a/chartered-frontend/src/pages/organisations/ListOrganisations.tsx b/chartered-frontend/src/pages/organisations/ListOrganisations.tsx
deleted file mode 100644
index 8f93aad..0000000 100644
--- a/chartered-frontend/src/pages/organisations/ListOrganisations.tsx
+++ /dev/null
@@ -1,95 +1,0 @@
import { Plus } from "react-bootstrap-icons";
import { Link, Navigate } from "react-router-dom";

import Nav from "../../sections/Nav";
import { useAuth } from "../../useAuth";
import { RoundedPicture, useAuthenticatedRequest } from "../../util";
import ErrorPage from "../ErrorPage";
import { LoadingSpinner } from "../Loading";

interface Response {
  organisations: ResponseOrganisations[];
}

interface ResponseOrganisations {
  name: string;
  description: string;
}

export default function ListOrganisations() {
  const auth = useAuth();

  if (!auth) {
    return <Navigate to="/login" />;
  }

  const { response: list, error } = useAuthenticatedRequest<Response>({
    auth,
    endpoint: "organisations",
  });

  if (error) {
    return <ErrorPage message={error} />;
  }

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <h1>Your Organisations</h1>

        <div className="card border-0 shadow-sm text-black">
          {!list ? (
            <LoadingSpinner />
          ) : (
            <>
              {list.organisations.length === 0 ? (
                <div className="card-body">
                  You don't belong to any organisations yet.
                </div>
              ) : (
                <table className="table table-striped">
                  <tbody>
                    {list.organisations.map((v, i) => (
                      <tr key={i}>
                        <td className="align-middle fit">
                          <RoundedPicture
                            src="http://placekitten.com/48/48"
                            height="48px"
                            width="48px"
                          />
                        </td>

                        <td
                          className="align-middle"
                          style={{ lineHeight: "1.1" }}
                        >
                          <div>
                            <Link to={`/crates/${v.name}`}>{v.name}</Link>
                          </div>
                          <div>
                            <small style={{ fontSize: "0.75rem" }}>
                              {v.description}
                            </small>
                          </div>
                        </td>
                      </tr>
                    ))}
                  </tbody>
                </table>
              )}
            </>
          )}
        </div>

        <Link
          to="/organisations/create"
          className="btn btn-outline-light mt-2 float-end"
        >
          <Plus /> Create
        </Link>
      </div>
    </div>
  );
}
diff --git a/chartered-frontend/src/pages/sessions/ListSessions.tsx b/chartered-frontend/src/pages/sessions/ListSessions.tsx
deleted file mode 100644
index c8b4908..0000000 100644
--- a/chartered-frontend/src/pages/sessions/ListSessions.tsx
+++ /dev/null
@@ -1,206 +1,0 @@
import Nav from "../../sections/Nav";
import { useAuth } from "../../useAuth";
import { Link, Navigate } from "react-router-dom";
import {
  authenticatedEndpoint,
  RoundedPicture,
  useAuthenticatedRequest,
} from "../../util";
import ErrorPage from "../ErrorPage";
import { LoadingSpinner } from "../Loading";
import { Button, Modal, OverlayTrigger, Tooltip } from "react-bootstrap";
import HumanTime from "react-human-time";
import { XOctagonFill } from "react-bootstrap-icons";
import { useState } from "react";

interface Response {
  sessions: ResponseSession[];
}

interface ResponseSession {
  uuid: string;
  expires_at: string | null;
  user_agent: string | null;
  ip: string | null;
  ssh_key_fingerprint: string | null;
}

export default function ListSessions() {
  const auth = useAuth();
  const [deleting, setDeleting] = useState<null | string>(null);
  const [error, setError] = useState("");
  const [reloadSessions, setReloadSessions] = useState(0);

  if (!auth) {
    return <Navigate to="/login" />;
  }

  const { response: list, error: loadError } =
    useAuthenticatedRequest<Response>(
      {
        auth,
        endpoint: "sessions",
      },
      [reloadSessions]
    );

  if (loadError) {
    return <ErrorPage message={loadError} />;
  }

  const deleteSession = async () => {
    setError("");

    if (!deleting) {
      return;
    }

    try {
      let res = await fetch(authenticatedEndpoint(auth, "sessions"), {
        method: "DELETE",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({ uuid: deleting }),
      });
      let json = await res.json();

      if (json.error) {
        throw new Error(json.error);
      }

      setReloadSessions(reloadSessions + 1);
    } catch (e: any) {
      setError(e.message);
    } finally {
      setDeleting(null);
    }
  };

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <h1>Active Sessions</h1>

        <div
          className="alert alert-danger alert-dismissible"
          role="alert"
          style={{ display: error ? "block" : "none" }}
        >
          {error}

          <button
            type="button"
            className="btn-close"
            aria-label="Close"
            onClick={() => setError("")}
          />
        </div>

        <div className="card border-0 shadow-sm text-black p-2">
          {!list ? (
            <LoadingSpinner />
          ) : (
            <>
              {list.sessions.length === 0 ? (
                <div className="card-body">
                  You don't belong to any organisations yet.
                </div>
              ) : (
                <table className="table table-borderless mb-0">
                  <thead>
                    <tr>
                      <th scope="col">IP Address</th>
                      <th scope="col">User Agent</th>
                      <th scope="col">SSH Key Fingerprint</th>
                      <th scope="col">Expires</th>
                      <th scope="col"></th>
                    </tr>
                  </thead>

                  <tbody>
                    {list.sessions.map((v, i) => (
                      <tr key={i}>
                        <td>
                          <strong>{v.ip?.split(":")[0]}</strong>
                        </td>
                        <td>{v.user_agent}</td>
                        <td>{v.ssh_key_fingerprint || "n/a"}</td>
                        <td>
                          {v.expires_at ? (
                            <OverlayTrigger
                              overlay={
                                <Tooltip id={`sessions-${i}-created-at`}>
                                  {new Date(v.expires_at).toLocaleString()}
                                </Tooltip>
                              }
                            >
                              <span className="text-decoration-underline-dotted">
                                <HumanTime
                                  time={new Date(v.expires_at).getTime()}
                                />
                              </span>
                            </OverlayTrigger>
                          ) : (
                            "n/a"
                          )}
                        </td>
                        <td className="fit">
                          <button
                            type="button"
                            className="btn text-danger p-0"
                            onClick={() => setDeleting(v.uuid)}
                          >
                            <XOctagonFill />
                          </button>
                        </td>
                      </tr>
                    ))}
                  </tbody>
                </table>
              )}
            </>
          )}
        </div>
      </div>

      <DeleteModal
        show={deleting !== null}
        onCancel={() => setDeleting(null)}
        onConfirm={() => deleteSession()}
      />
    </div>
  );
}

function DeleteModal(props: {
  show: boolean;
  onCancel: () => void;
  onConfirm: () => void;
}) {
  return (
    <Modal
      show={props.show}
      onHide={props.onCancel}
      size="lg"
      aria-labelledby="delete-modal-title"
      centered
    >
      <Modal.Header closeButton>
        <Modal.Title id="delete-modal-title">
          Are you sure you wish to delete this session?
        </Modal.Title>
      </Modal.Header>
      <Modal.Footer>
        <Button onClick={props.onCancel} variant="primary">
          Close
        </Button>
        <Button onClick={props.onConfirm} variant="danger">
          Delete
        </Button>
      </Modal.Footer>
    </Modal>
  );
}
diff --git a/chartered-frontend/src/pages/ssh-keys/AddSshKeys.tsx b/chartered-frontend/src/pages/ssh-keys/AddSshKeys.tsx
deleted file mode 100644
index 6dddc99..0000000 100644
--- a/chartered-frontend/src/pages/ssh-keys/AddSshKeys.tsx
+++ /dev/null
@@ -1,110 +1,0 @@
import { SyntheticEvent, useState } from "react";
import { Link, useNavigate } from "react-router-dom";

import Nav from "../../sections/Nav";
import { useAuth } from "../../useAuth";
import { authenticatedEndpoint } from "../../util";

export default function ListSshKeys() {
  const auth = useAuth();
  const navigate = useNavigate();

  if (!auth) {
    return <></>;
  }

  const [sshKey, setSshKey] = useState("");
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  const submitSshKey = async (evt: SyntheticEvent) => {
    evt.preventDefault();

    setError("");
    setLoading(true);

    try {
      let res = await fetch(authenticatedEndpoint(auth, "ssh-key"), {
        method: "PUT",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({ key: sshKey }),
      });
      let json = await res.json();

      if (json.error) {
        throw new Error(json.error);
      }

      setSshKey("");
      navigate("/ssh-keys/list");
    } catch (e: any) {
      setError(e.message);
      setLoading(false);
    }
  };

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <h1>New SSH Key</h1>

        <div
          className="alert alert-danger alert-dismissible"
          role="alert"
          style={{ display: error ? "block" : "none" }}
        >
          {error}

          <button
            type="button"
            className="btn-close"
            aria-label="Close"
            onClick={() => setError("")}
          />
        </div>

        <div className="card border-0 shadow-sm text-black">
          <div className="card-body">
            <form onSubmit={submitSshKey}>
              <textarea
                className="form-control"
                rows={3}
                placeholder="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILYAIoV2OKRSh/DcM3TicD/NK/4TdqwwBPbKgFQKmGZ3 john@home"
                onChange={(e) => setSshKey(e.target.value)}
                value={sshKey}
              />

              <div className="clearfix" />

              <button
                type="submit"
                className="btn btn-success mt-2 float-end"
                style={{ display: !loading ? "block" : "none" }}
              >
                Submit
              </button>
              <div
                className="spinner-border text-primary mt-4 float-end"
                role="status"
                style={{ display: loading ? "block" : "none" }}
              >
                <span className="visually-hidden">Submitting...</span>
              </div>

              <Link
                to="/ssh-keys/list"
                className="btn btn-danger mt-2 float-end me-1"
              >
                Cancel
              </Link>
            </form>
          </div>
        </div>
      </div>
    </div>
  );
}
diff --git a/chartered-frontend/src/pages/ssh-keys/ListSshKeys.tsx b/chartered-frontend/src/pages/ssh-keys/ListSshKeys.tsx
deleted file mode 100644
index fe47c35..0000000 100644
--- a/chartered-frontend/src/pages/ssh-keys/ListSshKeys.tsx
+++ /dev/null
@@ -1,253 +1,0 @@
import { useState } from "react";
import { Link, Navigate } from "react-router-dom";

import Nav from "../../sections/Nav";
import { useAuth } from "../../useAuth";
import { useAuthenticatedRequest, authenticatedEndpoint } from "../../util";

import { Plus, Trash } from "react-bootstrap-icons";
import { Button, Modal, OverlayTrigger, Tooltip } from "react-bootstrap";
import HumanTime from "react-human-time";
import ErrorPage from "../ErrorPage";
import { LoadingSpinner } from "../Loading";

interface SshKeysResponse {
  keys: SshKeysResponseKey[];
}

interface SshKeysResponseKey {
  uuid: string;
  name: string;
  fingerprint: string;
  created_at: string;
  last_used_at: string;
}

export default function ListSshKeys() {
  const auth = useAuth();

  if (!auth) {
    return <Navigate to="/login" />;
  }

  const [error, setError] = useState("");
  const [deleting, setDeleting] = useState<SshKeysResponseKey | null>(null);
  const [reloadSshKeys, setReloadSshKeys] = useState(0);

  const { response: sshKeys, error: loadError } =
    useAuthenticatedRequest<SshKeysResponse>(
      {
        auth,
        endpoint: "ssh-key",
      },
      [reloadSshKeys]
    );

  if (loadError) {
    return <ErrorPage message={loadError} />;
  }

  const deleteKey = async () => {
    setError("");

    if (!deleting) {
      return;
    }

    try {
      let res = await fetch(
        authenticatedEndpoint(auth, `ssh-key/${deleting.uuid}`),
        {
          method: "DELETE",
          headers: {
            "Content-Type": "application/json",
          },
        }
      );
      let json = await res.json();

      if (json.error) {
        throw new Error(json.error);
      }

      setReloadSshKeys(reloadSshKeys + 1);
    } catch (e: any) {
      setError(e.message);
    } finally {
      setDeleting(null);
    }
  };

  const dateMonthAgo = new Date();
  dateMonthAgo.setMonth(dateMonthAgo.getMonth() - 1);

  return (
    <div>
      <Nav />

      <div className="container mt-4 pb-4">
        <h1>Manage your SSH Keys</h1>

        <div
          className="alert alert-danger alert-dismissible"
          role="alert"
          style={{ display: error ? "block" : "none" }}
        >
          {error}

          <button
            type="button"
            className="btn-close"
            aria-label="Close"
            onClick={() => setError("")}
          />
        </div>

        <div className="card border-0 shadow-sm text-black">
          {!sshKeys ? (
            <LoadingSpinner />
          ) : (
            <>
              {sshKeys.keys.length == 0 ? (
                <div className="card-body">
                  You haven't added any SSH keys yet.
                </div>
              ) : (
                <div className="table-responsive">
                  <table className="table table-striped">
                    <tbody>
                      {sshKeys.keys.map((key) => (
                        <tr key={key.uuid}>
                          <td className="align-middle">
                            <h6 className="m-0 lh-sm">{key.name}</h6>
                            <pre className="m-0">{key.fingerprint}</pre>
                            <div
                              className="lh-sm"
                              style={{ fontSize: ".75rem" }}
                            >
                              <div className="text-muted d-inline-block me-3">
                                Added{" "}
                                <OverlayTrigger
                                  overlay={
                                    <Tooltip id={`${key.uuid}-created-at`}>
                                      {new Date(
                                        key.created_at
                                      ).toLocaleString()}
                                    </Tooltip>
                                  }
                                >
                                  <span className="text-decoration-underline-dotted">
                                    <HumanTime
                                      time={new Date(key.created_at).getTime()}
                                    />
                                  </span>
                                </OverlayTrigger>
                              </div>
                              <span
                                className={`text-${
                                  key.last_used_at
                                    ? new Date(key.last_used_at) > dateMonthAgo
                                      ? "success"
                                      : "danger"
                                    : "muted"
                                }`}
                              >
                                Last used{" "}
                                {key.last_used_at ? (
                                  <OverlayTrigger
                                    overlay={
                                      <Tooltip id={`${key.uuid}-last-used`}>
                                        {new Date(
                                          key.last_used_at
                                        ).toLocaleString()}
                                      </Tooltip>
                                    }
                                  >
                                    <span className="text-decoration-underline-dotted">
                                      <HumanTime
                                        time={new Date(
                                          key.last_used_at
                                        ).getTime()}
                                      />
                                    </span>
                                  </OverlayTrigger>
                                ) : (
                                  <>never</>
                                )}
                              </span>
                            </div>
                          </td>

                          <td className="align-middle fit">
                            <button
                              type="button"
                              className="btn text-danger"
                              onClick={() => setDeleting(key)}
                            >
                              <Trash />
                            </button>
                          </td>
                        </tr>
                      ))}
                    </tbody>
                  </table>
                </div>
              )}
            </>
          )}
        </div>

        <Link
          to="/ssh-keys/add"
          className="btn btn-outline-light mt-2 float-end"
        >
          <Plus /> Add New
        </Link>
      </div>

      <DeleteModal
        show={deleting != null}
        onCancel={() => setDeleting(null)}
        onConfirm={() => deleteKey()}
        fingerprint={deleting?.fingerprint}
      />
    </div>
  );
}

function DeleteModal(props: {
  show: boolean;
  onCancel: () => void;
  onConfirm: () => void;
  fingerprint?: string;
}) {
  return (
    <Modal
      show={props.show}
      onHide={props.onCancel}
      size="lg"
      aria-labelledby="delete-modal-title"
      centered
    >
      <Modal.Header closeButton>
        <Modal.Title id="delete-modal-title">
          Are you sure you wish to delete this SSH key?
        </Modal.Title>
      </Modal.Header>
      <Modal.Body>
        <p>
          Are you sure you wish to delete the SSH key with the fingerprint:{" "}
          <strong>{props.fingerprint}</strong>?
        </p>
      </Modal.Body>
      <Modal.Footer>
        <Button onClick={props.onCancel} variant="primary">
          Close
        </Button>
        <Button onClick={props.onConfirm} variant="danger">
          Delete
        </Button>
      </Modal.Footer>
    </Modal>
  );
}
diff --git a/chartered-frontend/src/routes/(authed)/+layout.svelte b/chartered-frontend/src/routes/(authed)/+layout.svelte
new file mode 100644
index 0000000..925ae75 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/+layout.svelte
@@ -1,0 +1,20 @@
<script type="typescript">
    import { auth, logout } from '../../stores/auth';
    import { goto } from '$app/navigation';
    import Nav from '../../components/Nav.svelte';
    import NavItem from '../../components/NavItem.svelte';

    $: if (!$auth) {
        goto('/auth/login', { replaceState: true });
    }
</script>

{#if $auth}
    <Nav>
        <NavItem href="/">Home</NavItem>
        <NavItem href="/ssh-keys">SSH Keys</NavItem>
        <NavItem href="/organisations" aliases={['/crates']}>Organisations</NavItem>
    </Nav>

    <slot />
{/if}
diff --git a/chartered-frontend/src/routes/(authed)/+page.svelte b/chartered-frontend/src/routes/(authed)/+page.svelte
new file mode 100644
index 0000000..0e49408 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/+page.svelte
@@ -1,0 +1,94 @@
<script type="typescript">
    import Icon from '../../components/Icon.svelte';
    import rustLogo from '../../img/rust.svg';
    import { BASE_URL, auth, request } from '../../stores/auth';
    import RelativeTime from '../../components/RelativeTime.svelte';
    import Spinner from '../../components/Spinner.svelte';
    import type { MostDownloaded, RecentlyCreated, RecentlyUpdated } from '../../types/featured_crate';
    import FeaturedCrate from '../../components/FeaturedCrate.svelte';
    import ErrorAlert from '../../components/ErrorAlert.svelte';

    const mostDownloadedPromise = request<MostDownloaded>('/web/v1/crates/most-downloaded');
    const recentlyCreatedPromise = request<RecentlyCreated>('/web/v1/crates/recently-created');
    const recentlyUpdatedPromise = request<RecentlyUpdated>('/web/v1/crates/recently-updated');
</script>

<header>
    <div class="container flex items-center mx-auto flex-col md:flex-row">
        <div class="p-10 pt-0 md:pt-10">
            <h1 class="text-5xl font-bold tracking-tight">
                Welcome to <span class="text-highlight">Chartered</span>.
            </h1>
            <h2>
                A private, authenticated Cargo registry. Everything published to this registry is private and visible
                only to you, until explicit permissions are granted to others.
            </h2>

            <a href="https://book.chart.rs/" target="_blank" class="block btn-blue-outline"> Learn More </a>
        </div>

        <div class="pr-6 order-first md:order-last pt-10 md:pt-0">
            <img class="w-[8rem]" src={rustLogo} />️️
        </div>
    </div>
</header>

<main class="container mx-auto p-10 pt-0">
    <div class="block md:grid grid-cols-3 gap-9">
        <div>
            <h3 class="text-3xl mb-2">Newly created</h3>

            {#await recentlyCreatedPromise}
                <div class="relative h-12">
                    <Spinner />
                </div>
            {:then recentlyCreated}
                {#each recentlyCreated.crates as crate}
                    <FeaturedCrate {crate}>
                        <Icon name="calendar" />
                        <RelativeTime time={crate.created_at} />
                    </FeaturedCrate>
                {/each}
            {:catch e}
                <ErrorAlert showClose={false}>{e}</ErrorAlert>
            {/await}
        </div>

        <div>
            <h3 class="text-3xl mb-2">Recently updated</h3>

            {#await recentlyUpdatedPromise}
                <div class="relative h-12">
                    <Spinner />
                </div>
            {:then recentlyUpdated}
                {#each recentlyUpdated.versions as crate}
                    <FeaturedCrate {crate}>
                        v{crate.version}
                    </FeaturedCrate>
                {/each}
            {:catch e}
                <ErrorAlert showClose={false}>{e}</ErrorAlert>
            {/await}
        </div>

        <div>
            <h3 class="text-3xl mb-2">Most downloaded</h3>

            {#await mostDownloadedPromise}
                <div class="relative h-12">
                    <Spinner />
                </div>
            {:then mostDownloaded}
                {#each mostDownloaded.crates as crate}
                    <FeaturedCrate {crate}>
                        <Icon name="download" />
                        <span>{crate.downloads}</span>
                    </FeaturedCrate>
                {/each}
            {:catch e}
                <ErrorAlert showClose={false}>{e}</ErrorAlert>
            {/await}
        </div>
    </div>
</main>
diff --git a/chartered-frontend/src/routes/(unauthed)/+layout.svelte b/chartered-frontend/src/routes/(unauthed)/+layout.svelte
new file mode 100644
index 0000000..4032062 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(unauthed)/+layout.svelte
@@ -1,0 +1,29 @@
<script type="typescript">
    import { auth } from '../../stores/auth.ts';
    import { goto } from '$app/navigation';

    $: if ($auth) {
        goto('/', { replaceState: true });
    }
</script>

{#if !$auth}
    <div class="h-screen flex flex-col justify-center items-center">
        <div class="w-full md:w-[40rem] p-2 md:p-0">
            <header class="bg-none">
                <h1 class="text-2xl font-bold">chartered ✈️</h1>
                <h6 class="text-sm">a private, authenticated cargo registry</h6>
            </header>

            <main>
                <slot />
            </main>
        </div>
    </div>
{/if}

<style>
    main {
        @apply w-full mt-2 p-4 bg-white dark:bg-transparent border dark:border-slate-700 rounded relative;
    }
</style>
diff --git a/chartered-frontend/src/routes/(authed)/organisations/+page.svelte b/chartered-frontend/src/routes/(authed)/organisations/+page.svelte
new file mode 100644
index 0000000..70f3774 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/organisations/+page.svelte
@@ -1,0 +1,5 @@
<script type="typescript">
    import { goto } from '$app/navigation';

    goto('/organisations/list');
</script>
diff --git a/chartered-frontend/src/routes/(authed)/search/+page.svelte b/chartered-frontend/src/routes/(authed)/search/+page.svelte
new file mode 100644
index 0000000..62488f5 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/search/+page.svelte
@@ -1,0 +1,52 @@
<script type="typescript">
    import { page } from '$app/stores';
    import { request } from '../../../stores/auth';
    import Spinner from '../../../components/Spinner.svelte';

    let searchPromise;
    $: searchPromise = request(`/web/v1/crates/search?q=${$page.url.searchParams.get('q')}`);
</script>

<header>
    <div class="container flex items-center mx-auto">
        <div class="p-10 mb-3">
            <h1 class="text-5xl font-bold tracking-tight">
                Search results for "<span class="text-highlight">{$page.url.searchParams.get('q')}</span>".
            </h1>
        </div>
    </div>
</header>

{#await searchPromise}
    <div class="relative h-12">
        <Spinner />
    </div>
{:then results}
    <main class="container mx-auto p-10 grid gap-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4">
        {#each results.crates as crate}
            <div class="card">
                <div class="card-header">
                    <a href={`/crates/${crate.organisation}/${crate.name}`}>
                        {crate.organisation}/<span class="text-highlight">{crate.name}</span>
                    </a>

                    <small class="text-sm text-gray-400 font-normal">{crate.version}</small>
                </div>

                <div class="card-body">
                    {crate.description}
                </div>

                <div class="text-sm mt-2 text-blue-600">
                    {#if crate.homepage}
                        <a href={crate.homepage} target="_blank" class="mr-2">Homepage</a>
                    {/if}

                    {#if crate.repository}
                        <a href={crate.repository} target="_blank">Repository</a>
                    {/if}
                </div>
            </div>
        {/each}
    </main>
{/await}
diff --git a/chartered-frontend/src/routes/(authed)/ssh-keys/+page.svelte b/chartered-frontend/src/routes/(authed)/ssh-keys/+page.svelte
new file mode 100644
index 0000000..807c7f6 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/ssh-keys/+page.svelte
@@ -1,0 +1,72 @@
<script type="typescript">
    import { auth, BASE_URL, request } from '../../../stores/auth';
    import Spinner from '../../../components/Spinner.svelte';
    import ErrorAlert from '../../../components/ErrorAlert.svelte';
    import SingleSshKey from './SingleSshKey.svelte';
    import type { SshKeys, SshKey } from '../../../types/ssh_keys';
    import CreateKeyForm from './CreateKeyForm.svelte';
    import DeleteSshKeyModal from './DeleteSshKeyModal.svelte';

    // contains the key that is currently being considered by the user for deletion,
    // if this is set then the user is currently seeing a popup for confirmation
    let deleting: SshKey | null = null;

    // loads all the user's SSH keys from the backend
    let sshKeysPromise = fetchSshKeys();

    /**
     * Fetches the current user's SSH keys from the backend
     */
    function fetchSshKeys(): Promise<SshKeys> {
        return request<SshKeys>('/web/v1/ssh-key');
    }

    /**
     * Reloads the user's SSH keys from the backend, this will cause a spinner while they
     * are reloaded
     */
    function reloadSshKeys() {
        sshKeysPromise = fetchSshKeys();
    }
</script>

<header>
    <div class="container flex items-center mx-auto">
        <div class="p-10 mb-3">
            <h1 class="text-5xl font-bold tracking-tight">
                Manage your <span class="text-highlight">SSH Keys</span>.
            </h1>
            <h2>SSH keys are how Chartered identifies your account when called via Cargo.</h2>

            <a href="https://book.chart.rs/" target="_blank" class="block btn-blue-outline"> Learn More </a>
        </div>
    </div>
</header>

<main class="container mx-auto p-10 pt-0">
    {#await sshKeysPromise}
        <div class="relative h-4">
            <Spinner />
        </div>
    {:then sshKeys}
        <div class:hidden={sshKeys.keys.length === 0} class="card mb-4 p-2">
            <div class="overflow-scroll">
                <div class="w-fit min-w-full">
                    {#each sshKeys.keys as sshKey, i}
                        {#if i > 0}<hr class="card-hr" />{/if}

                        <SingleSshKey {sshKey} on:delete={() => (deleting = sshKey)} />
                    {/each}
                </div>
            </div>
        </div>

        <CreateKeyForm on:complete={reloadSshKeys} />
    {:catch e}
        <ErrorAlert showClose={false}>{e}</ErrorAlert>
    {/await}
</main>

{#if deleting}
    <DeleteSshKeyModal {deleting} on:complete={reloadSshKeys} on:close={() => (deleting = null)} />
{/if}
diff --git a/chartered-frontend/src/routes/(authed)/ssh-keys/CreateKeyForm.svelte b/chartered-frontend/src/routes/(authed)/ssh-keys/CreateKeyForm.svelte
new file mode 100644
index 0000000..f966390 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/ssh-keys/CreateKeyForm.svelte
@@ -1,0 +1,104 @@
<script type="typescript">
    import Icon from '../../../components/Icon.svelte';
    import { auth, BASE_URL } from '../../../stores/auth';
    import type { AddSshKeyResult } from '../../../types/ssh_keys';
    import { createEventDispatcher } from 'svelte';
    import Spinner from '../../../components/Spinner.svelte';
    import ErrorAlert from '../../../components/ErrorAlert.svelte';

    // set up the event dispatcher for alerting the main page when the user has successfully
    // added a key, so it can reload the full key list from the backend again
    const dispatch = createEventDispatcher();

    /**
     * Binding to the ssh key text field, contains anything currently in there
     */
    let sshKey: string = '';

    /**
     * Simple boolean flag to determine if a key is currently being submitted, so we can
     * disable the form
     */
    let submitting = false;

    /**
     * Any errors that came of the last submission. If this is not null the user will be shown
     * an alert.
     */
    let error = null;

    /**
     * Submits an SSH key to the server to attempt to add it to the user, all our validation
     * will be done on the backend so this is just a simple fetch
     */
    async function submit() {
        // reset the error since it no longer applies after this submission
        error = null;

        // show a spinner to the user while we're working
        submitting = true;

        try {
            // submit the key to the backend
            let result = await fetch(`${BASE_URL}/a/${$auth.auth_key}/web/v1/ssh-key`, {
                method: 'PUT',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({ key: sshKey }),
            });
            let json: AddSshKeyResult = await result.json();

            if (json.error) {
                throw new Error(json.error);
            }

            // key was successfully added! reset the form and alert the main view, so
            // it can reload the key list
            sshKey = '';
            dispatch('complete');
        } catch (e) {
            error = e.toString();
        } finally {
            // stop showing the spinner since we've finished working
            submitting = false;
        }
    }
</script>

{#if error}
    <ErrorAlert on:close={() => (error = null)}>{error}</ErrorAlert>
{/if}

<form on:submit|preventDefault={submit}>
    <div class="card p-0">
        <div class="py-2 px-4 bg-white rounded-t-lg dark:bg-slate-800">
            <label for="key" class="sr-only">Your SSH key</label>
            <textarea
                id="key"
                bind:value={sshKey}
                disabled={submitting}
                rows="3"
                class="outline-none px-0 w-full text-sm text-gray-900 bg-white border-0 dark:bg-slate-800 focus:ring-0 dark:text-white dark:placeholder-gray-400"
                placeholder="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILYAIoV2OKRSh/DcM3TicD/NK/4TdqwwBPbKgFQKmGZ3 john@home"
                required
            />
        </div>

        <div class="flex justify-between items-center py-2 px-3 border-t border-gray-200 dark:border-gray-700">
            {#if submitting}
                <div class="relative h-4 w-4">
                    <Spinner />
                </div>
            {:else}
                <button
                    type="submit"
                    class="inline-flex items-center py-2.5 px-4 text-xs font-medium text-center text-white bg-blue-700 rounded-lg focus:ring-4 focus:ring-blue-200 dark:focus:ring-blue-900 hover:bg-blue-800"
                >
                    <Icon name="plus" />
                    <span class="ml-1">Add Key</span>
                </button>
            {/if}
        </div>
    </div>
</form>
diff --git a/chartered-frontend/src/routes/(authed)/ssh-keys/DeleteSshKeyModal.svelte b/chartered-frontend/src/routes/(authed)/ssh-keys/DeleteSshKeyModal.svelte
new file mode 100644
index 0000000..e02585b 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/ssh-keys/DeleteSshKeyModal.svelte
@@ -1,0 +1,151 @@
<script type="typescript">
    import type { DeleteSshKeyResult, SshKey } from '../../../types/ssh_keys';
    import { createEventDispatcher } from 'svelte';
    import Icon from '../../../components/Icon.svelte';
    import ErrorAlert from '../../../components/ErrorAlert.svelte';
    import RelativeTime from '../../../components/RelativeTime.svelte';
    import Spinner from '../../../components/Spinner.svelte';
    import { auth, BASE_URL } from '../../../stores/auth';

    const dispatch = createEventDispatcher();

    /**
     * The key that the user requested to delete.
     */
    export let deleting: SshKey;

    /**
     * Any errors that came of the last submission. If this is not null the user will be shown
     * an alert.
     */
    let deleteError = null;

    /**
     * Simple boolean flag to determine if a key is currently being submitted, so we can
     * disable the buttons and prevent exiting the modal.
     */
    let isDeleting = false;

    /**
     * Binds helper keys for the modal, so we can provide some expected functions of a modal.
     */
    function handleKeydown(event) {
        if (event.key == 'Escape') {
            closeModal();
        }
    }

    /**
     * Attempts the deletion of the key against the backend.
     */
    async function deleteSshKey() {
        // reset the error since it no longer applies after this run
        deleteError = null;

        // show a spinner to the user while we're working and prevent them leaving the
        // modal
        isDeleting = true;

        try {
            // submit deletion request to backend
            let res = await fetch(`${BASE_URL}/a/${$auth.auth_key}/web/v1/ssh-key/${deleting.uuid}`, {
                method: 'DELETE',
            });
            let json: DeleteSshKeyResult = await res.json();

            if (json.error) {
                throw new Error(json.error);
            }

            // key successfully deleted, alert the main view, so it can reload the key list,
            // and close the modal
            isDeleting = false;
            dispatch('complete');
            closeModal();
        } catch (e) {
            isDeleting = false;
            deleteError = e.toString();
        }
    }

    /**
     * Send an event to the main view to request to close us, by unsetting `deleting` on their end
     */
    function closeModal() {
        // if a deletion is currently in progress, we don't want to let the user close the modal
        // and just have to wonder whether the key was actually deleted
        if (!isDeleting) {
            dispatch('close');
        }
    }
</script>

<svelte:window on:keydown={handleKeydown} />

<div
    on:click|self={closeModal}
    class="overflow-y-auto overflow-x-hidden backdrop-blur-[4px] bg-black/20 h-screen w-screen fixed top-0 right-0 left-0 z-50 flex items-center justify-center"
>
    <div class="p-4 bg-white rounded-lg shadow-2xl dark:bg-gray-700">
        <button
            on:click={closeModal}
            type="button"
            class="absolute top-3 right-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center dark:hover:bg-gray-800 dark:hover:text-white"
        >
            <Icon name="x" />
            <span class="sr-only">Close modal</span>
        </button>

        {#if deleteError}
            <ErrorAlert on:close={() => (deleteError = null)}>{deleteError}</ErrorAlert>
        {/if}

        <div class="p-6 text-center">
            <div class="mx-auto text-[4rem] text-red-600">
                <div class="inline-block">
                    <Icon name="alert-triangle" />
                </div>
            </div>

            <h3 class="text-lg font-normal text-inherit dark:text-gray-400">
                Are you sure you want to delete this SSH Key?
            </h3>

            <div class="break-all mb-5 mt-2 text-xs">
                <code>{deleting.fingerprint} {deleting.name}</code>
                <div>
                    <span>Added <RelativeTime time={deleting.created_at} /></span>
                    <span class="ml-2">
                        Last used
                        {#if deleting.last_used_at}
                            <RelativeTime time={deleting.last_used_at} />
                        {:else}
                            never
                        {/if}
                    </span>
                </div>
            </div>

            {#if isDeleting}
                <div class="relative h-4">
                    <Spinner />
                </div>
            {:else}
                <button
                    on:click={deleteSshKey}
                    class="text-white bg-red-600 hover:bg-red-800 focus:ring-4 focus:outline-none focus:ring-red-300 dark:focus:ring-red-800 font-medium rounded-lg text-sm inline-flex items-center px-5 py-2.5 text-center mr-2"
                >
                    Yes, I'm sure
                </button>

                <button
                    on:click={closeModal}
                    autofocus
                    class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10 dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600"
                >
                    No, cancel
                </button>
            {/if}
        </div>
    </div>
</div>
diff --git a/chartered-frontend/src/routes/(authed)/ssh-keys/SingleSshKey.svelte b/chartered-frontend/src/routes/(authed)/ssh-keys/SingleSshKey.svelte
new file mode 100644
index 0000000..cb3f1e1 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/ssh-keys/SingleSshKey.svelte
@@ -1,0 +1,42 @@
<script type="typescript">
    import type { SshKey } from '../../../types/ssh_keys';
    import RelativeTime from '../../../components/RelativeTime.svelte';
    import Icon from '../../../components/Icon.svelte';
    import { createEventDispatcher } from 'svelte';

    /**
     * The SSH key to draw up some information about
     */
    export let sshKey: SshKey;

    // build the event dispatcher for alerting the main view that the user wants to
    // delete the current key
    const dispatch = createEventDispatcher();
</script>

<div class="p-2 flex items-center">
    <div class="flex-grow">
        <h3 class="text-lg">{sshKey.name}</h3>

        <code class="text-xs">{sshKey.fingerprint}</code>

        <div class="text-xs pt-0.5 pb-1">
            <span>Added <RelativeTime time={sshKey.created_at} /></span>

            <span class="ml-2">
                Last used
                {#if sshKey.last_used_at}
                    <RelativeTime time={sshKey.last_used_at} />
                {:else}
                    never
                {/if}
            </span>
        </div>
    </div>

    <div class="pr-3">
        <button class="text-red-700" on:click={() => dispatch('delete')}>
            <Icon name="trash" />
        </button>
    </div>
</div>
diff --git a/chartered-frontend/src/routes/(authed)/crates/[organisation]/+page.svelte b/chartered-frontend/src/routes/(authed)/crates/[organisation]/+page.svelte
new file mode 100644
index 0000000..1e14d6e 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/crates/[organisation]/+page.svelte
@@ -1,0 +1,176 @@
<script type="typescript">
    import { page } from '$app/stores';
    import { request } from '../../../../stores/auth';
    import Spinner from '../../../../components/Spinner.svelte';
    import ErrorAlert from '../../../../components/ErrorAlert.svelte';
    import Icon from '../../../../components/Icon.svelte';
    import type { OrganisationDetail } from '../../../../types/organisations';
    import Member from './Member.svelte';
    import AddMember from './AddMember.svelte';

    let organisationPromise;
    $: organisationPromise = request<OrganisationDetail>(`/web/v1/organisations/${$page.params.organisation}`);

    function reload(event) {
        organisationPromise = request<OrganisationDetail>(`/web/v1/organisations/${$page.params.organisation}`);

        if (newMember && event.detail === newMember.uuid) {
            newMember = null;
        }
    }

    enum Tab {
        CRATES,
        MEMBERS,
    }

    const allTabs = [
        {
            id: Tab.CRATES,
            name: 'Crates',
            icon: 'package',
        },
        {
            id: Tab.MEMBERS,
            name: 'Members',
            icon: 'user',
        },
    ];

    let currentTab = Tab.CRATES;
    let newMember = null;
</script>

<header>
    <div class="container flex flex-col md:flex-row items-center md:items-start mx-auto p-10 mb-3">
        <div class="flex-grow text-center md:text-left">
            <h1 class="text-5xl text-highlight font-bold tracking-tight">
                {$page.params.organisation}
            </h1>

            <h2>
                {#await organisationPromise}
                    <div class="relative h-4 w-4">
                        <Spinner />
                    </div>
                {:then organisation}
                    {#if organisation.description}
                        {organisation.description}
                    {:else}
                        <em>No description given.</em>
                    {/if}
                {/await}
            </h2>
        </div>

        <div class="order-first md:order-last">
            <img src="http://placekitten.com/128/128" class="rounded-[50%]" />
        </div>
    </div>
</header>

<main class="container mx-auto p-10 pt-0">
    <div class="border-b border-gray-300 dark:border-gray-700">
        <ul class="flex flex-wrap -mb-px text-sm font-medium text-center text-gray-500 dark:text-gray-400">
            {#each allTabs as tab}
                <li class="mr-2">
                    <button
                        on:click={() => (currentTab = tab.id)}
                        class:!border-blue-500={currentTab === tab.id}
                        class:text-blue-500={currentTab === tab.id}
                        aria-current={currentTab === tab.id ? 'page' : false}
                        class="inline-flex items-center space-x-2 p-4 rounded-t-lg border-b-2 border-transparent"
                    >
                        <Icon name={tab.icon} /> <span>{tab.name}</span>
                    </button>
                </li>
            {/each}
        </ul>
    </div>

    <div class="mt-4">
        {#await organisationPromise}
            <div class="relative h-14">
                <Spinner />
            </div>
        {:then organisation}
            {#if currentTab === Tab.CRATES}
                <div class="grid gap-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4">
                    {#each organisation.crates as crate}
                        <a href={`/crates/${$page.params.organisation}/${crate.name}`} class="card">
                            <h5 class="card-header">
                                {$page.params.organisation}/<span class="text-highlight">{crate.name}</span>
                            </h5>

                            <p class="card-body">
                                {#if crate.description}
                                    {crate.description}
                                {:else}
                                    <em>No description given.</em>
                                {/if}
                            </p>
                        </a>
                    {/each}
                </div>

                {#if organisation.crates.length === 0}
                    <div
                        class="p-4 text-sm text-gray-700 bg-gray-100 rounded-lg dark:bg-gray-700 dark:text-gray-300"
                        role="alert"
                    >
                        <span class="font-medium">Welcome to your new organisation!</span>
                        It's a little bit lonely here right now, but you can solve that easily by
                        <button
                            on:click={() => (currentTab = Tab.MEMBERS)}
                            class="underline text-blue-600 hover:text-blue-700"
                        >
                            adding some team members
                        </button>
                        or
                        <a
                            href="https://book.chart.rs/"
                            target="_blank"
                            class="underline text-blue-600 hover:text-blue-700"
                        >
                            publishing your first crate</a
                        >!
                    </div>
                {/if}
            {:else if currentTab === Tab.MEMBERS}
                <div class="card p-0 divide-y card-divide">
                    {#each organisation.members as member, i}
                        <Member
                            {member}
                            organisation={$page.params.organisation}
                            possiblePermissions={organisation.possible_permissions}
                            on:updated={reload}
                        />
                    {/each}

                    {#if newMember}
                        <Member
                            member={newMember}
                            newPermissions={['VISIBLE']}
                            organisation={$page.params.organisation}
                            possiblePermissions={organisation.possible_permissions}
                            on:updated={reload}
                        />
                    {/if}
                </div>

                <div class="card mt-4">
                    <AddMember
                        hideUuids={organisation.members.map((v) => v.uuid)}
                        on:new={(member) => {
                            member.detail.permissions = [];
                            member.detail.uuid = member.detail.user_uuid;
                            newMember = member.detail;
                        }}
                    />
                </div>
            {/if}
        {:catch e}
            <ErrorAlert showClose={false}>{e}</ErrorAlert>
        {/await}
    </div>
</main>
diff --git a/chartered-frontend/src/routes/(authed)/crates/[organisation]/AddMember.svelte b/chartered-frontend/src/routes/(authed)/crates/[organisation]/AddMember.svelte
new file mode 100644
index 0000000..ed84b46 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/crates/[organisation]/AddMember.svelte
@@ -1,0 +1,94 @@
<script type="typescript">
    import { debounce } from 'lodash';
    import { auth, BASE_URL } from '../../../../stores/auth';
    import Spinner from '../../../../components/Spinner.svelte';
    import Icon from '../../../../components/Icon.svelte';
    import { createEventDispatcher } from 'svelte';

    const dispatch = createEventDispatcher();

    export let hideUuids: string[] = [];

    let loading = false;

    let search = '';
    let searchResults = [];
    $: performSearch(search);

    const onInput = debounce((event) => {
        search = event.target.value;
    }, 250);

    async function performSearch(search: string) {
        if (search === '') {
            return;
        }

        loading = true;

        try {
            let result = await fetch(`${BASE_URL}/a/${$auth.auth_key}/web/v1/users/search?q=${search}`);
            let json = await result.json();

            if (json.error) {
                throw new Error(json.error);
            }

            searchResults = json.users || [];
        } catch (e) {
            console.log(e);
        } finally {
            loading = false;
        }
    }

    function dispatchNewMember(member) {
        dispatch('new', member);
        searchResults = [];
        search = '';
    }
</script>

<div class="flex items-center">
    <input
        placeholder="Start typing a username..."
        on:input={(e) => {
            searchResults = [];
            onInput(e);
        }}
        type="text"
        class="border border-gray-200 dark:border-gray-700 bg-transparent text-sm rounded-lg block p-2.5 ring-blue-500 w-[100%] lg:w-[25%] focus:border-blue-500 mr-1"
    />

    {#if loading}
        <div class="relative h-10 w-10">
            <Spinner />
        </div>
    {/if}
</div>

{#if searchResults.length !== 0}
    <div class="mt-4 grid md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
        {#each searchResults as result}
            {#if !hideUuids.includes(result.user_uuid)}
                <button on:click={() => dispatchNewMember(result)} class="flex items-center">
                    {#if result.picture_url}
                        <img
                            alt="Your profile picture"
                            src={result.picture_url}
                            class="rounded-[50%] h-[4rem] w-[4rem] mr-4"
                        />
                    {:else}
                        <div
                            class="h-[4rem] w-[4rem] rounded-[50%] text-gray-300 bg-gray-100 dark:bg-gray-800 overflow-hidden mr-4"
                        >
                            <Icon height="4rem" width="4rem" name="user" />
                        </div>
                    {/if}

                    <span class="card-header">{result.display_name}</span>
                </button>
            {/if}
        {/each}
    </div>
{/if}
diff --git a/chartered-frontend/src/routes/(authed)/crates/[organisation]/Member.svelte b/chartered-frontend/src/routes/(authed)/crates/[organisation]/Member.svelte
new file mode 100644
index 0000000..8d7238f 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/crates/[organisation]/Member.svelte
@@ -1,0 +1,144 @@
<script type="typescript">
    import Icon from '../../../../components/Icon.svelte';
    import { isEqual } from 'lodash';
    import Spinner from '../../../../components/Spinner.svelte';
    import { auth, BASE_URL } from '../../../../stores/auth';
    import ErrorAlert from '../../../../components/ErrorAlert.svelte';
    import { createEventDispatcher } from 'svelte';

    const dispatch = createEventDispatcher();

    let clazz = '';

    export let organisation: string;
    export let crate: string | null = null;
    export let member;
    export let newPermissions = member.permissions;
    export let possiblePermissions: string[];
    export { clazz as class };

    let saving = false;
    let error = null;

    async function save() {
        saving = true;
        error = null;

        try {
            let method;
            if (!newPermissions.includes('VISIBLE')) {
                method = 'DELETE';
            } else if (member.permissions.length === 0) {
                method = 'PUT';
            } else {
                method = 'PATCH';
            }

            let url;
            if (crate) {
                url = `web/v1/crates/${organisation}/${crate}`;
            } else {
                url = `web/v1/organisations/${organisation}`;
            }

            let result = await fetch(`${BASE_URL}/a/${$auth.auth_key}/${url}/members`, {
                method,
                headers: {
                    Accept: 'application/json',
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                    user_uuid: member.uuid,
                    permissions: newPermissions,
                }),
            });

            let json = await result.json();

            if (json.error) {
                throw new Error(json.error);
            }

            member.permissions = newPermissions;
            dispatch('updated', member.uuid);
        } catch (e) {
            error = e.toString();
        } finally {
            saving = false;
        }
    }
</script>

<div class="p-6 {clazz}">
    {#if error}
        <ErrorAlert on:close={() => (error = null)}>{error}</ErrorAlert>
    {/if}

    <div class="flex flex-col md:flex-row md:items-center">
        <a href={`/users/${member.uuid}`} class="flex-grow flex items-center mr-10 card-header mb-2 md:mb-0">
            {#if member.picture_url}
                <img
                    alt="Your profile picture"
                    src={member.picture_url}
                    class="rounded-[50%] h-[2rem] mr-3 inline-block"
                />
            {:else}
                <div
                    class="inline-block h-[2rem] w-[2rem] rounded-[50%] mr-3 text-gray-300 bg-gray-100 dark:bg-gray-900 overflow-hidden"
                >
                    <Icon height="2rem" width="2rem" name="user" />
                </div>
            {/if}

            {member.display_name}
        </a>

        <div>
            {#each possiblePermissions as permission}
                <div class="flex md:inline-flex items-center md:mr-4">
                    <input
                        id={`${member.uuid}-${permission}`}
                        bind:group={newPermissions}
                        value={permission}
                        type="checkbox"
                        class="w-4 h-4 mr-2 rounded border border-gray-200 dark:border-gray-700 bg-transparent ring-blue-500 focus:border-blue-500 !ring-offset-0"
                    />
                    <label for={`${member.uuid}-${permission}`}>{permission}</label>
                </div>
            {/each}
        </div>

        <div
            class="flex items-center md:w-4 relative"
            class:hide={isEqual(newPermissions.sort(), member.permissions.sort())}
        >
            {#if saving}
                <div class="relative h-4 w-4 mt-2 md:mt-0">
                    <Spinner />
                </div>
            {:else if newPermissions.includes('VISIBLE')}
                <button
                    on:click={save}
                    class="text-lg btn-blue md:text-blue-700 md:p-0 md:border-none md:bg-transparent mt-2 md:mt-0 flex items-center"
                >
                    <Icon name="save" strokeWidth="2" />
                    <span class="ml-2 md:hidden">Save</span>
                </button>
            {:else}
                <button
                    on:click={save}
                    class="text-lg btn-red md:text-red-700 md:p-0 md:border-none md:bg-transparent mt-2 md:mt-0 flex items-center"
                >
                    <Icon name="trash" strokeWidth="2" />
                    <span class="ml-2 md:hidden">Delete</span>
                </button>
            {/if}
        </div>
    </div>
</div>

<style>
    .hide {
        @apply hidden md:block invisible;
    }
</style>
diff --git a/chartered-frontend/src/routes/(authed)/organisations/create/+page.svelte b/chartered-frontend/src/routes/(authed)/organisations/create/+page.svelte
new file mode 100644
index 0000000..82a6c80 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/organisations/create/+page.svelte
@@ -1,0 +1,135 @@
<script type="typescript">
    import Icon from '../../../../components/Icon.svelte';
    import ErrorAlert from '../../../../components/ErrorAlert.svelte';
    import { BASE_URL, auth } from '../../../../stores/auth';
    import { goto } from '$app/navigation';
    import Spinner from '../../../../components/Spinner.svelte';

    /**
     * Binding to the name field in the form.
     */
    let name = '';

    /**
     * Binding to the description field in the form.
     */
    let description = '';

    /**
     * Binding to the public checkbox in the form.
     */
    let isPublic = false;

    /*
     * Disables the form and replaces the submit button with a spinner if true.
     */
    let submitting = false;

    /**
     * The last error returned from the backend as a result of the submission. If this is
     * not null then the user is displayed an alert.
     */
    let error: string | null = null;

    /**
     * Submit the form data to the backend to attempt to create the organisation.
     */
    async function submit() {
        // clear the error since it'll no longer be applicable after this submission
        error = '';

        // disable the form and show a spinner to the user
        submitting = true;

        try {
            // attempt the actual creation of the organisation
            let result = await fetch(`${BASE_URL}/a/${$auth.auth_key}/web/v1/organisations`, {
                method: 'PUT',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({ name, description, public: isPublic }),
            });
            let json = await result.json();

            if (json.error) {
                throw new Error(json.error);
            }

            // successful creation, return the user back to the list
            await goto('/organisations/list');
        } catch (e) {
            error = e.toString();
        } finally {
            // stop showing the spinner once creation is complete
            submitting = false;
        }
    }
</script>

<header>
    <div class="container flex items-center mx-auto p-10">
        <h1 class="text-5xl font-bold tracking-tight">
            Create a new <span class="text-highlight">Organisation</span>.
        </h1>
    </div>
</header>

<main class="container mx-auto p-10 pt-0">
    {#if error}
        <ErrorAlert on:close={() => (error = null)}>{error}</ErrorAlert>
    {/if}

    <form on:submit|preventDefault={submit} class="card mb-4 p-4">
        <div class="mb-4">
            <label for="name" class="block mb-1 text-sm font-medium">Name</label>
            <input
                bind:value={name}
                required
                type="text"
                id="name"
                placeholder="my-backend-team"
                pattern="[a-zA-Z0-9-]*"
                class="border border-gray-200 dark:border-gray-700 bg-transparent text-sm rounded-lg block w-full p-2.5 ring-blue-500 focus:border-blue-500"
            />
            <div class="text-xs mt-1">Must be in the format <code>[a-zA-Z0-9-]*</code></div>
        </div>

        <div class="mb-4">
            <label for="description" class="block mb-1 text-sm font-medium">Description</label>
            <textarea
                bind:value={description}
                rows={3}
                id="description"
                class="border border-gray-200 dark:border-gray-700 bg-transparent text-sm rounded-lg block w-full p-2.5 ring-blue-500 focus:border-blue-500"
            />
        </div>

        <div class="mb-4">
            <input
                bind:checked={isPublic}
                type="checkbox"
                id="public"
                class="w-4 h-4 rounded border border-gray-200 dark:border-gray-700 bg-transparent ring-blue-500 focus:border-blue-500 !ring-offset-0"
            />
            <label for="public" class="text-sm">
                Grant all users access to view and download crates from this organisation (cannot be removed after
                creation)
            </label>
        </div>

        {#if submitting}
            <div class="relative h-4 w-4">
                <Spinner />
            </div>
        {:else}
            <button
                type="submit"
                class="inline-flex items-center py-2.5 px-4 text-xs font-medium text-center text-white bg-blue-700 rounded-lg focus:ring-4 focus:ring-blue-200 dark:focus:ring-blue-900 hover:bg-blue-800"
            >
                <Icon name="plus" />
                <span class="ml-1">Add Key</span>
            </button>
        {/if}
    </form>
</main>
diff --git a/chartered-frontend/src/routes/(authed)/organisations/list/+page.svelte b/chartered-frontend/src/routes/(authed)/organisations/list/+page.svelte
new file mode 100644
index 0000000..2701b78 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/organisations/list/+page.svelte
@@ -1,0 +1,67 @@
<script type="typescript">
    import Spinner from '../../../../components/Spinner.svelte';
    import { request } from '../../../../stores/auth';
    import type { OrganisationList } from '../../../../types/organisations';
    import ErrorAlert from '../../../../components/ErrorAlert.svelte';

    const organisationsPromise = request<OrganisationList>('/web/v1/organisations');
</script>

<header>
    <div class="container flex items-center mx-auto">
        <div class="p-10 mb-3">
            <h1 class="text-5xl font-bold tracking-tight">
                Your <span class="text-highlight">Organisations</span>.
            </h1>
            <h2>
                Organisations and permissions are the heart of Chartered. All crates belong to an Organisation and to
                download a crate a user must have the <code>VISIBLE</code> permission for it.
            </h2>

            <a href="https://book.chart.rs/" target="_blank" class="block btn-blue-outline"> Learn More </a>
        </div>
    </div>
</header>

<main class="container mx-auto p-10 pt-0">
    {#await organisationsPromise}
        <div class="relative h-4">
            <Spinner />
        </div>
    {:then organisations}
        <div
            class:hidden={organisations.organisations.length === 0}
            class="mb-4 grid md:grid-cols-2 lg:grid-cols-4 gap-2"
        >
            {#each organisations.organisations as organisation, i}
                <a class="card flex space-x-2 items-center" href={`/crates/${organisation.name}`}>
                    <div class="flex-grow h-full">
                        <h5 class="text-highlight card-header">{organisation.name}</h5>
                        <p class="card-body">
                            {#if organisation.description}
                                {organisation.description}
                            {:else}
                                <em>No description given.</em>
                            {/if}
                        </p>
                    </div>

                    <div class="min-w-[48px]">
                        <img class="rounded-[50%]" src="http://placekitten.com/48/48" />
                    </div>
                </a>
            {/each}
        </div>

        {#if organisations.organisations.length === 0}
            <div class="mb4">
                You currently belong to no organisations, please create one or ask someone to add you to an existing
                one.
            </div>
        {/if}

        <a href="/organisations/create" class="inline-flex items-center btn-blue-outline"> + Create </a>
    {:catch e}
        <ErrorAlert showClose={false}>{e}</ErrorAlert>
    {/await}
</main>
diff --git a/chartered-frontend/src/routes/(authed)/sessions/list/+page.svelte b/chartered-frontend/src/routes/(authed)/sessions/list/+page.svelte
new file mode 100644
index 0000000..2512b2f 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/sessions/list/+page.svelte
@@ -1,0 +1,97 @@
<script type="typescript">
    import { request } from '../../../../stores/auth';
    import Spinner from '../../../../components/Spinner.svelte';
    import type { Session, Sessions } from '../../../../types/sessions';
    import RelativeTime from '../../../../components/RelativeTime.svelte';
    import Icon from '../../../../components/Icon.svelte';
    import DeleteSessionModal from './DeleteSessionModal.svelte';

    let sessionPromise = loadSessions();

    let deleting: Session | null = null;

    function loadSessions(): Promise<Sessions> {
        return request<Sessions>('/web/v1/sessions');
    }

    function reloadSessions() {
        sessionPromise = loadSessions();
    }
</script>

<header>
    <div class="container flex items-center mx-auto">
        <div class="p-10 mb-3">
            <h1 class="text-5xl font-bold tracking-tight">Active Sessions</h1>
        </div>
    </div>
</header>

<main class="container mx-auto px-10">
    <div class="card">
        {#await sessionPromise}
            <div class="relative h-12">
                <Spinner />
            </div>
        {:then sessions}
            <div class="overflow-x-auto w-full">
                <table class="w-full max-w-full border-collapse">
                    <thead>
                        <tr>
                            <th scope="col">IP Address</th>
                            <th scope="col">User Agent</th>
                            <th scope="col">SSH Key Fingerprint</th>
                            <th scope="col">Expires</th>
                            <th scope="col" />
                        </tr>
                    </thead>

                    <tbody>
                        {#each sessions.sessions as session}
                            <tr>
                                <td>{session.ip}</td>
                                <td>{session.user_agent || 'n/a'}</td>
                                <td>{session.ssh_key_fingerprint || 'n/a'}</td>
                                <td>
                                    {#if session.expires_at}
                                        <RelativeTime time={session.expires_at} />
                                    {:else}
                                        n/a
                                    {/if}
                                </td>
                                <td>
                                    <button class="text-red-700" on:click={() => (deleting = session)}>
                                        <Icon name="trash" />
                                    </button>
                                </td>
                            </tr>
                        {/each}
                    </tbody>
                </table>
            </div>
        {/await}
    </div>
</main>

{#if deleting}
    <DeleteSessionModal {deleting} on:complete={reloadSessions} on:close={() => (deleting = null)} />
{/if}

<style>
    th,
    td {
        @apply text-left px-5;
    }

    thead tr:first-of-type th {
        @apply pb-2;
    }

    tbody tr td {
        @apply py-2;
    }

    tbody tr:last-of-type td {
        @apply pb-0;
    }
</style>
diff --git a/chartered-frontend/src/routes/(authed)/sessions/list/DeleteSessionModal.svelte b/chartered-frontend/src/routes/(authed)/sessions/list/DeleteSessionModal.svelte
new file mode 100644
index 0000000..28711e2 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/sessions/list/DeleteSessionModal.svelte
@@ -1,0 +1,144 @@
<script type="typescript">
    import { createEventDispatcher } from 'svelte';
    import Icon from '../../../../components/Icon.svelte';
    import ErrorAlert from '../../../../components/ErrorAlert.svelte';
    import Spinner from '../../../../components/Spinner.svelte';
    import { auth, BASE_URL } from '../../../../stores/auth';
    import type { Session } from '../../../../types/sessions';

    const dispatch = createEventDispatcher();

    /**
     * The key that the user requested to delete.
     */
    export let deleting: Session;

    /**
     * Any errors that came of the last submission. If this is not null the user will be shown
     * an alert.
     */
    let deleteError = null;

    /**
     * Simple boolean flag to determine if a session is currently being submitted, so we can
     * disable the buttons and prevent exiting the modal.
     */
    let isDeleting = false;

    /**
     * Binds helper keys for the modal, so we can provide some expected functions of a modal.
     */
    function handleKeydown(event) {
        if (event.key == 'Escape') {
            closeModal();
        }
    }

    /**
     * Attempts the deletion of the session against the backend.
     */
    async function deleteSession() {
        // reset the error since it no longer applies after this run
        deleteError = null;

        // show a spinner to the user while we're working and prevent them leaving the
        // modal
        isDeleting = true;

        try {
            // submit deletion request to backend
            let res = await fetch(`${BASE_URL}/a/${$auth.auth_key}/web/v1/sessions`, {
                method: 'DELETE',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({ uuid: deleting.uuid }),
            });
            let json: { error?: string } = await res.json();

            if (json.error) {
                throw new Error(json.error);
            }

            // key successfully deleted, alert the main view, so it can reload the key list,
            // and close the modal
            isDeleting = false;
            dispatch('complete');
            closeModal();
        } catch (e) {
            isDeleting = false;
            deleteError = e.toString();
        }
    }

    /**
     * Send an event to the main view to request to close us, by unsetting `deleting` on their end
     */
    function closeModal() {
        // if a deletion is currently in progress, we don't want to let the user close the modal
        // and just have to wonder whether the key was actually deleted
        if (!isDeleting) {
            dispatch('close');
        }
    }
</script>

<svelte:window on:keydown={handleKeydown} />

<div
    on:click|self={closeModal}
    class="overflow-y-auto overflow-x-hidden backdrop-blur-[4px] bg-black/20 h-screen w-screen fixed top-0 right-0 left-0 z-50 flex items-center justify-center"
>
    <div class="p-4 bg-white rounded-lg shadow-2xl dark:bg-gray-700">
        <button
            on:click={closeModal}
            type="button"
            class="absolute top-3 right-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center dark:hover:bg-gray-800 dark:hover:text-white"
        >
            <Icon name="x" />
            <span class="sr-only">Close modal</span>
        </button>

        {#if deleteError}
            <ErrorAlert on:close={() => (deleteError = null)}>{deleteError}</ErrorAlert>
        {/if}

        <div class="p-6 text-center">
            <div class="mx-auto text-[4rem] text-red-600">
                <div class="inline-block">
                    <Icon name="alert-triangle" />
                </div>
            </div>

            <h3 class="text-lg font-normal text-inherit dark:text-gray-400">
                Are you sure you want to delete this session?
            </h3>

            <div class="break-all mb-5 mt-2 text-xs">
                <div><code>{deleting.ssh_key_fingerprint || deleting.user_agent || 'unknown'}</code></div>
                <div><code>{deleting.ip}</code></div>
            </div>

            {#if isDeleting}
                <div class="relative h-4">
                    <Spinner />
                </div>
            {:else}
                <button
                    on:click={deleteSession}
                    class="text-white bg-red-600 hover:bg-red-800 focus:ring-4 focus:outline-none focus:ring-red-300 dark:focus:ring-red-800 font-medium rounded-lg text-sm inline-flex items-center px-5 py-2.5 text-center mr-2"
                >
                    Yes, I'm sure
                </button>

                <button
                    on:click={closeModal}
                    autofocus
                    class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10 dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600"
                >
                    No, cancel
                </button>
            {/if}
        </div>
    </div>
</div>
diff --git a/chartered-frontend/src/routes/(authed)/users/[uuid]/+page.svelte b/chartered-frontend/src/routes/(authed)/users/[uuid]/+page.svelte
new file mode 100644
index 0000000..323c8ba 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/users/[uuid]/+page.svelte
@@ -1,0 +1,71 @@
<script type="typescript">
    import { page } from '$app/stores';
    import { request } from '../../../../stores/auth';
    import Spinner from '../../../../components/Spinner.svelte';
    import Icon from '../../../../components/Icon.svelte';
    import type { User } from '../../../../types/user';

    let userPromise;
    $: userPromise = request<User>(`/web/v1/users/info/${$page.params.uuid}`).then(
        (user: User & { displayName: string }) => {
            user.displayName = user.nick || user.name || user.username;
            return user;
        },
    );
</script>

{#await userPromise}
    <header>
        <div class="relative h-[20rem]">
            <Spinner />
        </div>
    </header>
{:then user}
    <header>
        <div class="container flex flex-col md:flex-row items-center md:items-start mx-auto p-10 mb-3">
            <div class="flex-grow text-center md:text-left">
                <h1 class="text-5xl text-highlight font-bold tracking-tight">
                    {user.displayName}
                </h1>

                <h2 class="space-x-2">
                    {#each [user.nick, user.name, user.username] as alias}
                        {#if alias && user.displayName !== alias}
                            <span>aka <strong>{alias}</strong></span>
                        {/if}
                    {/each}
                </h2>

                {#if user.external_profile_url}
                    <a
                        href={user.external_profile_url}
                        target="_blank"
                        class="inline-flex space-x-1 items-center btn-blue-outline"
                    >
                        <Icon name="home" />
                        <span>Homepage</span>
                    </a>
                {/if}

                {#if user.email}
                    <a href={`mailto:${user.email}`} class="inline-flex space-x-1 items-center btn-blue-outline">
                        <Icon name="mail" />
                        <span>Email</span>
                    </a>
                {/if}
            </div>

            <div class="order-first md:order-last">
                {#if user.picture_url}
                    <img alt="Your profile picture" src={user.picture_url} class="rounded-[50%] h-[8rem] inline" />
                {:else}
                    <div
                        class="h-[8rem] w-[8rem] rounded-[50%] text-gray-300 bg-gray-100 dark:bg-gray-800 overflow-hidden"
                    >
                        <Icon height="8rem" width="8rem" name="user" />
                    </div>
                {/if}
            </div>
        </div>
    </header>
{/await}
diff --git a/chartered-frontend/src/routes/(unauthed)/auth/login/+page.svelte b/chartered-frontend/src/routes/(unauthed)/auth/login/+page.svelte
new file mode 100644
index 0000000..2ed4242 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(unauthed)/auth/login/+page.svelte
@@ -1,0 +1,144 @@
<script type="typescript">
    import { loginOAuth, login, fetchOAuthProviders } from '../../../../stores/auth';
    import Spinner from '../../../../components/Spinner.svelte';
    import ErrorAlert from '../../../../components/ErrorAlert.svelte';
    import { goto } from '$app/navigation';

    /**
     * Once OAuth providers are loaded this will contain whether password auth
     * is enabled, we'll set it to true and just assume for now that password
     * auth is enabled so the user isn't sat waiting for a spinner.
     */
    let passwordAllowed = true;

    /**
     * Displays a spinner if a login is currently in progress, so we look busy
     * and the user can't modify form fields or anything.
     */
    let loginInProgress = false;

    /**
     * Displays an error to the user, if empty will hide the error popup.
     */
    let error = null;

    /**
     * A binding to the username field in the form.
     */
    let username = '';

    /**
     * A binding to the password field in the form.
     */
    let password = '';

    /**
     * Performs a password-based authentication using the bound username and password.
     */
    async function doLogin() {
        // start the spinner while the user is authenticating
        loginInProgress = true;

        try {
            await login(username, password);
        } catch (e) {
            error = e.toString();
        } finally {
            // behave like a real application and set the password to empty so
            // if the user fails authentication they can type it in again
            password = '';

            // stop the spinner now we've got our result
            loginInProgress = false;
        }
    }

    /**
     * Starts the OAuth flow for the given provider, grabbing the auth URL from the
     * backend.
     *
     * @param provider provider to start flow for
     */
    async function doLoginOAuth(provider: string) {
        // start the spinner while the user is authenticating
        loginInProgress = true;

        // reset both the username & password since the user attempted to do
        // an oauth login
        username = '';
        password = '';

        try {
            // attempt to redirect the user to the OAuth login page
            await loginOAuth(provider);
        } catch (e) {
            error = e.toString();
        } finally {
            loginInProgress = false;
        }
    }

    // start loading possible oauth providers
    const oauthProvidersPromise = fetchOAuthProviders().then((v) => {
        passwordAllowed = v.password;
        return v;
    });
</script>

<Spinner hidden={!loginInProgress} />

<div class:invisible={loginInProgress}>
    {#if error}
        <ErrorAlert on:close={() => (error = null)}>{error}</ErrorAlert>
    {/if}

    <form class:hidden={!passwordAllowed} on:submit|preventDefault={doLogin}>
        <div class="relative">
            <input type="text" id="username" class="peer" placeholder=" " bind:value={username} />
            <label for="username">Username</label>
        </div>

        <div class="relative">
            <input type="password" id="password" class="peer" placeholder=" " bind:value={password} />
            <label for="password">Password</label>
        </div>

        <button type="submit">Login</button>
    </form>

    <button class:hidden={!passwordAllowed} class="mt-2" on:click={() => goto('/auth/register')}> Register </button>

    {#await oauthProvidersPromise then oauthProviders}
        <div class:!hidden={!oauthProviders.password} class="side-lines">or</div>

        {#each oauthProviders.providers as provider}
            <button on:click={() => doLoginOAuth(provider)}>
                Login with {provider}
            </button>
        {/each}
    {/await}
</div>

<style>
    input {
        @apply w-full mb-2 px-2.5 pb-2.5 pt-5 bg-transparent border dark:border-slate-700 rounded border-inherit;
    }

    label {
        @apply absolute text-slate-500 duration-300 transform -translate-y-4 scale-75 top-4 z-10 origin-[0] left-2.5 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-4;
    }

    button {
        @apply text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800 w-full;
    }

    .side-lines {
        @apply grid gap-3 text-sm text-center items-center grid-cols-sides-extend text-slate-500 my-2;
    }

    .side-lines::before,
    .side-lines::after {
        content: '';
        border-top: 1px solid;
    }
</style>
diff --git a/chartered-frontend/src/routes/(unauthed)/auth/register/+page.svelte b/chartered-frontend/src/routes/(unauthed)/auth/register/+page.svelte
new file mode 100644
index 0000000..a176500 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(unauthed)/auth/register/+page.svelte
@@ -1,0 +1,93 @@
<script type="typescript">
    import Spinner from '../../../../components/Spinner.svelte';
    import ErrorAlert from '../../../../components/ErrorAlert.svelte';
    import { register } from '../../../../stores/auth';
    import { goto } from '$app/navigation';

    /**
     * Displays a spinner while registration is being performed.
     */
    let registerInProgress = false;

    /**
     * Displays an error message to the user above the form if set to a string
     */
    let error = null;

    /**
     * The username bound to the corresponding form field
     */
    let username = '';

    /**
     * The password bound to the corresponding form field
     */
    let password = '';

    /**
     * Attempt the registration using the credentials currently in the form, setting
     * an error if the registration failed, or redirecting back to login form if it
     * was successful.
     */
    async function doRegister() {
        try {
            // start the spinner while we attempt to register the user
            registerInProgress = true;

            // attempt the registration
            await register(username, password);

            // if we got to this point registration was successful, so we don't need the
            // username to be set in the form anymore
            username = '';

            // redirect the user back to the login
            await goto('/auth/login');
        } catch (e) {
            error = e.toString();
        } finally {
            // stop displaying the spinner since we've finished attempting to register the
            // user
            registerInProgress = false;

            // unset the password so the user has to type it again like a real application
            password = '';
        }
    }
</script>

<Spinner hidden={!registerInProgress} />

<div class:invisible={registerInProgress}>
    {#if error}
        <ErrorAlert on:close={() => (error = null)}>{error}</ErrorAlert>
    {/if}

    <form on:submit|preventDefault={doRegister}>
        <div class="relative">
            <input type="text" id="username" class="peer" placeholder=" " bind:value={username} />
            <label for="username">Username</label>
        </div>

        <div class="relative">
            <input type="password" id="password" class="peer" placeholder=" " bind:value={password} />
            <label for="password">Password</label>
        </div>

        <button type="submit">Register</button>
    </form>
</div>

<style>
    input {
        @apply w-full mb-2 px-2.5 pb-2.5 pt-5 bg-transparent border dark:border-slate-700 rounded border-inherit;
    }

    label {
        @apply absolute text-slate-500 duration-300 transform -translate-y-4 scale-75 top-4 z-10 origin-[0] left-2.5 peer-focus:text-blue-600 peer-focus:dark:text-blue-500 peer-placeholder-shown:scale-100 peer-placeholder-shown:translate-y-0 peer-focus:scale-75 peer-focus:-translate-y-4;
    }

    button {
        @apply text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800 w-full;
    }
</style>
diff --git a/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/+page.svelte b/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/+page.svelte
new file mode 100644
index 0000000..1fdd841 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/+page.svelte
@@ -1,0 +1,145 @@
<script type="typescript">
    import { page } from '$app/stores';
    import { request } from '../../../../../stores/auth';
    import Spinner from '../../../../../components/Spinner.svelte';
    import SvelteMarkdown from 'svelte-markdown';
    import Icon from '../../../../../components/Icon.svelte';
    import type { Crate } from '../../../../../types/crate';
    import Dependency from './Dependency.svelte';
    import VersionTab from './VersionTab.svelte';
    import MemberTab from './MemberTab.svelte';

    enum Tab {
        README,
        VERSIONS,
        MEMBERS,
    }

    const allTabs = [
        {
            id: Tab.README,
            name: 'Readme',
            icon: 'book-open',
        },
        {
            id: Tab.VERSIONS,
            name: 'Versions',
            icon: 'archive',
        },
        {
            id: Tab.MEMBERS,
            name: 'Members',
            icon: 'user',
        },
    ];

    let cratePromise;
    $: cratePromise = request<Crate>(`/web/v1/crates/${$page.params.organisation}/${$page.params.crate}`);

    let currentTab = Tab.README;
</script>

<header>
    <div class="container flex mx-auto p-10 mb-3">
        <div class="flex-grow">
            <h1 class="text-5xl font-bold tracking-tight">
                <a href={`/crates/${$page.params.organisation}`}>{$page.params.organisation}</a>/<span
                    class="text-highlight">{$page.params.crate}</span
                >
            </h1>

            {#await cratePromise then crate}
                <h2>
                    {#if crate.description}
                        {crate.description}
                    {:else}
                        <em>No description given.</em>
                    {/if}
                </h2>

                <div class="space-x-2">
                    {#if crate.homepage}
                        <a href={crate.homepage} target="_blank" class="card-header-button btn-blue-outline">
                            <Icon name="home" />
                            Home
                        </a>
                    {/if}

                    {#if crate.repository}
                        <a href={crate.repository} target="_blank" class="card-header-button btn-blue-outline">
                            <Icon name="git-branch" />
                            Repo
                        </a>
                    {/if}

                    {#if crate.documentation}
                        <a href={crate.documentation} target="_blank" class="card-header-button btn-blue-outline">
                            <Icon name="book" />
                            Docs
                        </a>
                    {/if}
                </div>
            {/await}
        </div>
    </div>
</header>

<main class="container mx-auto p-10 pt-0 grid grid-cols-12 gap-6 relative">
    {#await cratePromise}
        <Spinner />
    {:then crate}
        <div class="card col-span-full lg:col-span-9 p-0">
            <div class="border-b border-gray-200 dark:border-gray-700">
                <ul class="flex flex-wrap -mb-px text-sm font-medium text-center text-gray-500 dark:text-gray-400">
                    {#each allTabs as tab}
                        <li class="mr-2">
                            <button
                                on:click={() => (currentTab = tab.id)}
                                class:!border-blue-500={currentTab === tab.id}
                                class:text-blue-500={currentTab === tab.id}
                                aria-current={currentTab === tab.id ? 'page' : false}
                                class="inline-flex items-center space-x-2 p-4 rounded-t-lg border-b-2 border-transparent"
                            >
                                <Icon name={tab.icon} /> <span>{tab.name}</span>
                            </button>
                        </li>
                    {/each}
                </ul>
            </div>

            {#if currentTab === Tab.README}
                <article
                    class="mt-8 px-6 pb-6 prose dark:prose-invert text-inherit max-w-full prose-headings:text-inherit hover:prose-a:text-blue-600 prose-a:text-blue-500 prose-code:p-1 prose-code:bg-slate-100 dark:prose-code:bg-slate-700 prose-code:rounded-lg prose-pre:bg-slate-100 dark:prose-pre:bg-slate-700 leading-6 before:prose-code:content-none after:prose-code:content-none prose-code:text-pink-400 prose-code:font-normal prose-strong:text-inherit prose-img:inline prose-img:my-0"
                >
                    <SvelteMarkdown source={crate.readme} />
                </article>
            {:else if currentTab === Tab.MEMBERS}
                <MemberTab />
            {:else if currentTab === Tab.VERSIONS}
                <div class="divide-y divide-gray-200 dark:divide-gray-700">
                    {#each crate.versions as version}
                        <VersionTab {version} class="p-6" />
                    {/each}
                </div>
            {/if}
        </div>

        <div class="col-span-full lg:col-span-3">
            <div class="card p-0">
                <h1 class="text-xl p-3 border-b border-gray-200 dark:border-gray-700 font-medium">Dependencies</h1>

                <div class="divide-y divide-gray-200 dark:divide-gray-700">
                    {#each crate.versions[0].deps as dependency, i}
                        <Dependency {dependency} class="p-3" />
                    {/each}
                </div>
            </div>
        </div>
    {/await}
</main>

<style>
    .card-header-button {
        @apply inline-flex items-center gap-x-1;
    }
</style>
diff --git a/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/Dependency.svelte b/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/Dependency.svelte
new file mode 100644
index 0000000..5f289c7 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/Dependency.svelte
@@ -1,0 +1,29 @@
<script type="typescript">
    import type { VersionDependency } from '../../../../../types/crate';

    let clazz = '';

    export let dependency: VersionDependency;
    export { clazz as class };

    function getLocalDependencyOrganisation(registry: string): string {
        const s = dependency.registry.split('/');

        return s[s.length - 1];
    }
</script>

<div class={clazz}>
    {#if dependency.registry === 'https://github.com/rust-lang/crates.io-index'}
        <a href={`https://crates.io/crates/${dependency.name}`} target="_blank">
            {dependency.name}
        </a>
    {:else if dependency.registry.indexOf('ssh://') === 0}
        <a href={`/crates/${getLocalDependencyOrganisation(dependency.registry)}/${dependency.name}`} target="_blank">
            {dependency.name}
        </a>
    {:else}
        {dependency.name}
    {/if}
    = "{dependency.req}"
</div>
diff --git a/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/MemberTab.svelte b/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/MemberTab.svelte
new file mode 100644
index 0000000..37782bd 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/MemberTab.svelte
@@ -1,0 +1,52 @@
<script type="typescript">
    import { request } from '../../../../../stores/auth';
    import { page } from '$app/stores';
    import AddMember from '../AddMember.svelte';
    import Member from '../Member.svelte';

    let newMember = null;

    let membersPromise;
    $: membersPromise = request(`/web/v1/crates/${$page.params.organisation}/${$page.params.crate}/members`);

    function reloadMembers() {
        newMember = null;
        membersPromise = request(`/web/v1/crates/${$page.params.organisation}/${$page.params.crate}/members`);
    }
</script>

{#await membersPromise then members}
    <div class="card-divide divide-y">
        {#each members.members as member, i}
            <Member
                {member}
                organisation={$page.params.organisation}
                crate={$page.params.crate}
                possiblePermissions={members.possible_permissions}
                on:updated={reloadMembers}
            />
        {/each}

        {#if newMember}
            <Member
                member={newMember}
                newPermissions={['VISIBLE']}
                organisation={$page.params.organisation}
                crate={$page.params.crate}
                possiblePermissions={members.possible_permissions}
                on:updated={reloadMembers}
            />
        {/if}

        <div class="p-6">
            <AddMember
                hideUuids={members.members.map((v) => v.uuid)}
                on:new={(member) => {
                    member.detail.permissions = [];
                    member.detail.uuid = member.detail.user_uuid;
                    newMember = member.detail;
                }}
            />
        </div>
    </div>
{/await}
diff --git a/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/VersionTab.svelte b/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/VersionTab.svelte
new file mode 100644
index 0000000..2419344 100644
--- /dev/null
+++ a/chartered-frontend/src/routes/(authed)/crates/[organisation]/[crate]/VersionTab.svelte
@@ -1,0 +1,59 @@
<script type="typescript">
    import type { Version } from '../../../../../types/crate';
    import Icon from '../../../../../components/Icon.svelte';
    import RelativeTime from '../../../../../components/RelativeTime.svelte';

    let clazz = '';

    export let version: Version;
    export { clazz as class };

    function humanFileSize(size: number): string {
        const i = Math.floor(Math.log(size) / Math.log(1024));
        return Number((size / Math.pow(1024, i)).toFixed(2)) + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
    }
</script>

<div class={clazz}>
    <div class="card-header">{version.vers}</div>

    <div class="card-body space-x-2">
        <div class="inline-flex items-center space-x-1">
            <span>By</span>

            {#if version.uploader.picture_url}
                <img
                    alt="Your profile picture"
                    src={version.uploader.picture_url}
                    class="rounded-[50%] h-[1rem] w-[1rem]"
                />
            {:else}
                <div class="h-[1rem] w-[1rem] rounded-[50%] text-gray-300 bg-gray-100 dark:bg-gray-800 overflow-hidden">
                    <Icon height="1rem" width="1rem" name="user" />
                </div>
            {/if}

            <a
                href={`/users/${version.uploader.uuid}`}
                class="border-b border-blue-500 text-blue-500 hover:border-blue-600 hover:text-blue-600"
            >
                {version.uploader.display_name}
            </a>
        </div>

        <div class="inline-flex items-center space-x-1">
            <Icon name="calendar" />
            <RelativeTime time={version.created_at} />
        </div>

        <div class="inline-flex items-center space-x-1">
            <Icon name="hard-drive" />
            <span>{humanFileSize(version.size)}</span>
        </div>

        <div class="inline-flex items-center space-x-1">
            <Icon name="check-square" />
            <span>{Object.keys(version.features).length} features</span>
        </div>
    </div>
</div>