diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..3a52a38532c5a54805d7a2736410f04f6aa665b4
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,12 @@
+.env
+.env_copy
+.gitignore
+.deepeval
+.deepeval_telemetry.txt
+frontend/node_modules/
+frontend/build/
+venv/
+.files/
+__pycache__/
+LICENSE.md
+README.md
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..ad698f352d3fd1be3d601de7e50089ed171f859b
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,59 @@
+# ----------------------------
+# Stage 1: Build the React Frontend
+# ----------------------------
+FROM node:20-alpine AS builder
+RUN apk add --no-cache libc6-compat
+WORKDIR /app
+
+# Copy the 'frontend' folder from the project root into the container
+COPY frontend ./frontend
+
+# Switch to the frontend directory
+WORKDIR /app/frontend
+
+# Install dependencies (using yarn, npm, or pnpm)
+RUN if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
+ elif [ -f package-lock.json ]; then npm ci; \
+ elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
+ else echo "No lockfile found. Exiting." && exit 1; \
+ fi
+
+# Build the React app (produces a production-ready build in the "build" folder)
+RUN npm run build
+
+# ----------------------------
+# Stage 2: Set Up the FastAPI Backend and Serve the React App
+# ----------------------------
+FROM python:3.12-slim AS backend
+WORKDIR /app
+
+# Install OS-level dependencies
+RUN apt-get update --fix-missing && \
+ apt-get install --no-install-recommends -y git curl && \
+ apt-get clean && rm -rf /var/lib/apt/lists/*
+
+# Install Node.js (if needed for any backend tasks)
+RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
+ apt-get update --fix-missing && \
+ apt-get install --no-install-recommends -y nodejs && \
+ apt-get clean && rm -rf /var/lib/apt/lists/*
+
+# Copy requirements.txt and install Python dependencies
+COPY requirements.txt .
+RUN pip install --no-cache-dir -r requirements.txt
+
+# Install additional dependencies for torch and spaCy
+RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
+RUN python -m spacy download en_core_web_sm
+
+# Copy the rest of your backend code and resources
+COPY . .
+
+# Copy the built React app from the builder stage into a folder named "static"
+COPY --from=builder /app/frontend/build ./static
+
+# Expose the port
+EXPOSE ${PORT:-7860}
+
+# Start the FastAPI backend using Uvicorn, reading the PORT env variable
+CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port ${PORT:-7860}"]
\ No newline at end of file
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..7ae0bb4ebb8e4de2d6f054155971e4f71f43b1d9
--- /dev/null
+++ b/frontend/package-lock.json
@@ -0,0 +1,19274 @@
+{
+ "name": "hemang",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "hemang",
+ "version": "0.1.0",
+ "dependencies": {
+ "@emotion/react": "^11.14.0",
+ "@emotion/styled": "^11.14.0",
+ "@fortawesome/fontawesome-free": "^6.7.2",
+ "@google/generative-ai": "^0.21.0",
+ "@mui/icons-material": "^6.4.4",
+ "@mui/material": "^6.4.3",
+ "@mui/styled-engine-sc": "^6.4.2",
+ "cra-template": "1.2.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-icons": "^5.4.0",
+ "react-markdown": "^9.0.3",
+ "react-router-dom": "^7.1.3",
+ "react-scripts": "5.0.1",
+ "styled-components": "^6.1.14",
+ "web-vitals": "^4.2.4"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz",
+ "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz",
+ "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.5",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.7",
+ "@babel/parser": "^7.26.7",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.26.7",
+ "@babel/types": "^7.26.7",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/eslint-parser": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.26.5.tgz",
+ "integrity": "sha512-Kkm8C8uxI842AwQADxl0GbcG1rupELYLShazYEZO/2DYjhyWXJIOUVOE3tBYm6JXzUCNJOZEzqc4rCW/jsEQYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0",
+ "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/@babel/eslint-parser/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==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@babel/eslint-parser/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz",
+ "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.26.5",
+ "@babel/types": "^7.26.5",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz",
+ "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "regexpu-core": "^6.2.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz",
+ "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-wrap-function": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
+ "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
+ "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
+ "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz",
+ "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.7"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
+ "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
+ "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
+ "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
+ "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz",
+ "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-decorators": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
+ "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz",
+ "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-flow": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz",
+ "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
+ "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
+ "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
+ "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz",
+ "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
+ "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
+ "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
+ "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
+ "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
+ "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/template": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
+ "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
+ "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
+ "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
+ "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
+ "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
+ "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz",
+ "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/plugin-syntax-flow": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
+ "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
+ "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
+ "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
+ "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
+ "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
+ "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
+ "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
+ "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
+ "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
+ "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
+ "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.26.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz",
+ "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
+ "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
+ "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
+ "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
+ "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
+ "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
+ "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
+ "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
+ "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz",
+ "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz",
+ "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
+ "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz",
+ "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz",
+ "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
+ "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
+ "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
+ "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz",
+ "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
+ "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
+ "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
+ "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
+ "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz",
+ "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.7.tgz",
+ "integrity": "sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
+ "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
+ "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
+ "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
+ "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.7.tgz",
+ "integrity": "sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.26.5",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.26.0",
+ "@babel/plugin-syntax-import-attributes": "^7.26.0",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.25.9",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.9",
+ "@babel/plugin-transform-async-to-generator": "^7.25.9",
+ "@babel/plugin-transform-block-scoped-functions": "^7.26.5",
+ "@babel/plugin-transform-block-scoping": "^7.25.9",
+ "@babel/plugin-transform-class-properties": "^7.25.9",
+ "@babel/plugin-transform-class-static-block": "^7.26.0",
+ "@babel/plugin-transform-classes": "^7.25.9",
+ "@babel/plugin-transform-computed-properties": "^7.25.9",
+ "@babel/plugin-transform-destructuring": "^7.25.9",
+ "@babel/plugin-transform-dotall-regex": "^7.25.9",
+ "@babel/plugin-transform-duplicate-keys": "^7.25.9",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-dynamic-import": "^7.25.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.26.3",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.9",
+ "@babel/plugin-transform-for-of": "^7.25.9",
+ "@babel/plugin-transform-function-name": "^7.25.9",
+ "@babel/plugin-transform-json-strings": "^7.25.9",
+ "@babel/plugin-transform-literals": "^7.25.9",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.25.9",
+ "@babel/plugin-transform-modules-amd": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.26.3",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.9",
+ "@babel/plugin-transform-modules-umd": "^7.25.9",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-new-target": "^7.25.9",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6",
+ "@babel/plugin-transform-numeric-separator": "^7.25.9",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.9",
+ "@babel/plugin-transform-object-super": "^7.25.9",
+ "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9",
+ "@babel/plugin-transform-private-methods": "^7.25.9",
+ "@babel/plugin-transform-private-property-in-object": "^7.25.9",
+ "@babel/plugin-transform-property-literals": "^7.25.9",
+ "@babel/plugin-transform-regenerator": "^7.25.9",
+ "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
+ "@babel/plugin-transform-reserved-words": "^7.25.9",
+ "@babel/plugin-transform-shorthand-properties": "^7.25.9",
+ "@babel/plugin-transform-spread": "^7.25.9",
+ "@babel/plugin-transform-sticky-regex": "^7.25.9",
+ "@babel/plugin-transform-template-literals": "^7.25.9",
+ "@babel/plugin-transform-typeof-symbol": "^7.26.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.25.9",
+ "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.38.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz",
+ "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-transform-react-display-name": "^7.25.9",
+ "@babel/plugin-transform-react-jsx": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-development": "^7.25.9",
+ "@babel/plugin-transform-react-pure-annotations": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz",
+ "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.9",
+ "@babel/plugin-transform-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz",
+ "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz",
+ "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.5",
+ "@babel/parser": "^7.26.7",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.7",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz",
+ "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "license": "MIT"
+ },
+ "node_modules/@csstools/normalize.css": {
+ "version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz",
+ "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/@csstools/postcss-cascade-layers": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz",
+ "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.2",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-color-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz",
+ "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-font-format-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz",
+ "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-hwb-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz",
+ "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-ic-unit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz",
+ "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz",
+ "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-nested-calc": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz",
+ "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-normalize-display-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz",
+ "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-oklab-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz",
+ "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-progressive-custom-properties": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz",
+ "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/@csstools/postcss-stepped-value-functions": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz",
+ "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-text-decoration-shorthand": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz",
+ "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-trigonometric-functions": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz",
+ "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-unset-value": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz",
+ "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz",
+ "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "node_modules/@emotion/babel-plugin": {
+ "version": "11.13.5",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
+ "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/serialize": "^1.3.3",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@emotion/cache": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
+ "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/sheet": "^1.4.0",
+ "@emotion/utils": "^1.4.2",
+ "@emotion/weak-memoize": "^0.4.0",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/hash": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
+ "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.8.1"
+ }
+ },
+ "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/react": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
+ "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.13.5",
+ "@emotion/cache": "^11.14.0",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+ "@emotion/utils": "^1.4.2",
+ "@emotion/weak-memoize": "^0.4.0",
+ "hoist-non-react-statics": "^3.3.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/serialize": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
+ "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/unitless": "^0.10.0",
+ "@emotion/utils": "^1.4.2",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@emotion/sheet": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
+ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/styled": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz",
+ "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.13.5",
+ "@emotion/is-prop-valid": "^1.3.0",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+ "@emotion/utils": "^1.4.2"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0-rc.0",
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/styled/node_modules/@emotion/is-prop-valid": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
+ "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0"
+ }
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
+ "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@emotion/utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
+ "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
+ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
+ "license": "MIT"
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/eslintrc/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==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@fortawesome/fontawesome-free": {
+ "version": "6.7.2",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz",
+ "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==",
+ "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@google/generative-ai": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.21.0.tgz",
+ "integrity": "sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "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==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
+ "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
+ "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/reporters": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^27.5.1",
+ "jest-config": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-resolve-dependencies": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "jest-watcher": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
+ "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
+ "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@sinonjs/fake-timers": "^8.0.1",
+ "@types/node": "*",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
+ "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "expect": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
+ "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^5.1.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-haste-map": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^4.0.1",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^8.1.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz",
+ "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.24.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
+ "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9",
+ "source-map": "^0.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/source-map/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
+ "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
+ "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-runtime": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
+ "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^27.5.1",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/@jest/transform/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "license": "MIT"
+ },
+ "node_modules/@mui/core-downloads-tracker": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.4.tgz",
+ "integrity": "sha512-r+J0EditrekkTtO2CnCBCOGpNaDYwJqz8lH4rj6o/anDcskZFJodBlG8aCJkS8DL/CF/9EHS+Gz53EbmYEnQbw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ }
+ },
+ "node_modules/@mui/icons-material": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.4.tgz",
+ "integrity": "sha512-uF1chGaoFmYdRUomK6f8kgJfWosk9A3HXWiVD0vQm+2mE7f25eTQ1E8RRO11LXpnUBqu8Rbv/uGlpnjT/u1Ksg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@mui/material": "^6.4.4",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/material": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.4.tgz",
+ "integrity": "sha512-ISVPrIsPQsxnwvS40C4u03AuNSPigFeS2+n1qpuEZ94hDsdMi19dQM2JcC9CHEhXecSIQjP1RTyY0mPiSpSrFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@mui/core-downloads-tracker": "^6.4.4",
+ "@mui/system": "^6.4.3",
+ "@mui/types": "^7.2.21",
+ "@mui/utils": "^6.4.3",
+ "@popperjs/core": "^2.11.8",
+ "@types/react-transition-group": "^4.4.12",
+ "clsx": "^2.1.1",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1",
+ "react-is": "^19.0.0",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@mui/material-pigment-css": "^6.4.3",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@mui/material-pigment-css": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/material/node_modules/react-is": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz",
+ "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==",
+ "license": "MIT"
+ },
+ "node_modules/@mui/private-theming": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.3.tgz",
+ "integrity": "sha512-7x9HaNwDCeoERc4BoEWLieuzKzXu5ZrhRnEM6AUcRXUScQLvF1NFkTlP59+IJfTbEMgcGg1wWHApyoqcksrBpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@mui/utils": "^6.4.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/styled-engine": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.3.tgz",
+ "integrity": "sha512-OC402VfK+ra2+f12Gef8maY7Y9n7B6CZcoQ9u7mIkh/7PKwW/xH81xwX+yW+Ak1zBT3HYcVjh2X82k5cKMFGoQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@emotion/cache": "^11.13.5",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/sheet": "^1.4.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.4.1",
+ "@emotion/styled": "^11.3.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/styled-engine-sc": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine-sc/-/styled-engine-sc-6.4.2.tgz",
+ "integrity": "sha512-BlLnlT358sEztMAZYd0lUU9okfzi9lr88hsjNCGjVE6qR3edQNGD6kOHk3n019HEXVTnmipivh+YGBGyK4D2ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@types/hoist-non-react-statics": "^3.3.6",
+ "csstype": "^3.1.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "styled-components": "^6.0.0"
+ }
+ },
+ "node_modules/@mui/system": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.3.tgz",
+ "integrity": "sha512-Q0iDwnH3+xoxQ0pqVbt8hFdzhq1g2XzzR4Y5pVcICTNtoCLJmpJS3vI4y/OIM1FHFmpfmiEC2IRIq7YcZ8nsmg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@mui/private-theming": "^6.4.3",
+ "@mui/styled-engine": "^6.4.3",
+ "@mui/types": "^7.2.21",
+ "@mui/utils": "^6.4.3",
+ "clsx": "^2.1.1",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/types": {
+ "version": "7.2.21",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz",
+ "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.3.tgz",
+ "integrity": "sha512-jxHRHh3BqVXE9ABxDm+Tc3wlBooYz/4XPa0+4AI+iF38rV1/+btJmSUgG4shDtSWVs/I97aDn5jBCt6SF2Uq2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0",
+ "@mui/types": "^7.2.21",
+ "@types/prop-types": "^15.7.14",
+ "clsx": "^2.1.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^19.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils/node_modules/react-is": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz",
+ "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==",
+ "license": "MIT"
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "license": "MIT",
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/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==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz",
+ "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-html": "^0.0.9",
+ "core-js-pure": "^3.23.3",
+ "error-stack-parser": "^2.0.6",
+ "html-entities": "^2.1.0",
+ "loader-utils": "^2.0.4",
+ "schema-utils": "^4.2.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "@types/webpack": "4.x || 5.x",
+ "react-refresh": ">=0.10.0 <1.0.0",
+ "sockjs-client": "^1.4.0",
+ "type-fest": ">=0.17.0 <5.0.0",
+ "webpack": ">=4.43.0 <6.0.0",
+ "webpack-dev-server": "3.x || 4.x || 5.x",
+ "webpack-hot-middleware": "2.x",
+ "webpack-plugin-serve": "0.x || 1.x"
+ },
+ "peerDependenciesMeta": {
+ "@types/webpack": {
+ "optional": true
+ },
+ "sockjs-client": {
+ "optional": true
+ },
+ "type-fest": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ },
+ "webpack-hot-middleware": {
+ "optional": true
+ },
+ "webpack-plugin-serve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rollup/plugin-babel": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
+ "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@rollup/pluginutils": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "@types/babel__core": "^7.1.9",
+ "rollup": "^1.20.0||^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/babel__core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "11.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
+ "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "@types/resolve": "1.17.1",
+ "builtin-modules": "^3.1.0",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-replace": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "magic-string": "^0.25.7"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0 || ^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "license": "MIT"
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz",
+ "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==",
+ "license": "MIT"
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.24.51",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
+ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
+ "license": "MIT"
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "1.8.6",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+ "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "node_modules/@surma/rollup-plugin-off-main-thread": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
+ "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "ejs": "^3.1.6",
+ "json5": "^2.2.0",
+ "magic-string": "^0.25.0",
+ "string.prototype.matchall": "^4.0.6"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
+ "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
+ "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
+ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
+ "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
+ "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
+ "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
+ "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/plugin-jsx": "^5.5.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
+ "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.12.6"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
+ "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@svgr/babel-preset": "^5.5.0",
+ "@svgr/hast-util-to-babel-ast": "^5.5.0",
+ "svg-parser": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
+ "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "deepmerge": "^4.2.2",
+ "svgo": "^1.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
+ "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.12.1",
+ "@babel/preset-env": "^7.12.1",
+ "@babel/preset-react": "^7.12.5",
+ "@svgr/core": "^5.5.0",
+ "@svgr/plugin-jsx": "^5.5.0",
+ "@svgr/plugin-svgo": "^5.5.0",
+ "loader-utils": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.5",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
+ "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
+ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
+ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.56.12",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
+ "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz",
+ "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
+ "version": "4.19.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz",
+ "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "node_modules/@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
+ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.15",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
+ "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.12.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz",
+ "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/node-forge": {
+ "version": "1.3.11",
+ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
+ "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/prettier": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/q": {
+ "version": "1.5.8",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz",
+ "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.18",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
+ "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "19.0.8",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz",
+ "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.12",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+ "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.8",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
+ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
+ "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.7",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+ "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
+ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/stylis": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
+ "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.14",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz",
+ "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "16.0.9",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
+ "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
+ "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/type-utils": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.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/experimental-utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz",
+ "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "5.62.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/parser": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz",
+ "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "@typescript-eslint/utils": "5.62.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
+ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/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==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "deprecated": "Use your platform's native atob() and btoa() methods instead",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
+ "node_modules/acorn-globals/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/adjust-sourcemap-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
+ "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "regex-parser": "^2.2.11"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-html": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz",
+ "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==",
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "license": "MIT"
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.reduce": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz",
+ "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "license": "MIT"
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "license": "MIT"
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
+ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
+ "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz",
+ "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^2.0.4",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 8.9"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/babel-loader/node_modules/schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
+ "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.0.0",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-named-asset-import": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz",
+ "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@babel/core": "^7.1.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
+ "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz",
+ "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-react-remove-prop-types": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
+ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==",
+ "license": "MIT"
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz",
+ "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
+ "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^27.5.1",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-react-app": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz",
+ "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
+ "@babel/plugin-proposal-decorators": "^7.16.4",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.0",
+ "@babel/plugin-proposal-private-methods": "^7.16.0",
+ "@babel/plugin-transform-flow-strip-types": "^7.16.0",
+ "@babel/plugin-transform-react-display-name": "^7.16.0",
+ "@babel/plugin-transform-runtime": "^7.16.4",
+ "@babel/preset-env": "^7.16.4",
+ "@babel/preset-react": "^7.16.0",
+ "@babel/preset-typescript": "^7.16.0",
+ "@babel/runtime": "^7.16.3",
+ "babel-plugin-macros": "^3.1.0",
+ "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "license": "MIT"
+ },
+ "node_modules/bfj": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz",
+ "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==",
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "^3.7.2",
+ "check-types": "^11.2.3",
+ "hoopy": "^0.1.4",
+ "jsonpath": "^1.1.1",
+ "tryer": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
+ "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "license": "MIT",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/camelize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
+ "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001696",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz",
+ "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/case-sensitive-paths-webpack-plugin": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
+ "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/check-types": {
+ "version": "11.2.3",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz",
+ "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==",
+ "license": "MIT"
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "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==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz",
+ "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
+ "license": "MIT"
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clean-css/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/coa": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/q": "^1.5.1",
+ "chalk": "^2.4.1",
+ "q": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/coa/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/coa/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/coa/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/coa/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "license": "MIT"
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "license": "MIT"
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz",
+ "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "license": "MIT"
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "license": "MIT"
+ },
+ "node_modules/core-js": {
+ "version": "3.40.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz",
+ "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.40.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz",
+ "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.24.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.40.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.40.0.tgz",
+ "integrity": "sha512-AtDzVIgRrmRKQai62yuSIN5vNiQjcJakJb4fbhVw3ehxx7Lohphvw9SGNWKhLFqSxC4ilD0g/L1huAYFQU3Q6A==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cra-template": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/cra-template/-/cra-template-1.2.0.tgz",
+ "integrity": "sha512-06WBUmTq79NvqU91Y9OPCXv/ENy/UkUmQS0lBrOYCl/4f4l67idnGbBARDGLopCHfff6pf6UftcFRWHg+CVfRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/css-blank-pseudo": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz",
+ "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "bin": {
+ "css-blank-pseudo": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-color-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
+ "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz",
+ "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-has-pseudo": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz",
+ "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "bin": {
+ "css-has-pseudo": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
+ "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.1.0",
+ "postcss-modules-local-by-default": "^4.0.5",
+ "postcss-modules-scope": "^3.2.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz",
+ "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano": "^5.0.6",
+ "jest-worker": "^27.0.2",
+ "postcss": "^8.3.5",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@parcel/css": {
+ "optional": true
+ },
+ "clean-css": {
+ "optional": true
+ },
+ "csso": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-prefers-color-scheme": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz",
+ "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==",
+ "license": "CC0-1.0",
+ "bin": {
+ "css-prefers-color-scheme": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-select-base-adapter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+ "license": "MIT"
+ },
+ "node_modules/css-to-react-native": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
+ "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "camelize": "^1.0.0",
+ "css-color-keywords": "^1.0.0",
+ "postcss-value-parser": "^4.0.2"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.0.0-alpha.37",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-tree/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssdb": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz",
+ "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ }
+ ],
+ "license": "CC0-1.0"
+ },
+ "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==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "5.1.15",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz",
+ "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-preset-default": "^5.2.14",
+ "lilconfig": "^2.0.3",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "5.2.14",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz",
+ "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==",
+ "license": "MIT",
+ "dependencies": {
+ "css-declaration-sorter": "^6.3.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-calc": "^8.2.3",
+ "postcss-colormin": "^5.3.1",
+ "postcss-convert-values": "^5.1.3",
+ "postcss-discard-comments": "^5.1.2",
+ "postcss-discard-duplicates": "^5.1.0",
+ "postcss-discard-empty": "^5.1.1",
+ "postcss-discard-overridden": "^5.1.0",
+ "postcss-merge-longhand": "^5.1.7",
+ "postcss-merge-rules": "^5.1.4",
+ "postcss-minify-font-values": "^5.1.0",
+ "postcss-minify-gradients": "^5.1.1",
+ "postcss-minify-params": "^5.1.4",
+ "postcss-minify-selectors": "^5.2.1",
+ "postcss-normalize-charset": "^5.1.0",
+ "postcss-normalize-display-values": "^5.1.0",
+ "postcss-normalize-positions": "^5.1.1",
+ "postcss-normalize-repeat-style": "^5.1.1",
+ "postcss-normalize-string": "^5.1.0",
+ "postcss-normalize-timing-functions": "^5.1.0",
+ "postcss-normalize-unicode": "^5.1.1",
+ "postcss-normalize-url": "^5.1.0",
+ "postcss-normalize-whitespace": "^5.1.1",
+ "postcss-ordered-values": "^5.1.3",
+ "postcss-reduce-initial": "^5.1.2",
+ "postcss-reduce-transforms": "^5.1.0",
+ "postcss-svgo": "^5.1.0",
+ "postcss-unique-selectors": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
+ "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/csso/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "license": "MIT"
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "license": "MIT",
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "license": "MIT"
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/data-urls": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.3",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz",
+ "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==",
+ "license": "MIT"
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
+ "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "license": "MIT"
+ },
+ "node_modules/detect-port-alt": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+ "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "address": "^1.0.1",
+ "debug": "^2.6.0"
+ },
+ "bin": {
+ "detect": "bin/detect-port",
+ "detect-port": "bin/detect-port"
+ },
+ "engines": {
+ "node": ">= 4.2.1"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "license": "MIT",
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domexception": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "license": "MIT",
+ "dependencies": {
+ "webidl-conversions": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domexception/node_modules/webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
+ "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "license": "MIT"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.88",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz",
+ "integrity": "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==",
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
+ "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz",
+ "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.9",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
+ "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.0",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-regex": "^1.2.1",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.0",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.3",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.18"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+ "license": "MIT"
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
+ "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "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.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "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.3",
+ "strip-ansi": "^6.0.1",
+ "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-react-app": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz",
+ "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/eslint-parser": "^7.16.3",
+ "@rushstack/eslint-patch": "^1.1.0",
+ "@typescript-eslint/eslint-plugin": "^5.5.0",
+ "@typescript-eslint/parser": "^5.5.0",
+ "babel-preset-react-app": "^10.0.1",
+ "confusing-browser-globals": "^1.0.11",
+ "eslint-plugin-flowtype": "^8.0.3",
+ "eslint-plugin-import": "^2.25.3",
+ "eslint-plugin-jest": "^25.3.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.27.1",
+ "eslint-plugin-react-hooks": "^4.3.0",
+ "eslint-plugin-testing-library": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-flowtype": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz",
+ "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "string-natural-compare": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@babel/plugin-syntax-flow": "^7.14.5",
+ "@babel/plugin-transform-react-jsx": "^7.14.9",
+ "eslint": "^8.1.0"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.31.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlastindex": "^1.2.5",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.0",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.15.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.0",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.8",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jest": {
+ "version": "25.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz",
+ "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/experimental-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "jest": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz",
+ "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-testing-library": {
+ "version": "5.11.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz",
+ "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==",
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "^5.58.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "eslint": "^7.5.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-webpack-plugin": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz",
+ "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "^7.29.0 || ^8.4.1",
+ "jest-worker": "^28.0.2",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/jest-worker": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz",
+ "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/eslint/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==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/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==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/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==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "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==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "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==",
+ "license": "ISC",
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastq": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
+ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/file-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/filesize": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
+ "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
+ "license": "MIT"
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
+ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "license": "ISC"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz",
+ "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz",
+ "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.8.3",
+ "@types/json-schema": "^7.0.5",
+ "chalk": "^4.1.0",
+ "chokidar": "^3.4.2",
+ "cosmiconfig": "^6.0.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^9.0.0",
+ "glob": "^7.1.6",
+ "memfs": "^3.1.2",
+ "minimatch": "^3.0.4",
+ "schema-utils": "2.7.0",
+ "semver": "^7.3.2",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "yarn": ">=1.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">= 6",
+ "typescript": ">= 2.7",
+ "vue-template-compiler": "*",
+ "webpack": ">= 4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+ "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "ajv": "^6.12.2",
+ "ajv-keywords": "^3.4.1"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz",
+ "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
+ "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
+ "license": "Unlicense"
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
+ "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.0",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+ "license": "ISC"
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "license": "MIT",
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "license": "MIT"
+ },
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "license": "MIT"
+ },
+ "node_modules/harmony-reflect": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
+ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==",
+ "license": "(Apache-2.0 OR MPL-1.1)"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz",
+ "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^6.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-object": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/hoopy": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/hpack.js/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-encoding": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz",
+ "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "license": "MIT"
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-url-attributes": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
+ "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz",
+ "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/html-webpack-plugin"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.20.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "license": "MIT"
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz",
+ "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==",
+ "license": "MIT"
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "license": "MIT",
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/idb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
+ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
+ "license": "ISC"
+ },
+ "node_modules/identity-obj-proxy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
+ "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==",
+ "license": "MIT",
+ "dependencies": {
+ "harmony-reflect": "^1.4.6"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "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==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "license": "ISC",
+ "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==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
+ "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==",
+ "license": "MIT"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz",
+ "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.0",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+ "license": "MIT"
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-root": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
+ "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "license": "MIT"
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz",
+ "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jake": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
+ "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz",
+ "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "import-local": "^3.0.2",
+ "jest-cli": "^27.5.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
+ "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "execa": "^5.0.0",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
+ "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^0.7.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
+ "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "import-local": "^3.0.2",
+ "jest-config": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "prompts": "^2.0.1",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
+ "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.8.0",
+ "@jest/test-sequencer": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "babel-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-jasmine2": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
+ "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
+ "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
+ "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jsdom": "^16.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
+ "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
+ "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/graceful-fs": "^4.1.2",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^27.5.1",
+ "jest-serializer": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.7"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-jasmine2": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
+ "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
+ "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
+ "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^1.1.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
+ "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-snapshot": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
+ "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-leak-detector": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "source-map-support": "^0.5.6",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
+ "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/globals": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "execa": "^5.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-serializer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
+ "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
+ "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.7.2",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/traverse": "^7.7.2",
+ "@babel/types": "^7.0.0",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/prettier": "^2.1.5",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^27.5.1",
+ "semver": "^7.3.2"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
+ "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "leven": "^3.1.0",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz",
+ "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.1",
+ "chalk": "^4.0.0",
+ "jest-regex-util": "^28.0.0",
+ "jest-watcher": "^28.0.0",
+ "slash": "^4.0.0",
+ "string-length": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "jest": "^27.0.0 || ^28.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/console": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz",
+ "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^28.1.3",
+ "jest-util": "^28.1.3",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz",
+ "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/types": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz",
+ "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@types/yargs": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+ "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/emittery": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz",
+ "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-message-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz",
+ "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^28.1.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^28.1.3",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": {
+ "version": "28.0.2",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz",
+ "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz",
+ "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz",
+ "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.10.2",
+ "jest-util": "^28.1.3",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/pretty-format": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz",
+ "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^28.1.3",
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/jest-watch-typeahead/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/string-length": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
+ "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^2.0.0",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz",
+ "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
+ "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "jest-util": "^27.5.1",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "16.7.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
+ "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.5",
+ "acorn": "^8.2.4",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.4.4",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^2.0.0",
+ "decimal.js": "^10.2.1",
+ "domexception": "^2.0.1",
+ "escodegen": "^2.0.0",
+ "form-data": "^3.0.0",
+ "html-encoding-sniffer": "^2.0.1",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^2.0.0",
+ "webidl-conversions": "^6.1.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.5.0",
+ "ws": "^7.4.6",
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonpath": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
+ "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
+ "license": "MIT",
+ "dependencies": {
+ "esprima": "1.2.2",
+ "static-eval": "2.0.2",
+ "underscore": "1.12.1"
+ }
+ },
+ "node_modules/jsonpath/node_modules/esprima": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
+ "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/launch-editor": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz",
+ "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==",
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.8.1"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "license": "MIT",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "license": "MIT"
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz",
+ "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
+ "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
+ "license": "Unlicense",
+ "dependencies": {
+ "fs-monkey": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz",
+ "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.4.tgz",
+ "integrity": "sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz",
+ "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz",
+ "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==",
+ "license": "MIT",
+ "dependencies": {
+ "schema-utils": "^4.0.0",
+ "tapable": "^2.2.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "license": "ISC"
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "license": "MIT",
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "license": "MIT"
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "license": "MIT"
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "license": "MIT"
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+ "license": "(BSD-3-Clause OR GPL-2.0)",
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.16",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz",
+ "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
+ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.getownpropertydescriptors": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz",
+ "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.reduce": "^1.0.6",
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "gopd": "^1.0.1",
+ "safe-array-concat": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "license": "MIT"
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "license": "MIT"
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "license": "MIT"
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
+ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
+ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz",
+ "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-browser-comments": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz",
+ "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": ">=8"
+ },
+ "peerDependencies": {
+ "browserslist": ">=4",
+ "postcss": ">=8"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
+ "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
+ }
+ },
+ "node_modules/postcss-clamp": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz",
+ "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=7.6.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.6"
+ }
+ },
+ "node_modules/postcss-color-functional-notation": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz",
+ "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-color-hex-alpha": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz",
+ "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-color-rebeccapurple": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz",
+ "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz",
+ "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz",
+ "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-custom-media": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz",
+ "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-custom-properties": {
+ "version": "12.1.11",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz",
+ "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-custom-selectors": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz",
+ "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz",
+ "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
+ "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
+ "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
+ "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
+ "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-double-position-gradients": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz",
+ "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-env-function": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz",
+ "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-flexbugs-fixes": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz",
+ "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.1.4"
+ }
+ },
+ "node_modules/postcss-focus-visible": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz",
+ "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-within": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz",
+ "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-font-variant": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
+ "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-gap-properties": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz",
+ "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-image-set-function": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz",
+ "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-initial": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
+ "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-lab-function": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz",
+ "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/yaml": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
+ "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
+ "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "klona": "^2.0.5",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/postcss-logical": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz",
+ "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-media-minmax": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz",
+ "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz",
+ "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz",
+ "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
+ "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
+ "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "colord": "^2.9.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz",
+ "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
+ "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz",
+ "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz",
+ "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "license": "ISC",
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-nesting": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz",
+ "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-normalize": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz",
+ "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/normalize.css": "*",
+ "postcss-browser-comments": "^4",
+ "sanitize.css": "*"
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4",
+ "postcss": ">= 8"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
+ "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
+ "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
+ "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
+ "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
+ "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
+ "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz",
+ "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
+ "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
+ "license": "MIT",
+ "dependencies": {
+ "normalize-url": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
+ "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-opacity-percentage": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz",
+ "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==",
+ "funding": [
+ {
+ "type": "kofi",
+ "url": "https://ko-fi.com/mrcgrtz"
+ },
+ {
+ "type": "liberapay",
+ "url": "https://liberapay.com/mrcgrtz"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
+ "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-overflow-shorthand": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz",
+ "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-page-break": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
+ "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8"
+ }
+ },
+ "node_modules/postcss-place": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz",
+ "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-preset-env": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz",
+ "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "@csstools/postcss-cascade-layers": "^1.1.1",
+ "@csstools/postcss-color-function": "^1.1.1",
+ "@csstools/postcss-font-format-keywords": "^1.0.1",
+ "@csstools/postcss-hwb-function": "^1.0.2",
+ "@csstools/postcss-ic-unit": "^1.0.1",
+ "@csstools/postcss-is-pseudo-class": "^2.0.7",
+ "@csstools/postcss-nested-calc": "^1.0.0",
+ "@csstools/postcss-normalize-display-values": "^1.0.1",
+ "@csstools/postcss-oklab-function": "^1.1.1",
+ "@csstools/postcss-progressive-custom-properties": "^1.3.0",
+ "@csstools/postcss-stepped-value-functions": "^1.0.1",
+ "@csstools/postcss-text-decoration-shorthand": "^1.0.0",
+ "@csstools/postcss-trigonometric-functions": "^1.0.2",
+ "@csstools/postcss-unset-value": "^1.0.2",
+ "autoprefixer": "^10.4.13",
+ "browserslist": "^4.21.4",
+ "css-blank-pseudo": "^3.0.3",
+ "css-has-pseudo": "^3.0.4",
+ "css-prefers-color-scheme": "^6.0.3",
+ "cssdb": "^7.1.0",
+ "postcss-attribute-case-insensitive": "^5.0.2",
+ "postcss-clamp": "^4.1.0",
+ "postcss-color-functional-notation": "^4.2.4",
+ "postcss-color-hex-alpha": "^8.0.4",
+ "postcss-color-rebeccapurple": "^7.1.1",
+ "postcss-custom-media": "^8.0.2",
+ "postcss-custom-properties": "^12.1.10",
+ "postcss-custom-selectors": "^6.0.3",
+ "postcss-dir-pseudo-class": "^6.0.5",
+ "postcss-double-position-gradients": "^3.1.2",
+ "postcss-env-function": "^4.0.6",
+ "postcss-focus-visible": "^6.0.4",
+ "postcss-focus-within": "^5.0.4",
+ "postcss-font-variant": "^5.0.0",
+ "postcss-gap-properties": "^3.0.5",
+ "postcss-image-set-function": "^4.0.7",
+ "postcss-initial": "^4.0.1",
+ "postcss-lab-function": "^4.2.1",
+ "postcss-logical": "^5.0.4",
+ "postcss-media-minmax": "^5.0.0",
+ "postcss-nesting": "^10.2.0",
+ "postcss-opacity-percentage": "^1.1.2",
+ "postcss-overflow-shorthand": "^3.0.4",
+ "postcss-page-break": "^3.0.4",
+ "postcss-place": "^7.0.5",
+ "postcss-pseudo-class-any-link": "^7.1.6",
+ "postcss-replace-overflow-wrap": "^4.0.0",
+ "postcss-selector-not": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz",
+ "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==",
+ "license": "CC0-1.0",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz",
+ "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
+ "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-replace-overflow-wrap": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
+ "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "postcss": "^8.0.3"
+ }
+ },
+ "node_modules/postcss-selector-not": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz",
+ "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
+ "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^2.7.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/postcss-svgo/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "license": "MIT",
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
+ "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
+ "node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "license": "MIT",
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/property-information": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz",
+ "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "license": "MIT"
+ },
+ "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==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "license": "MIT",
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
+ "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-app-polyfill": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz",
+ "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js": "^3.19.2",
+ "object-assign": "^4.1.1",
+ "promise": "^8.1.0",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.9",
+ "whatwg-fetch": "^3.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-app-polyfill/node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT"
+ },
+ "node_modules/react-dev-utils": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
+ "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.0",
+ "address": "^1.1.2",
+ "browserslist": "^4.18.1",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.3",
+ "detect-port-alt": "^1.1.6",
+ "escape-string-regexp": "^4.0.0",
+ "filesize": "^8.0.6",
+ "find-up": "^5.0.0",
+ "fork-ts-checker-webpack-plugin": "^6.5.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.0.4",
+ "gzip-size": "^6.0.0",
+ "immer": "^9.0.7",
+ "is-root": "^2.1.0",
+ "loader-utils": "^3.2.0",
+ "open": "^8.4.0",
+ "pkg-up": "^3.1.0",
+ "prompts": "^2.4.2",
+ "react-error-overlay": "^6.0.11",
+ "recursive-readdir": "^2.2.2",
+ "shell-quote": "^1.7.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/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==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/loader-utils": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
+ "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/react-dev-utils/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==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/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==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dev-utils/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==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
+ "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.25.0"
+ },
+ "peerDependencies": {
+ "react": "^19.0.0"
+ }
+ },
+ "node_modules/react-error-overlay": {
+ "version": "6.0.11",
+ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
+ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==",
+ "license": "MIT"
+ },
+ "node_modules/react-icons": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.4.0.tgz",
+ "integrity": "sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "license": "MIT"
+ },
+ "node_modules/react-markdown": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.3.tgz",
+ "integrity": "sha512-Yk7Z94dbgYTOrdk41Z74GoKA7rThnsbbqBTRYuxoe08qvfQ9tJVhmAKw6BJS/ZORG7kTy/s1QvYzSuaoBA1qfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "devlop": "^1.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "html-url-attributes": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "unified": "^11.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18",
+ "react": ">=18"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
+ "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.1.3.tgz",
+ "integrity": "sha512-EezYymLY6Guk/zLQ2vRA8WvdUhWFEj5fcE3RfWihhxXBW7+cd1LsIiA3lmx+KCmneAGQuyBv820o44L2+TtkSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/cookie": "^0.6.0",
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0",
+ "turbo-stream": "2.4.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.1.3.tgz",
+ "integrity": "sha512-qQGTE+77hleBzv9SIUIkGRvuFBQGagW+TQKy53UTZAO/3+YFNBYvRsNIZ1GT17yHbc63FylMOdS+m3oUriF1GA==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.1.3"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/react-router/node_modules/cookie": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
+ "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-scripts": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
+ "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
+ "@svgr/webpack": "^5.5.0",
+ "babel-jest": "^27.4.2",
+ "babel-loader": "^8.2.3",
+ "babel-plugin-named-asset-import": "^0.3.8",
+ "babel-preset-react-app": "^10.0.1",
+ "bfj": "^7.0.2",
+ "browserslist": "^4.18.1",
+ "camelcase": "^6.2.1",
+ "case-sensitive-paths-webpack-plugin": "^2.4.0",
+ "css-loader": "^6.5.1",
+ "css-minimizer-webpack-plugin": "^3.2.0",
+ "dotenv": "^10.0.0",
+ "dotenv-expand": "^5.1.0",
+ "eslint": "^8.3.0",
+ "eslint-config-react-app": "^7.0.1",
+ "eslint-webpack-plugin": "^3.1.1",
+ "file-loader": "^6.2.0",
+ "fs-extra": "^10.0.0",
+ "html-webpack-plugin": "^5.5.0",
+ "identity-obj-proxy": "^3.0.0",
+ "jest": "^27.4.3",
+ "jest-resolve": "^27.4.2",
+ "jest-watch-typeahead": "^1.0.0",
+ "mini-css-extract-plugin": "^2.4.5",
+ "postcss": "^8.4.4",
+ "postcss-flexbugs-fixes": "^5.0.2",
+ "postcss-loader": "^6.2.1",
+ "postcss-normalize": "^10.0.1",
+ "postcss-preset-env": "^7.0.1",
+ "prompts": "^2.4.2",
+ "react-app-polyfill": "^3.0.0",
+ "react-dev-utils": "^12.0.1",
+ "react-refresh": "^0.11.0",
+ "resolve": "^1.20.0",
+ "resolve-url-loader": "^4.0.0",
+ "sass-loader": "^12.3.0",
+ "semver": "^7.3.5",
+ "source-map-loader": "^3.0.0",
+ "style-loader": "^3.3.1",
+ "tailwindcss": "^3.0.2",
+ "terser-webpack-plugin": "^5.2.5",
+ "webpack": "^5.64.4",
+ "webpack-dev-server": "^4.6.0",
+ "webpack-manifest-plugin": "^4.0.2",
+ "workbox-webpack-plugin": "^6.4.1"
+ },
+ "bin": {
+ "react-scripts": "bin/react-scripts.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ },
+ "peerDependencies": {
+ "react": ">= 16",
+ "typescript": "^3.2.1 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/recursive-readdir": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "license": "MIT"
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regex-parser": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz",
+ "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==",
+ "license": "MIT"
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
+ "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.12.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
+ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz",
+ "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "license": "MIT"
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-url-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz",
+ "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==",
+ "license": "MIT",
+ "dependencies": {
+ "adjust-sourcemap-loader": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "loader-utils": "^2.0.0",
+ "postcss": "^7.0.35",
+ "source-map": "0.6.1"
+ },
+ "engines": {
+ "node": ">=8.9"
+ },
+ "peerDependencies": {
+ "rework": "1.0.1",
+ "rework-visit": "1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rework": {
+ "optional": true
+ },
+ "rework-visit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/resolve-url-loader/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-url-loader/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+ "license": "ISC"
+ },
+ "node_modules/resolve-url-loader/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/resolve-url-loader/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+ "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "license": "MIT",
+ "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==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.79.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
+ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
+ "license": "MIT",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup-plugin-terser": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+ "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "jest-worker": "^26.2.1",
+ "serialize-javascript": "^4.0.0",
+ "terser": "^5.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.0.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/sanitize.css": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz",
+ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/sass-loader": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
+ "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
+ "license": "MIT",
+ "dependencies": {
+ "klona": "^2.0.4",
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
+ "sass": "^1.3.0",
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "license": "ISC"
+ },
+ "node_modules/saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "license": "ISC",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
+ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
+ "license": "MIT"
+ },
+ "node_modules/schema-utils": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/schema-utils/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "license": "MIT"
+ },
+ "node_modules/selfsigned": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
+ "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node-forge": "^1.3.0",
+ "node-forge": "^1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
+ "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
+ "license": "MIT"
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
+ "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "license": "MIT"
+ },
+ "node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-loader": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz",
+ "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==",
+ "license": "MIT",
+ "dependencies": {
+ "abab": "^2.0.5",
+ "iconv-lite": "^0.6.3",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead",
+ "license": "MIT"
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
+ "license": "MIT"
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+ "license": "MIT"
+ },
+ "node_modules/static-eval": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz",
+ "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==",
+ "license": "MIT",
+ "dependencies": {
+ "escodegen": "^1.8.1"
+ }
+ },
+ "node_modules/static-eval/node_modules/escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/static-eval/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "license": "MIT",
+ "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"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-eval/node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-natural-compare": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
+ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==",
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
+ "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/style-loader": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz",
+ "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz",
+ "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.4"
+ }
+ },
+ "node_modules/styled-components": {
+ "version": "6.1.14",
+ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.14.tgz",
+ "integrity": "sha512-KtfwhU5jw7UoxdM0g6XU9VZQFV4do+KrM8idiVCH5h4v49W+3p3yMe0icYwJgZQZepa5DbH04Qv8P0/RdcLcgg==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/is-prop-valid": "1.2.2",
+ "@emotion/unitless": "0.8.1",
+ "@types/stylis": "4.2.5",
+ "css-to-react-native": "3.2.0",
+ "csstype": "3.1.3",
+ "postcss": "8.4.38",
+ "shallowequal": "1.1.0",
+ "stylis": "4.3.2",
+ "tslib": "2.6.2"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/styled-components"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0",
+ "react-dom": ">= 16.8.0"
+ }
+ },
+ "node_modules/styled-components/node_modules/@emotion/unitless": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
+ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==",
+ "license": "MIT"
+ },
+ "node_modules/styled-components/node_modules/postcss": {
+ "version": "8.4.38",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/styled-components/node_modules/stylis": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz",
+ "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==",
+ "license": "MIT"
+ },
+ "node_modules/styled-components/node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+ "license": "0BSD"
+ },
+ "node_modules/stylehacks": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz",
+ "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==",
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
+ "license": "MIT"
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/sucrase/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sucrase/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+ "license": "MIT"
+ },
+ "node_modules/svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "coa": "^2.0.2",
+ "css-select": "^2.0.0",
+ "css-select-base-adapter": "^0.1.1",
+ "css-tree": "1.0.0-alpha.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/svgo/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/svgo/node_modules/css-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "node_modules/svgo/node_modules/css-what": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/svgo/node_modules/dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/svgo/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/svgo/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/node_modules/nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "license": "MIT"
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.17",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.6.0",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.6",
+ "lilconfig": "^3.1.3",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.47",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.2",
+ "postcss-nested": "^6.2.0",
+ "postcss-selector-parser": "^6.1.2",
+ "resolve": "^1.22.8",
+ "sucrase": "^3.35.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tempy": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
+ "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tempy/node_modules/type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.37.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz",
+ "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.11",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz",
+ "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/throat": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+ "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
+ "license": "MIT"
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "license": "MIT"
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "license": "BSD-3-Clause"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/tryer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
+ "license": "MIT"
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/turbo-stream": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz",
+ "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==",
+ "license": "ISC"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "license": "MIT",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/underscore": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
+ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "license": "MIT"
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unified/node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "license": "MIT",
+ "dependencies": {
+ "crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
+ "license": "MIT"
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "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==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/util.promisify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.2",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+ "license": "MIT"
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
+ "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+ "license": "ISC",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/v8-to-istanbul/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
+ "license": "MIT",
+ "dependencies": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "license": "MIT",
+ "dependencies": {
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "license": "MIT",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "license": "MIT",
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/web-vitals": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz",
+ "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=10.4"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.97.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz",
+ "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.6",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.14.0",
+ "browserslist": "^4.24.0",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.1",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.2.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.10",
+ "watchpack": "^2.4.1",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
+ "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.3",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "4.15.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
+ "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/express": "^4.17.13",
+ "@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.5.5",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.0.11",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "default-gateway": "^6.0.3",
+ "express": "^4.17.3",
+ "graceful-fs": "^4.2.6",
+ "html-entities": "^2.3.2",
+ "http-proxy-middleware": "^2.0.3",
+ "ipaddr.js": "^2.0.1",
+ "launch-editor": "^2.6.0",
+ "open": "^8.0.9",
+ "p-retry": "^4.5.0",
+ "rimraf": "^3.0.2",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.1.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^5.3.4",
+ "ws": "^8.13.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.37.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-manifest-plugin": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz",
+ "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==",
+ "license": "MIT",
+ "dependencies": {
+ "tapable": "^2.0.0",
+ "webpack-sources": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.44.2 || ^5.47.0"
+ }
+ },
+ "node_modules/webpack-manifest-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
+ "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
+ "license": "MIT",
+ "dependencies": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/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==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/webpack/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.20",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
+ "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-url": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.1.0",
+ "webidl-conversions": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz",
+ "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workbox-background-sync": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz",
+ "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==",
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-broadcast-update": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz",
+ "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-build": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz",
+ "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@apideck/better-ajv-errors": "^0.3.1",
+ "@babel/core": "^7.11.1",
+ "@babel/preset-env": "^7.11.0",
+ "@babel/runtime": "^7.11.2",
+ "@rollup/plugin-babel": "^5.2.0",
+ "@rollup/plugin-node-resolve": "^11.2.1",
+ "@rollup/plugin-replace": "^2.4.1",
+ "@surma/rollup-plugin-off-main-thread": "^2.2.3",
+ "ajv": "^8.6.0",
+ "common-tags": "^1.8.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "fs-extra": "^9.0.1",
+ "glob": "^7.1.6",
+ "lodash": "^4.17.20",
+ "pretty-bytes": "^5.3.0",
+ "rollup": "^2.43.1",
+ "rollup-plugin-terser": "^7.0.0",
+ "source-map": "^0.8.0-beta.0",
+ "stringify-object": "^3.3.0",
+ "strip-comments": "^2.0.1",
+ "tempy": "^0.6.0",
+ "upath": "^1.2.0",
+ "workbox-background-sync": "6.6.0",
+ "workbox-broadcast-update": "6.6.0",
+ "workbox-cacheable-response": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-expiration": "6.6.0",
+ "workbox-google-analytics": "6.6.0",
+ "workbox-navigation-preload": "6.6.0",
+ "workbox-precaching": "6.6.0",
+ "workbox-range-requests": "6.6.0",
+ "workbox-recipes": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0",
+ "workbox-streams": "6.6.0",
+ "workbox-sw": "6.6.0",
+ "workbox-window": "6.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
+ "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
+ "license": "MIT",
+ "dependencies": {
+ "json-schema": "^0.4.0",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "ajv": ">=8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/workbox-build/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/workbox-build/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-build/node_modules/source-map": {
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/workbox-build/node_modules/whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/workbox-cacheable-response": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz",
+ "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==",
+ "deprecated": "workbox-background-sync@6.6.0",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-core": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz",
+ "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-expiration": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz",
+ "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==",
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-google-analytics": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz",
+ "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==",
+ "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-background-sync": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-navigation-preload": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz",
+ "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-precaching": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz",
+ "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-range-requests": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz",
+ "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-recipes": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz",
+ "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-cacheable-response": "6.6.0",
+ "workbox-core": "6.6.0",
+ "workbox-expiration": "6.6.0",
+ "workbox-precaching": "6.6.0",
+ "workbox-routing": "6.6.0",
+ "workbox-strategies": "6.6.0"
+ }
+ },
+ "node_modules/workbox-routing": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz",
+ "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-strategies": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz",
+ "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/workbox-streams": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz",
+ "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "6.6.0",
+ "workbox-routing": "6.6.0"
+ }
+ },
+ "node_modules/workbox-sw": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz",
+ "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-webpack-plugin": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz",
+ "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-json-stable-stringify": "^2.1.0",
+ "pretty-bytes": "^5.4.1",
+ "upath": "^1.2.0",
+ "webpack-sources": "^1.4.3",
+ "workbox-build": "6.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.4.0 || ^5.9.0"
+ }
+ },
+ "node_modules/workbox-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/workbox-window": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz",
+ "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2",
+ "workbox-core": "6.6.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "license": "MIT"
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..c718758fa8f80a43b8d7febe240a74444d059ef9
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "hemang",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "@emotion/react": "^11.14.0",
+ "@emotion/styled": "^11.14.0",
+ "@fortawesome/fontawesome-free": "^6.7.2",
+ "@google/generative-ai": "^0.21.0",
+ "@mui/icons-material": "^6.4.4",
+ "@mui/material": "^6.4.3",
+ "@mui/styled-engine-sc": "^6.4.2",
+ "cra-template": "1.2.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-icons": "^5.4.0",
+ "react-markdown": "^9.0.3",
+ "react-router-dom": "^7.1.3",
+ "react-scripts": "5.0.1",
+ "styled-components": "^6.1.14",
+ "web-vitals": "^4.2.4"
+ },
+ "scripts": {
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject"
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app",
+ "react-app/jest"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ }
+}
diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a
Binary files /dev/null and b/frontend/public/favicon.ico differ
diff --git a/frontend/public/index.html b/frontend/public/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..aa069f27cbd9d53394428171c3989fd03db73c76
--- /dev/null
+++ b/frontend/public/index.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ React App
+
+
+ You need to enable JavaScript to run this app.
+
+
+
+
diff --git a/frontend/public/logo192.png b/frontend/public/logo192.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9
Binary files /dev/null and b/frontend/public/logo192.png differ
diff --git a/frontend/public/logo512.png b/frontend/public/logo512.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4e47a6545bc15971f8f63fba70e4013df88a664
Binary files /dev/null and b/frontend/public/logo512.png differ
diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json
new file mode 100644
index 0000000000000000000000000000000000000000..080d6c77ac21bb2ef88a6992b2b73ad93daaca92
--- /dev/null
+++ b/frontend/public/manifest.json
@@ -0,0 +1,25 @@
+{
+ "short_name": "React App",
+ "name": "Create React App Sample",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "logo192.png",
+ "type": "image/png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "logo512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e9e57dc4d41b9b46e05112e9f45b7ea6ac0ba15e
--- /dev/null
+++ b/frontend/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/frontend/src/App.css b/frontend/src/App.css
new file mode 100644
index 0000000000000000000000000000000000000000..1a73d2a86bcd6988442ff3710a25d13374db726c
--- /dev/null
+++ b/frontend/src/App.css
@@ -0,0 +1,40 @@
+.App {
+ text-align: center;
+}
+
+.App-logo {
+ height: 6vmin;
+ pointer-events: auto;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ .App-logo {
+ animation: App-logo-spin infinite 18s linear;
+ }
+}
+
+.App-header {
+ background: #190e10; /* Deep, dark maroon base */
+ color: #F5E6E8; /* Soft off-white for contrast */
+
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ font-size: calc(5px + 2vmin);
+
+}
+
+.App-link {
+ color: #61dafb;
+}
+
+@keyframes App-logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
diff --git a/frontend/src/App.js b/frontend/src/App.js
new file mode 100644
index 0000000000000000000000000000000000000000..96eef65e235d69f5b4bcc3df8ddfa0506cb2e6a9
--- /dev/null
+++ b/frontend/src/App.js
@@ -0,0 +1,64 @@
+import React, { useState, useEffect } from 'react';
+import { BrowserRouter, Routes, Route } from 'react-router-dom';
+import CircularProgress from '@mui/material/CircularProgress';
+import logo from './Icons/settings-2.svg';
+import './App.css';
+import IntialSetting from './Components/IntialSetting.js';
+import AiPage from './Components/AiPage.js';
+
+function App() {
+ return (
+
+
+ } />
+ } />
+
+
+ );
+}
+
+function Home() {
+ const [showSettings, setShowSettings] = useState(false);
+ const [initializing, setInitializing] = useState(false);
+
+ // This callback is passed to IntialSetting and called when the user clicks Save.
+ // It changes the underlying header content to the initializing state.
+ const handleInitializationStart = () => {
+ setInitializing(true);
+ };
+
+ return (
+
+ );
+}
+
+export default App;
diff --git a/frontend/src/App.test.js b/frontend/src/App.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..1f03afeece5ac28064fa3c73a29215037465f789
--- /dev/null
+++ b/frontend/src/App.test.js
@@ -0,0 +1,8 @@
+import { render, screen } from '@testing-library/react';
+import App from './App';
+
+test('renders learn react link', () => {
+ render( );
+ const linkElement = screen.getByText(/learn react/i);
+ expect(linkElement).toBeInTheDocument();
+});
diff --git a/frontend/src/Components/AiComponents/ChatWindow.css b/frontend/src/Components/AiComponents/ChatWindow.css
new file mode 100644
index 0000000000000000000000000000000000000000..7000f3b6f6f546837d9fb63fcfe1fb6a891fbb6f
--- /dev/null
+++ b/frontend/src/Components/AiComponents/ChatWindow.css
@@ -0,0 +1,278 @@
+:root {
+ --dark-surface: #190e10; /* Deep, dark maroon base */
+ --primary-color: #2b2b2b; /* A dark gray for sidebars and buttons */
+ --secondary-color: #03dac6; /* A cool teal for accents */
+ --accent-color: #aaabb9; /* A warm accent for highlights and borders */
+ --text-color: #e0e0e0; /* Off-white text */
+ --hover-bg: #3a3a3a; /* Slightly lighter for hover effects */
+ --transition-speed: 0.3s;
+}
+
+/* Error message container */
+.error-block {
+ background-color: #f25e5ecb;
+ color: var(--text-color);
+ padding: 0.1rem 1rem;
+ border-radius: 0.3rem;
+ margin: 2rem 0;
+ text-align: left;
+}
+
+/* Container for the messages */
+.answer-container {
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+ padding: 1rem;
+ min-width: 800px;
+}
+
+.answer-block {
+ position: relative;
+ padding-left: 45px;
+}
+
+/* Common message row styling */
+.message-row {
+ display: flex;
+ align-items: flex-start;
+}
+
+/* ----------------- User Message Styling ----------------- */
+/* User message row: bubble on the left, icon on the right */
+.user-message {
+ justify-content: flex-end;
+}
+
+.user-message .message-bubble {
+ background-color: #FF8C00;
+ color: #ffffff;
+ border-radius: 0.35rem;
+ padding: 0.5rem 1rem;
+ max-width: 70%;
+ text-align: left;
+}
+
+.user-message .user-icon {
+ margin-left: 0.5rem;
+}
+
+.sources-read {
+ font-weight: bold;
+}
+
+/* ----------------- Bot Message Styling ----------------- */
+/* Bot message row */
+.bot-icon {
+ position: absolute;
+ left: 0;
+ top: 0.25rem;
+}
+
+.bot-message {
+ justify-content: flex-start;
+}
+
+.bot-message .bot-icon {
+ margin: 0;
+}
+
+
+/* Container for the bot bubble and its post-icons */
+.bot-container {
+ display: flex;
+ flex-direction: column;
+ gap: 0rem;
+}
+
+.bot-answer-container {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+/* Bot message bubble styling */
+.bot-container .message-bubble {
+ background-color: none;
+ color: var(--text-color);
+ padding: 0.25rem 1.15rem 1rem 0.1rem;
+ max-width: 97%;
+ text-align: left;
+}
+
+/* ----------------- Additional Styling ----------------- */
+
+/* Styling for the "Thought and searched for..." line */
+.thinking-info {
+ font-size: large;
+ font-style: italic;
+ color: var(--accent-color);
+ margin-bottom: 1.3rem;
+ margin-left: 3rem;
+}
+
+.sources-read {
+ font-weight: bold;
+ color: var(--text-color);
+ margin-bottom: 1rem;
+ margin-left: 3rem;
+}
+
+/* Styling for the answer text */
+.answer {
+ margin: 0;
+ line-height: 1.85;
+}
+
+.markdown {
+ margin: -1rem 0 -0.8rem 0;
+ line-height: 2rem;
+}
+
+/* Post-answer icons container: placed below the bot bubble */
+.post-icons {
+ display: flex;
+ padding-left: 0.12rem;
+ gap: 1rem;
+}
+
+/* Make each post icon container position relative for tooltip positioning */
+.post-icons .copy-icon,
+.post-icons .evaluate-icon,
+.post-icons .sources-icon,
+.post-icons .graph-icon {
+ cursor: pointer;
+ position: relative;
+}
+
+/* Apply a brightness filter to the icon images on hover */
+.post-icons .copy-icon img,
+.post-icons .evaluate-icon img,
+.post-icons .sources-icon img,
+.post-icons .graph-icon img {
+ transition: filter var(--transition-speed);
+}
+
+.post-icons .copy-icon:hover img,
+.post-icons .evaluate-icon:hover img,
+.post-icons .sources-icon:hover img,
+.post-icons .graph-icon:hover img {
+ filter: brightness(0.65);
+}
+
+/* .post-icons .copy-icon:active img,
+.post-icons .evaluate-icon:active img,
+.post-icons .sources-icon:active img,
+.post-icons .graph-icon:active img {
+ filter: brightness(0.35);
+} */
+
+/* Tooltip styling */
+.tooltip {
+ position: absolute;
+ bottom: 100%;
+ left: 50%;
+ transform: translateX(-50%) translateY(10px) scale(0.9);
+ transform-origin: bottom center;
+ margin-bottom: 0.65rem;
+ padding: 0.3rem 0.6rem;
+ background-color: var(--primary-color);
+ color: var(--text-color);
+ border-radius: 0.25rem;
+ white-space: nowrap;
+ font-size: 0.85rem;
+ opacity: 0;
+ visibility: hidden;
+ transition: transform 0.3s ease, opacity 0.3s ease;
+}
+
+/* Show the tooltip on hover */
+.post-icons .copy-icon:hover .tooltip,
+.post-icons .evaluate-icon:hover .tooltip,
+.post-icons .sources-icon:hover .tooltip,
+.post-icons .graph-icon:hover .tooltip {
+ opacity: 1;
+ visibility: visible;
+ transform: translateX(-50%) translateY(0) scale(1);
+}
+
+/* Styling for the question text */
+.question {
+ margin: 0;
+ white-space: pre-wrap;
+ line-height: 1.4;
+}
+
+/* Reduce the size of user and bot icons */
+.user-icon img,
+.bot-icon img {
+ width: 35px;
+ height: 35px;
+ object-fit: contain;
+}
+
+/* Reduce the size of the post-action icons */
+.post-icons img {
+ width: 20px;
+ height: 20px;
+ object-fit: contain;
+}
+
+/* ChatWindow.css */
+
+/* Container for the loading state with a dark background */
+.bot-loading {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ gap: 10px; /* adds space between the spinner and the text */
+ padding: 30px;
+ background-color: var(--dark-surface); /* Dark background */
+}
+
+.loading-text {
+ margin: 0; /* removes any default margins */
+ font-size: 1rem;
+ color: #ccc;
+}
+
+/* Finished state: styling for the thought time info */
+.thinking-info {
+ margin-bottom: 4px;
+}
+
+.thinking-time {
+ font-size: 1rem;
+ color: #888;
+ cursor: pointer;
+}
+
+/* Snackbar styling */
+.custom-snackbar {
+ background-color: #1488e7 !important;
+ color: var(--text-color) !important;
+ padding: 0.35rem 1rem !important;
+ border-radius: 4px !important;
+}
+
+/* Spinner styling */
+.custom-spinner {
+ width: 1.35rem !important;
+ height: 1.35rem !important;
+ border: 3px solid #3b7bdc !important; /* Main Spinner */
+ border-top: 3px solid #434343 !important; /* Rotating path */
+ border-radius: 50% !important;
+ margin-top: 0.1rem !important;
+ animation: spin 0.9s linear infinite !important;
+}
+
+/* Spinner animation */
+@keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
diff --git a/frontend/src/Components/AiComponents/ChatWindow.js b/frontend/src/Components/AiComponents/ChatWindow.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8179ef3193a07373cc73037c4aebfe3bb258fb2
--- /dev/null
+++ b/frontend/src/Components/AiComponents/ChatWindow.js
@@ -0,0 +1,259 @@
+import React, { useRef, useEffect, useState } from 'react';
+import Box from '@mui/material/Box';
+import Snackbar from '@mui/material/Snackbar';
+import Slide from '@mui/material/Slide';
+import IconButton from '@mui/material/IconButton';
+import { FaTimes } from 'react-icons/fa';
+import ReactMarkdown from 'react-markdown';
+import GraphDialog from './Graph';
+import './ChatWindow.css';
+
+import bot from '../../Icons/bot.png';
+import copy from '../../Icons/copy.png';
+import evaluate from '../../Icons/evaluate.png';
+import sourcesIcon from '../../Icons/sources.png';
+import graphIcon from '../../Icons/graph.png';
+import user from '../../Icons/user.png';
+
+// SlideTransition function for both entry and exit transitions.
+function SlideTransition(props) {
+ return ;
+}
+
+function ChatWindow({
+ blockId,
+ userMessage,
+ aiAnswer,
+ thinkingTime,
+ thoughtLabel,
+ sourcesRead,
+ actions,
+ tasks,
+ openRightSidebar,
+ // openLeftSidebar,
+ isError,
+ errorMessage
+}) {
+ const answerRef = useRef(null);
+ const [graphDialogOpen, setGraphDialogOpen] = useState(false);
+ const [snackbarOpen, setSnackbarOpen] = useState(false);
+
+ // Get the graph action from the actions prop.
+ const graphAction = actions && actions.find(a => a.name === "graph");
+
+ // Handler for copying answer to clipboard.
+ const handleCopy = () => {
+ if (answerRef.current) {
+ const textToCopy = answerRef.current.innerText || answerRef.current.textContent;
+ navigator.clipboard.writeText(textToCopy)
+ .then(() => {
+ console.log('Copied to clipboard:', textToCopy);
+ setSnackbarOpen(true);
+ })
+ .catch((err) => console.error('Failed to copy text:', err));
+ }
+ };
+
+ // Snackbar close handler
+ const handleSnackbarClose = (event, reason) => {
+ if (reason === 'clickaway') return;
+ setSnackbarOpen(false);
+ };
+
+ // Determine if any tokens (partial or full answer) have been received.
+ const hasTokens = aiAnswer && aiAnswer.length > 0;
+ // Assume streaming is in progress if thinkingTime is not set.
+ const isStreaming = thinkingTime === null || thinkingTime === undefined;
+ // Append a trailing cursor if streaming.
+ const displayAnswer = hasTokens ? (isStreaming ? aiAnswer + "▌" : aiAnswer) : "";
+
+ // Helper to render the thought label.
+ const renderThoughtLabel = () => {
+ if (!hasTokens) {
+ return thoughtLabel;
+ } else {
+ if (thoughtLabel && thoughtLabel.startsWith("Thought and searched for")) {
+ return thoughtLabel;
+ }
+ return null;
+ }
+ };
+
+ // Helper to render sources read.
+ const renderSourcesRead = () => {
+ if (!sourcesRead && sourcesRead !== 0) return null;
+ return sourcesRead;
+ };
+
+ // When tasks first appear, automatically open the sidebar.
+ const prevTasksRef = useRef(tasks);
+ useEffect(() => {
+ if (prevTasksRef.current.length === 0 && tasks && tasks.length > 0) {
+ openRightSidebar("tasks", blockId);
+ }
+ prevTasksRef.current = tasks;
+ }, [tasks, blockId, openRightSidebar]);
+
+ return (
+ <>
+ { !hasTokens ? (
+ // If no tokens, render pre-stream UI.
+ (!isError && thoughtLabel) ? (
+
+ {/* User Message */}
+
+
+
+
+
+
+ {/* Bot Message (pre-stream with spinner) */}
+
+
+
+
+
+
+ openRightSidebar("tasks", blockId)}
+ >
+ {thoughtLabel}
+
+
+
+
+
+
+
+ ) : (
+ // Render without spinner (user message only)
+
+
+
+
+
+
+
+
+ )
+ ) : (
+ // Render Full Chat Message
+
+ {/* User Message */}
+
+
+
+
+
+
+ {/* Bot Message */}
+
+
+ {!isError && renderThoughtLabel() && (
+
+ openRightSidebar("tasks", blockId)}
+ >
+ {renderThoughtLabel()}
+
+
+ )}
+ {renderSourcesRead() !== null && (
+
+
openRightSidebar("sources", blockId)}
+ >
+ Sources Read: {renderSourcesRead()}
+
+
+ )}
+
+
+
+
+
+
+
+ {displayAnswer}
+
+
+
+
+ {!isStreaming && (
+
+
+
Copy
+
+ )}
+ {actions && actions.some(a => a.name === "evaluate") && (
+
openRightSidebar("evaluate", blockId)}>
+
+
Evaluate
+
+ )}
+ {actions && actions.some(a => a.name === "sources") && (
+
openRightSidebar("sources", blockId)}>
+
+
Sources
+
+ )}
+ {actions && actions.some(a => a.name === "graph") && (
+
setGraphDialogOpen(true)}>
+
+
View Graph
+
+ )}
+
+
+
+
+ {/* Render the GraphDialog when graphDialogOpen is true */}
+ {graphDialogOpen && (
+
setGraphDialogOpen(false)}
+ payload={graphAction ? graphAction.payload : { query: userMessage }}
+ />
+ )}
+
+ )}
+ {/* Render error container if there's an error */}
+ {isError && (
+
+
Error
+
{errorMessage}
+
+ )}
+
+
+
+ }
+ />
+ >
+ );
+}
+
+export default ChatWindow;
\ No newline at end of file
diff --git a/frontend/src/Components/AiComponents/Evaluate.css b/frontend/src/Components/AiComponents/Evaluate.css
new file mode 100644
index 0000000000000000000000000000000000000000..185b7da688cb83cc2b36d3559e5a11270d7fd1f8
--- /dev/null
+++ b/frontend/src/Components/AiComponents/Evaluate.css
@@ -0,0 +1,107 @@
+/* Container for the Evaluate component */
+.evaluate-container {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ padding: 16px;
+}
+
+/* Form Control */
+.evaluate-form-control {
+ width: 100%;
+}
+
+/* Input label */
+.evaluate-form-control .MuiInputLabel-root {
+ color: #26a8dc !important;
+}
+.evaluate-form-control .MuiInputLabel-root.Mui-focused {
+ color: #26a8dc !important;
+}
+
+/* Dropdown arrow icon */
+.evaluate-form-control .MuiSelect-icon {
+ color: #26a8dc !important;
+}
+
+/* Select’s OutlinedInput */
+.evaluate-outlined-input {
+ background-color: transparent !important;
+ color: #26a8dc !important;
+}
+
+/* Override the default notched outline to have a #ddd border */
+.evaluate-outlined-input .MuiOutlinedInput-notchedOutline {
+ border-color: #26a8dc !important;
+}
+
+/* Container for the rendered chips */
+.chip-container {
+ display: flex !important;
+ flex-wrap: wrap !important;
+ gap: 0.65rem !important;
+}
+
+/* Chips */
+.evaluate-chip {
+ background-color: #b70303 !important;
+ color: #fff !important;
+ border-radius: 0.5rem !important;
+}
+
+/* Remove background from chip close button and make its icon #ddd */
+.evaluate-chip .MuiChip-deleteIcon {
+ background: none !important;
+ color: #ddd !important;
+}
+
+/* Styling for the dropdown menu */
+.evaluate-menu {
+ background-color: #2b2b2b !important;
+ border: 0.01rem solid #26a8dc !important;
+ color: #ddd !important;
+}
+
+/* Dropdown menu item hover effect: lighter shade */
+.evaluate-menu .MuiMenuItem-root:hover {
+ background-color: #3b3b3b !important;
+}
+
+/* Dropdown menu item selected effect */
+.evaluate-menu .MuiMenuItem-root.Mui-selected {
+ background-color: #4b4b4b !important;
+}
+
+/* Evaluate button styling */
+.evaluate-button {
+ background-color: #FFC300 !important;
+ color: #2b2b2b !important;
+ width: auto !important;
+ padding: 6px 16px !important;
+ align-self: flex-start !important;
+}
+
+.evaluate-button:hover {
+ background-color: #b07508 !important;
+ color: #ddd !important;
+}
+
+/* Spinner styling */
+.custom-spinner {
+ width: 1.35rem;
+ height: 1.35rem;
+ border: 3px solid #3b7bdc; /* Main Spinner */
+ border-top: 3px solid #434343; /* Rotating path */
+ border-radius: 50%;
+ animation: spin 0.9s linear infinite;
+}
+
+/* Spinner animation */
+@keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/Components/AiComponents/Evaluate.js b/frontend/src/Components/AiComponents/Evaluate.js
new file mode 100644
index 0000000000000000000000000000000000000000..61399b820407b60552e2d9cf91f4fa9bee3ecc99
--- /dev/null
+++ b/frontend/src/Components/AiComponents/Evaluate.js
@@ -0,0 +1,213 @@
+import * as React from 'react';
+import ReactMarkdown from 'react-markdown';
+import { useTheme } from '@mui/material/styles';
+import Box from '@mui/material/Box';
+import OutlinedInput from '@mui/material/OutlinedInput';
+import InputLabel from '@mui/material/InputLabel';
+import MenuItem from '@mui/material/MenuItem';
+import FormControl from '@mui/material/FormControl';
+import Select from '@mui/material/Select';
+import Chip from '@mui/material/Chip';
+import Button from '@mui/material/Button';
+import Typography from '@mui/material/Typography';
+import './Evaluate.css';
+
+const MenuProps = {
+ PaperProps: {
+ className: 'evaluate-menu',
+ },
+};
+
+const names = [
+ "Bias",
+ "Toxicity",
+ "Answer Correctness",
+ "Summarization",
+ "Faithfulness",
+ "Hallucination",
+ "Answer Relevancy",
+ "Contextual Relevancy",
+ "Contextual Recall"
+];
+
+function getStyles(name, selectedNames, theme) {
+ return {
+ fontWeight: selectedNames.includes(name.toLowerCase())
+ ? theme.typography.fontWeightMedium
+ : theme.typography.fontWeightRegular,
+ };
+}
+
+export default function MultipleSelectChip({ evaluation }) {
+ const theme = useTheme();
+ const [personName, setPersonName] = React.useState([]);
+ const [selectedMetrics, setSelectedMetrics] = React.useState([]);
+ const [evaluationResult, setEvaluationResult] = React.useState("");
+ const [isEvaluating, setIsEvaluating] = React.useState(false);
+ const [localLoading, setLocalLoading] = React.useState(false);
+
+ // Reset the form fields
+ React.useEffect(() => {
+ // Reset the form and evaluation result
+ setPersonName([]);
+ setSelectedMetrics([]);
+ setEvaluationResult("");
+ setLocalLoading(true);
+
+ // Simulate a loading delay
+ const timer = setTimeout(() => {
+ setLocalLoading(false);
+ }, 500);
+ return () => clearTimeout(timer);
+ }, [evaluation]);
+
+ const handleChange = (event) => {
+ const { target: { value } } = event;
+ const metrics = typeof value === 'string' ? value.split(',') : value;
+ setPersonName(metrics);
+ setSelectedMetrics(metrics);
+ };
+
+ const handleDelete = (chipToDelete) => {
+ setPersonName((chips) => chips.filter((chip) => chip !== chipToDelete));
+ };
+
+ // Function to convert a string to title case.
+ const titleCase = (str) => {
+ return str
+ .split(' ')
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
+ .join(' ');
+ };
+
+ const handleEvaluateClick = async () => {
+ // Clear previous evaluation result immediately.
+ setEvaluationResult("");
+ setIsEvaluating(true);
+
+ const payload = { ...evaluation, metrics: selectedMetrics };
+ try {
+ const res = await fetch("http://127.0.0.1:8000/action/evaluate", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(payload),
+ });
+ if (!res.ok) {
+ const error = await res.json();
+ throw new Error(`Evaluation Error: ${error.error}`);
+ }
+
+ const data = await res.json();
+ if (!data.result) {
+ throw new Error("No results returned from evaluation");
+ }
+
+ // Format the JSON into Markdown.
+ let markdown = "### Result\n\n";
+ for (const [metric, details] of Object.entries(data.result)) {
+ let score = details.score;
+ if (typeof score === "number") {
+ const percentage = score * 100;
+ score = Number.isInteger(percentage)
+ ? percentage.toFixed(0) + "%"
+ : percentage.toFixed(2) + "%";
+ }
+ let reason = details.reason;
+ markdown += `**${titleCase(metric)}:** ${score}\n\n${reason}\n\n`;
+ }
+ setEvaluationResult(markdown);
+ } catch (err) {
+ // Use the callback to trigger the error block in ChatWindow
+ if (evaluation.onError && evaluation.blockId) {
+ evaluation.onError(evaluation.blockId, err.message || "Evaluation failed");
+ }
+ else {
+ console.error("Evaluation prop is missing or incomplete:", evaluation);
+ }
+ }
+ setIsEvaluating(false);
+ };
+
+ // Finds the matching display name for a metric.
+ const getDisplayName = (lowerValue) => {
+ const found = names.find(n => n.toLowerCase() === lowerValue);
+ return found ? found : lowerValue;
+ };
+
+ return (
+
+ {localLoading ? (
+
+ Loading Evaluation...
+
+ ) : (
+ <>
+
+ Select Metrics
+
+ }
+ renderValue={(selected) => (
+
+ {selected.map((value) => (
+ handleDelete(value)}
+ onMouseDown={(event) => event.stopPropagation()}
+ />
+ ))}
+
+ )}
+ MenuProps={MenuProps}
+ >
+ {names.map((name) => (
+
+ {name}
+
+ ))}
+
+
+
+
+
+ Evaluate
+
+
+
+ {isEvaluating && (
+
+
+ Evaluating...
+
+ )}
+
+ {evaluationResult && (
+
+ {evaluationResult}
+
+ )}
+ >
+ )}
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/Components/AiComponents/FormSection.js b/frontend/src/Components/AiComponents/FormSection.js
new file mode 100644
index 0000000000000000000000000000000000000000..cc07a626e18bf60b87c4a73e61b702d81057649c
--- /dev/null
+++ b/frontend/src/Components/AiComponents/FormSection.js
@@ -0,0 +1,9 @@
+const { GoogleGenerativeAI } = require("@google/generative-ai");
+
+const genAI = new GoogleGenerativeAI("AIzaSyCx3MefHEMw2MNfzB2fI2IvpBnWBGLirmg");
+const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" });
+
+const prompt = "Explain how AI works";
+
+const result = await model.generateContent(prompt);
+console.log(result.response.text());
\ No newline at end of file
diff --git a/frontend/src/Components/AiComponents/Graph.css b/frontend/src/Components/AiComponents/Graph.css
new file mode 100644
index 0000000000000000000000000000000000000000..d6a1ca77edae247e0ed3e1e1f0e7bedd5f0b1fc5
--- /dev/null
+++ b/frontend/src/Components/AiComponents/Graph.css
@@ -0,0 +1,85 @@
+/* Fullscreen overlay */
+.graph-dialog-container {
+ position: fixed !important;
+ top: 0 !important;
+ left: 0 !important;
+ width: 100% !important;
+ height: 100vh !important;
+ background-color: rgba(0, 0, 0, 0.2) !important;
+ display: flex !important;
+ justify-content: center !important;
+ align-items: center !important;
+ z-index: 1000 !important;
+ overflow: hidden !important;
+}
+
+/* Inner dialog container */
+.graph-dialog-inner {
+ position: relative !important;
+ border-radius: 12px !important;
+ padding: 1rem !important;
+ width: 45% !important;
+ max-width: 100% !important;
+ background-color: #1e1e1e !important;
+ max-height: 80vh !important;
+ overflow: hidden !important; /* Prevent scrolling */
+}
+
+/* Header styling */
+.graph-dialog-header {
+ display: flex !important;
+ justify-content: space-between !important;
+ align-items: center !important;
+ padding: 16px !important;
+ background-color: #1e1e1e !important;
+ color: #fff !important;
+}
+
+/* Title styling */
+.graph-dialog-title {
+ font-weight: bold !important;
+ font-size: 1.5rem !important;
+ margin: 0 !important;
+}
+
+/* Close button styling */
+.graph-dialog .close-btn {
+ position: absolute !important;
+ top: 16px !important;
+ right: 16px !important;
+ background: none !important;
+ color: white !important;
+ padding: 7px !important;
+ border-radius: 5px !important;
+ cursor: pointer !important;
+}
+.graph-dialog-close-btn:hover {
+ background: rgba(255, 255, 255, 0.1) !important;
+ color: white !important;
+}
+
+/* Content area */
+.graph-dialog-content {
+ padding: 0 !important;
+ background-color: #1e1e1e !important;
+ height: 750px !important;
+ overflow: hidden !important;
+}
+
+/* Loading state */
+.graph-loading {
+ display: flex !important;
+ justify-content: center !important;
+ align-items: center !important;
+ height: 65% !important;
+ color: #fff !important;
+}
+
+/* Error message */
+.graph-error {
+ display: flex !important;
+ justify-content: center !important;
+ align-items: center !important;
+ height: 65% !important;
+ color: red !important;
+}
\ No newline at end of file
diff --git a/frontend/src/Components/AiComponents/Graph.js b/frontend/src/Components/AiComponents/Graph.js
new file mode 100644
index 0000000000000000000000000000000000000000..353852da0a8f190f3b3e43baed5ba1fcc924074c
--- /dev/null
+++ b/frontend/src/Components/AiComponents/Graph.js
@@ -0,0 +1,61 @@
+import React, { useState, useEffect } from 'react';
+import { FaTimes } from 'react-icons/fa';
+import './Graph.css';
+
+export default function Graph({ open, onClose, payload }) {
+ const [graphHtml, setGraphHtml] = useState("");
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState("");
+
+ useEffect(() => {
+ if (open && payload) {
+ setLoading(true);
+ setError("");
+ fetch("http://127.0.0.1:8000/action/graph", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(payload)
+ })
+ .then(res => res.json())
+ .then(data => {
+ setGraphHtml(data.result);
+ setLoading(false);
+ })
+ .catch(err => {
+ console.error("Error fetching graph:", err);
+ setError("Error fetching graph.");
+ setLoading(false);
+ });
+ }
+ }, [payload, open]);
+
+ if (!open) return null;
+
+ return (
+
+
e.stopPropagation()}>
+
+
Graph Display
+
+
+
+
+
+ {loading ? (
+
+ ) : error ? (
+
{error}
+ ) : (
+
+ )}
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/Components/AiComponents/LeftSideBar.js b/frontend/src/Components/AiComponents/LeftSideBar.js
new file mode 100644
index 0000000000000000000000000000000000000000..7232378b2bea9d33c5660fe1bb5008d9c43242c3
--- /dev/null
+++ b/frontend/src/Components/AiComponents/LeftSideBar.js
@@ -0,0 +1,38 @@
+import React, { useState, useEffect } from 'react';
+import { FaBars } from 'react-icons/fa';
+import './LeftSidebar.css';
+
+function LeftSidebar() {
+ const [isLeftSidebarOpen, setLeftSidebarOpen] = useState(
+ localStorage.getItem("leftSidebarState") === "true"
+ );
+
+ useEffect(() => {
+ localStorage.setItem("leftSidebarState", isLeftSidebarOpen);
+ }, [isLeftSidebarOpen]);
+
+ const toggleLeftSidebar = () => {
+ setLeftSidebarOpen(!isLeftSidebarOpen);
+ };
+
+ return (
+ <>
+
+ ... (left sidebar content)
+
+ {!isLeftSidebarOpen && (
+
+
+
+ )}
+ >
+ );
+// return (
+//
+// {/* Left sidebar is currently disabled. Uncomment the code in LeftSidebar.js to enable it. */}
+// Left sidebar is disabled.
+//
+// );
+}
+
+export default LeftSidebar;
diff --git a/frontend/src/Components/AiComponents/LeftSidebar.css b/frontend/src/Components/AiComponents/LeftSidebar.css
new file mode 100644
index 0000000000000000000000000000000000000000..8ffcabf5ef8a5a0c70435b4fc772d54e88e1ed00
--- /dev/null
+++ b/frontend/src/Components/AiComponents/LeftSidebar.css
@@ -0,0 +1,59 @@
+/* Left Sidebar Specific */
+.left-side-bar {
+ background-color: var(--primary-color);
+ color: var(--text-color);
+ display: flex;
+ flex-direction: column;
+ padding: 1rem;
+ transition: transform var(--transition-speed);
+ z-index: 1000;
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ }
+
+ .left-side-bar.closed {
+ transform: translateX(-100%);
+ }
+
+ /* Toggle Button for Left Sidebar */
+ .toggle-btn.left-toggle {
+ background-color: var(--primary-color);
+ color: var(--text-color);
+ border: none;
+ padding: 0.5rem;
+ border-radius: 4px;
+ cursor: pointer;
+ transition: background-color var(--transition-speed);
+ z-index: 1100;
+ position: fixed;
+ top: 50%;
+ left: 0;
+ transform: translate(-50%, -50%);
+ }
+
+ /* Responsive Adjustments for Left Sidebar */
+ @media (max-width: 768px) {
+ .left-side-bar {
+ width: 200px;
+ }
+ }
+
+ @media (max-width: 576px) {
+ .left-side-bar {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ transform: translateY(-100%);
+ }
+ .left-side-bar.open {
+ transform: translateY(0);
+ }
+ .toggle-btn.left-toggle {
+ top: auto;
+ bottom: 1rem;
+ left: 1rem;
+ }
+ }
diff --git a/frontend/src/Components/AiComponents/RightSidebar.css b/frontend/src/Components/AiComponents/RightSidebar.css
new file mode 100644
index 0000000000000000000000000000000000000000..d84693910ca71c15309ef47f4ae55f8795707231
--- /dev/null
+++ b/frontend/src/Components/AiComponents/RightSidebar.css
@@ -0,0 +1,129 @@
+:root {
+ /* Dark theme variables */
+ --sidebar-background: #2b2b2b;
+ --text-light: #eee;
+ --border-dark: #333;
+}
+
+/* Main sidebar container */
+.right-side-bar {
+ position: fixed;
+ top: 0;
+ right: 0;
+ height: 100%;
+ background-color: var(--sidebar-background); /* Keep background uniform */
+ color: var(--text-light);
+ box-shadow: -2px 0 8px rgba(0, 0, 0, 0.5);
+ transition: transform var(--transition-speed);
+ overflow-y: auto;
+ z-index: 1000;
+}
+
+/* When the sidebar is closed */
+.right-side-bar.closed {
+ width: 0;
+ overflow: hidden;
+}
+
+/* Sidebar header styling */
+.sidebar-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px;
+ border-bottom: 3px solid var(--border-dark);
+}
+
+.sidebar-header h3 {
+ margin: 0;
+ font-size: 1.2rem;
+}
+
+/* Close button styling */
+.close-btn {
+ background: none;
+ border: none;
+ padding: 6px;
+ color: var(--text-color);
+ font-size: 1.2rem;
+ cursor: pointer;
+ transition: color var(--transition-speed);
+}
+
+.close-btn:hover {
+ background: rgba(255, 255, 255, 0.1);
+ color: white;
+}
+
+/* Ensure the sidebar background remains uniform */
+.sidebar-content {
+ padding: 16px;
+ background: transparent;
+}
+
+/* Also clear any default marker via the pseudo-element */
+.nav-links.no-bullets li::marker {
+ content: "";
+}
+
+/* Lay out each task item using flex so that the icon and text align */
+.task-item {
+ display: flex;
+ align-items: flex-start;
+ margin-bottom: 1rem;
+}
+
+/* Icon span: fixed width and margin for spacing */
+.task-icon {
+ flex-shrink: 0;
+ margin-right: 1rem;
+}
+
+/* Task list text */
+.task-text {
+ white-space: pre-wrap;
+}
+
+/* Resizer for sidebar width adjustment */
+.resizer {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 5px;
+ height: 100%;
+ cursor: ew-resize;
+}
+
+/* Toggle button (when sidebar is closed) */
+.toggle-btn.right-toggle {
+ position: fixed;
+ top: 50%;
+ right: 0;
+ transform: translateY(-50%);
+ background-color: var(--dark-surface);
+ color: var(--text-light);
+ border: none;
+ padding: 8px;
+ cursor: pointer;
+ z-index: 1001;
+ box-shadow: -2px 0 4px rgba(0, 0, 0, 0.5);
+}
+
+.spin {
+ animation: spin 1s linear infinite;
+ color: #328bff;
+}
+
+.checkmark {
+ color: #03c203;
+}
+
+.x {
+ color: #d10808;
+}
+
+/* Keyframes for the spinner animation */
+@keyframes spin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
diff --git a/frontend/src/Components/AiComponents/RightSidebar.js b/frontend/src/Components/AiComponents/RightSidebar.js
new file mode 100644
index 0000000000000000000000000000000000000000..c70e7940c48fa8b08db70422161d77a9103cfcc7
--- /dev/null
+++ b/frontend/src/Components/AiComponents/RightSidebar.js
@@ -0,0 +1,138 @@
+import React from 'react';
+import { FaTimes, FaCheck, FaSpinner } from 'react-icons/fa';
+import { BsChevronLeft } from 'react-icons/bs';
+import CircularProgress from '@mui/material/CircularProgress';
+import Sources from './Sources';
+import Evaluate from './Evaluate'
+import './RightSidebar.css';
+
+function RightSidebar({
+ isOpen,
+ rightSidebarWidth,
+ setRightSidebarWidth,
+ toggleRightSidebar,
+ sidebarContent,
+ tasks = [],
+ tasksLoading,
+ sources = [],
+ sourcesLoading,
+ onTaskClick,
+ onSourceClick,
+ evaluation
+}) {
+ const minWidth = 200;
+ const maxWidth = 450;
+
+ // Called when the user starts resizing the sidebar.
+ const startResize = (e) => {
+ e.preventDefault();
+ document.addEventListener("mousemove", resizeSidebar);
+ document.addEventListener("mouseup", stopResize);
+ };
+
+ const resizeSidebar = (e) => {
+ let newWidth = window.innerWidth - e.clientX;
+ if (newWidth < minWidth) newWidth = minWidth;
+ if (newWidth > maxWidth) newWidth = maxWidth;
+ setRightSidebarWidth(newWidth);
+ };
+
+ const stopResize = () => {
+ document.removeEventListener("mousemove", resizeSidebar);
+ document.removeEventListener("mouseup", stopResize);
+ };
+
+ // Default handler for source clicks: open the link in a new tab.
+ const handleSourceClick = (source) => {
+ if (source && source.link) {
+ window.open(source.link, '_blank');
+ }
+ };
+
+ // Helper function to return the proper icon based on task status.
+ const getTaskIcon = (task) => {
+ // If the task is a simple string, default to the completed icon.
+ if (typeof task === 'string') {
+ return ;
+ }
+ // Use the status field to determine which icon to render.
+ switch (task.status) {
+ case 'RUNNING':
+ // FaSpinner is used for running tasks. The CSS class "spin" can be defined to add animation.
+ return ;
+ case 'DONE':
+ return ;
+ case 'FAILED':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+ return (
+ <>
+
+
+
+ {sidebarContent === "sources"
+ ? "Sources"
+ : sidebarContent === "evaluate"
+ ? "Evaluation"
+ : "Tasks"}
+
+
+
+
+
+
+ {sidebarContent === "sources" ? ( // If the sidebar content is "sources", show the sources component
+ sourcesLoading ? (
+
+
+ Generating sources...
+
+ ) : (
+
+ )
+ )
+ // If the sidebar content is "evaluate", show the evaluation component
+ : sidebarContent === "evaluate" ? (
+
+ ) : (
+ // Otherwise, show tasks
+ tasksLoading ? (
+
+
+ Generating tasks...
+
+ ) : (
+
+ {tasks.map((task, index) => (
+
+
+ {getTaskIcon(task)}
+
+
+ {typeof task === 'string' ? task : task.task}
+
+
+ ))}
+
+ )
+ )}
+
+
+
+ {!isOpen && (
+
+
+
+ )}
+ >
+ );
+}
+
+export default RightSidebar;
\ No newline at end of file
diff --git a/frontend/src/Components/AiComponents/Sources.css b/frontend/src/Components/AiComponents/Sources.css
new file mode 100644
index 0000000000000000000000000000000000000000..0e37f9058b1861ec95a713fdb15b1a629b7ffac9
--- /dev/null
+++ b/frontend/src/Components/AiComponents/Sources.css
@@ -0,0 +1,65 @@
+/* Container for the sources list */
+.sources-container {
+ display: flex !important;
+ flex-direction: column !important;
+ gap: 0.65rem !important;
+ padding: 0 !important;
+}
+
+/* Styling for each Card component */
+.source-card {
+ background-color: #3e3e3eec !important;
+ border-radius: 1rem !important;
+ color: #fff !important;
+ cursor: pointer !important;
+}
+.source-card:hover {
+ background-color: #262626e5 !important;
+}
+
+/* Styling for the CardContent title (header) - reduced text size slightly */
+.source-title {
+ color: #fff !important;
+ margin-top: -0.5rem !important;
+ margin-bottom: 0.4rem !important;
+ font-size: 1rem !important;
+}
+
+/* Styling for the link row (icon, domain, bullet, serial number) */
+.source-link {
+ display: flex !important;
+ align-items: center !important;
+ font-size: 0.8rem !important;
+ color: #c1c1c1 !important;
+ margin-bottom: 0.5rem !important;
+}
+
+/* Styling for the favicon icon - reduced size and increased brightness */
+.source-icon {
+ width: 0.88rem !important;
+ height: 0.88rem !important;
+ margin-right: 0.3rem !important;
+ filter: brightness(1.2) !important; /* Makes the icon brighter */
+}
+
+/* Styling for the domain text */
+.source-domain {
+ vertical-align: middle !important;
+}
+
+/* Styling for the separator bullet */
+.separator {
+ margin: 0 0.3rem !important;
+}
+
+/* Styling for the serial number */
+.source-serial {
+ font-size: 0.8rem !important;
+ color: #c1c1c1 !important;
+}
+
+/* Styling for the CardContent description */
+.source-description {
+ color: #e8e8e8 !important;
+ margin-bottom: -0.65rem !important;
+}
\ No newline at end of file
diff --git a/frontend/src/Components/AiComponents/Sources.js b/frontend/src/Components/AiComponents/Sources.js
new file mode 100644
index 0000000000000000000000000000000000000000..2bbd9397455d9991e40b1b64c660840542529e7b
--- /dev/null
+++ b/frontend/src/Components/AiComponents/Sources.js
@@ -0,0 +1,124 @@
+import * as React from 'react';
+import { useState, useEffect, useCallback } from 'react';
+import Box from '@mui/material/Box';
+import Card from '@mui/material/Card';
+import CardContent from '@mui/material/CardContent';
+import Typography from '@mui/material/Typography';
+import './Sources.css';
+
+// Helper function to extract a friendly domain name from a URL.
+const getDomainName = (url) => {
+ try {
+ const hostname = new URL(url).hostname;
+ // Remove "www." if present.
+ const domain = hostname.startsWith('www.') ? hostname.slice(4) : hostname;
+ // Return the first part in title case.
+ const parts = domain.split('.');
+ return parts[0].charAt(0).toUpperCase() + parts[0].slice(1);
+ } catch (err) {
+ return url;
+ }
+};
+
+export default function Sources({ sources, handleSourceClick }) {
+ // "sources" prop is the payload passed from the parent.
+ const [fetchedSources, setFetchedSources] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ const fetchSources = useCallback(async () => {
+ setLoading(true);
+ setError(null);
+ const startTime = Date.now(); // record start time
+ try {
+ // Use sources.payload if it exists.
+ const bodyData = sources && sources.payload ? sources.payload : sources;
+ const res = await fetch("http://127.0.0.1:8000/action/sources", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(bodyData)
+ });
+ const data = await res.json();
+ // Backend returns {"result": [...]}
+ setFetchedSources(data.result);
+ } catch (err) {
+ console.error("Error fetching sources:", err);
+ setError("Error fetching sources.");
+ }
+ const elapsed = Date.now() - startTime;
+ // Ensure that the loading state lasts at least 1 second.
+ if (elapsed < 500) {
+ setTimeout(() => {
+ setLoading(false);
+ }, 500 - elapsed);
+ } else {
+ setLoading(false);
+ }
+ }, [sources]);
+
+ useEffect(() => {
+ if (sources) {
+ fetchSources();
+ }
+ }, [sources, fetchSources]);
+
+ if (loading) {
+ return (
+
+ Loading Sources...
+
+ );
+ }
+
+ if (error) {
+ return (
+
+ {error}
+
+ );
+ }
+
+ return (
+
+ {fetchedSources.map((source, index) => {
+ const domain = getDomainName(source.link);
+ let hostname = '';
+ try {
+ hostname = new URL(source.link).hostname;
+ } catch (err) {
+ hostname = source.link;
+ }
+ return (
+ handleSourceClick(source)}
+ >
+
+ {/* Header/Title */}
+
+ {source.title}
+
+ {/* Link info: icon, domain, bullet, serial number */}
+
+
+ {domain}
+ •
+ {index + 1}
+
+ {/* Description */}
+
+ {source.description}
+
+
+
+ );
+ })}
+
+ );
+}
\ No newline at end of file
diff --git a/frontend/src/Components/AiPage.css b/frontend/src/Components/AiPage.css
new file mode 100644
index 0000000000000000000000000000000000000000..dbe5ce1c018afe768156e8bdb5461d575ad3d5e1
--- /dev/null
+++ b/frontend/src/Components/AiPage.css
@@ -0,0 +1,249 @@
+/* Define a modern dark theme */
+:root {
+ --dark-surface: #190e10; /* Deep, dark maroon base */
+ --primary-color: #2b2b2b; /* A dark gray for sidebars and buttons */
+ --secondary-color: #03dac6; /* A cool teal for accents */
+ --accent-color: #444a89; /* A warm accent for highlights and borders */
+ --text-color: #e0e0e0; /* Off-white text */
+ --hover-bg: #3a3a3a; /* Slightly lighter for hover effects */
+ --transition-speed: 0.25s; /* Speed of transitions */
+}
+
+/* Global font settings */
+html, body {
+ font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ margin: 0;
+ padding: 0;
+ background: var(--dark-surface);
+}
+
+/* Main container styling */
+.app-container {
+ background: var(--dark-surface);
+ color: var(--text-color);
+ display: flex;
+ min-height: 100vh;
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+/* Main Content */
+.main-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ flex-grow: 1;
+ padding: 2rem;
+ transition: 0.1s;
+ width: 99%;
+ max-width: 800px;
+ margin: 0 auto;
+}
+
+/* Search Area for Initial Mode */
+.search-area h1 {
+ margin-bottom: 1.5rem;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+.search-area {
+ width: 99%;
+ max-width: 800px;
+}
+
+.search-bar {
+ position: relative;
+ width: 100%;
+ border-radius: 0.35rem;
+ background-color: #21212f;
+}
+
+.search-input-wrapper {
+ padding: 0rem 0.6rem 4.15rem 0.6rem;
+}
+
+.search-input {
+ width: 100%;
+ max-height: 200px;
+ overflow-y: auto;
+ font-size: 1.2rem;
+ border: none;
+ background-color: transparent;
+ color: var(--text-color);
+ line-height: 1.4;
+ padding: 0.65rem 0.65rem;
+ resize: none;
+ white-space: pre-wrap;
+}
+
+.search-input:focus {
+ outline: none;
+}
+
+.search-input::placeholder {
+ color: #888;
+}
+
+.icon-container {
+ position: absolute;
+ bottom: 0.25rem;
+ left: 0;
+ right: 0;
+ height: 3rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 0.75rem;
+}
+
+.settings-btn,
+.send-btn {
+ background: transparent;
+ border: none;
+ color: var(--text-color);
+}
+
+.settings-btn svg,
+.send-btn svg {
+ font-size: 1.45rem;
+}
+
+.settings-btn:hover,
+.send-btn:hover {
+ color: #888;
+}
+
+/* Stop button */
+button.chat-send-btn.stop-btn,
+button.send-btn.stop-btn {
+ background-color: var(--text-color) !important;
+ border-radius: 50%;
+ width: 28.5px;
+ height: 28.5px;
+ border: none;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ padding: 0;
+ margin: 0 0 10px;
+}
+
+button.chat-send-btn.stop-btn:hover,
+button.send-btn.stop-btn:hover {
+ background-color: #888 !important;
+}
+
+/* Chat Mode Search Bar and Textarea Styling */
+.floating-chat-search-bar {
+ position: fixed;
+ bottom: 1.5rem;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 100%;
+ max-width: 800px;
+ background-color: #21212f;
+ border-radius: 0.35rem;
+}
+
+.floating-chat-search-bar::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: -1.5rem;
+ height: 1.5rem;
+ background-color: var(--dark-surface);
+}
+
+.chat-search-input-wrapper {
+ padding: 0.25rem 0.6rem;
+}
+
+.chat-search-input {
+ width: 100%;
+ min-width: 700px;
+ max-height: 200px;
+ overflow-y: auto;
+ font-size: 1.2rem;
+ border: none;
+ background-color: transparent;
+ color: var(--text-color);
+ line-height: 1.4;
+ padding: 0.65rem 3.25rem;
+ resize: none;
+ white-space: pre-wrap;
+}
+
+.chat-search-input:focus {
+ outline: none;
+}
+
+.chat-icon-container {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ height: 3rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 0.75rem;
+ pointer-events: none;
+}
+
+/* Re-enable pointer events on the actual buttons so they remain clickable */
+.chat-icon-container button {
+ pointer-events: auto;
+}
+
+.chat-settings-btn,
+.chat-send-btn {
+ background: transparent;
+ border: none;
+ color: var(--text-color);
+ font-size: 1.45rem;
+ margin-bottom: 0.25rem;
+ cursor: pointer;
+}
+
+.chat-settings-btn:hover,
+.chat-send-btn:hover {
+ color: #888;
+}
+
+/* Floating sidebar container for chat mode */
+.floating-sidebar {
+ position: fixed;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ width: var(--right-sidebar-width, 300px);
+ z-index: 1000;
+}
+
+/* Chat container */
+.chat-container {
+ flex-grow: 1;
+ margin-bottom: 9rem;
+}
+
+/* Responsive Adjustments */
+@media (max-width: 768px) {
+ .main-content {
+ margin-left: 0;
+ margin-right: 0;
+ }
+}
+
+@media (max-width: 576px) {
+ .main-content {
+ margin: 0;
+ padding: 1rem;
+ }
+}
diff --git a/frontend/src/Components/AiPage.js b/frontend/src/Components/AiPage.js
new file mode 100644
index 0000000000000000000000000000000000000000..4d1004467eb4d20f8fe8619cd464454b99926fd2
--- /dev/null
+++ b/frontend/src/Components/AiPage.js
@@ -0,0 +1,439 @@
+import React, { useState, useEffect, useRef } from 'react';
+import './AiPage.css';
+import { FaCog, FaPaperPlane, FaStop } from 'react-icons/fa';
+import IntialSetting from './IntialSetting';
+import ChatWindow from './AiComponents/ChatWindow';
+import RightSidebar from './AiComponents/RightSidebar';
+
+function AiPage() {
+ // Sidebar and other states
+ const [isRightSidebarOpen, setRightSidebarOpen] = useState(
+ localStorage.getItem("rightSidebarState") === "true"
+ );
+ const [rightSidebarWidth, setRightSidebarWidth] = useState(300);
+ const [sidebarContent, setSidebarContent] = useState("default");
+
+ const [searchText, setSearchText] = useState("");
+ const textAreaRef = useRef(null);
+ const [showSettingsModal, setShowSettingsModal] = useState(false);
+
+ const [showChatWindow, setShowChatWindow] = useState(false);
+ const [chatBlocks, setChatBlocks] = useState([]);
+ const [selectedChatBlockId, setSelectedChatBlockId] = useState(null);
+
+ const [defaultChatHeight, setDefaultChatHeight] = useState(null);
+ const [chatBottomPadding, setChatBottomPadding] = useState("60px");
+
+ // States/refs for streaming
+ const [isProcessing, setIsProcessing] = useState(false);
+ const [activeBlockId, setActiveBlockId] = useState(null);
+ const activeEventSourceRef = useRef(null);
+
+ useEffect(() => {
+ localStorage.setItem("rightSidebarState", isRightSidebarOpen);
+ }, [isRightSidebarOpen]);
+
+ useEffect(() => {
+ document.documentElement.style.setProperty('--right-sidebar-width', rightSidebarWidth + 'px');
+ }, [rightSidebarWidth]);
+
+ useEffect(() => {
+ if (textAreaRef.current) {
+ if (!defaultChatHeight) {
+ setDefaultChatHeight(textAreaRef.current.scrollHeight);
+ }
+ textAreaRef.current.style.height = "auto";
+ textAreaRef.current.style.overflowY = "hidden";
+
+ const newHeight = textAreaRef.current.scrollHeight;
+ let finalHeight = newHeight;
+ if (newHeight > 200) {
+ finalHeight = 200;
+ textAreaRef.current.style.overflowY = "auto";
+ }
+ textAreaRef.current.style.height = `${finalHeight}px`;
+
+ const minPaddingPx = 0;
+ const maxPaddingPx = 59;
+ let newPaddingPx = minPaddingPx;
+ if (defaultChatHeight && finalHeight > defaultChatHeight) {
+ newPaddingPx =
+ minPaddingPx +
+ ((finalHeight - defaultChatHeight) / (200 - defaultChatHeight)) *
+ (maxPaddingPx - minPaddingPx);
+ if (newPaddingPx > maxPaddingPx) newPaddingPx = maxPaddingPx;
+ }
+ setChatBottomPadding(`${newPaddingPx}px`);
+ }
+ }, [searchText, defaultChatHeight]);
+
+ const handleOpenRightSidebar = (content, chatBlockId = null) => {
+ if (chatBlockId) {
+ setSelectedChatBlockId(chatBlockId);
+ }
+ setSidebarContent(content ? content : "default");
+ setRightSidebarOpen(true);
+ };
+
+ const handleEvaluationError = (blockId, errorMsg) => {
+ setChatBlocks(prev =>
+ prev.map(block =>
+ block.id === blockId
+ ? { ...block, isError: true, errorMessage: errorMsg }
+ : block
+ )
+ );
+ };
+
+ // Initiate the SSE
+ const initiateSSE = (query, blockId) => {
+ const startTime = Date.now();
+ const sseUrl = `http://127.0.0.1:8000/message-sse?user_message=${encodeURIComponent(query)}`;
+ const eventSource = new EventSource(sseUrl);
+ activeEventSourceRef.current = eventSource;
+
+ eventSource.addEventListener("token", (e) => {
+ setChatBlocks(prev => prev.map(block =>
+ block.id === blockId
+ ? { ...block, aiAnswer: block.aiAnswer + e.data }
+ : block
+ ));
+ });
+
+ eventSource.addEventListener("final_message", (e) => {
+ const endTime = Date.now();
+ const thinkingTime = ((endTime - startTime) / 1000).toFixed(1);
+ // Only update thinkingTime so the streaming flag turns false and the cursor disappears
+ setChatBlocks(prev => prev.map(block =>
+ block.id === blockId
+ ? { ...block, thinkingTime }
+ : block
+ ));
+ });
+
+ // Listen for the "complete" event to know when to close the connection.
+ eventSource.addEventListener("complete", (e) => {
+ console.log("Complete event received:", e.data);
+ eventSource.close();
+ activeEventSourceRef.current = null;
+ setIsProcessing(false);
+ setActiveBlockId(null);
+ });
+
+ // Update actions for only this chat block.
+ eventSource.addEventListener("action", (e) => {
+ try {
+ const actionData = JSON.parse(e.data);
+ console.log("Action event received:", actionData);
+ setChatBlocks(prev => prev.map(block => {
+ if (block.id === blockId) {
+ let updatedBlock = { ...block, actions: [...(block.actions || []), actionData] };
+ if (actionData.name === "sources") {
+ updatedBlock.sources = actionData.payload;
+ }
+ if (actionData.name === "graph") {
+ updatedBlock.graph = actionData.payload;
+ }
+ return updatedBlock;
+ }
+ return block;
+ }));
+ } catch (err) {
+ console.error("Error parsing action event:", err);
+ }
+ });
+
+ // Update the error for this chat block.
+ eventSource.addEventListener("error", (e) => {
+ console.error("Error from SSE:", e.data);
+ setChatBlocks(prev => prev.map(block =>
+ block.id === blockId
+ ? { ...block, isError: true, errorMessage: e.data, aiAnswer: "" }
+ : block
+ ));
+ eventSource.close();
+ activeEventSourceRef.current = null;
+ setIsProcessing(false);
+ setActiveBlockId(null);
+ });
+
+ eventSource.addEventListener("step", (e) => {
+ console.log("Step event received:", e.data);
+ setChatBlocks(prev => prev.map(block =>
+ block.id === blockId
+ ? { ...block, thoughtLabel: e.data }
+ : block
+ ));
+ });
+
+ eventSource.addEventListener("sources_read", (e) => {
+ console.log("Sources read event received:", e.data);
+ try {
+ const parsed = JSON.parse(e.data);
+ let count;
+ if (typeof parsed === 'number') {
+ count = parsed;
+ } else if (parsed && typeof parsed.count === 'number') {
+ count = parsed.count;
+ }
+ if (typeof count === 'number') {
+ setChatBlocks(prev => prev.map(block =>
+ block.id === blockId
+ ? { ...block, sourcesRead: count, sources: parsed.sources || [] }
+ : block
+ ));
+ }
+ } catch(err) {
+ if (e.data.trim() !== "") {
+ setChatBlocks(prev => prev.map(block =>
+ block.id === blockId
+ ? { ...block, sourcesRead: e.data }
+ : block
+ ));
+ }
+ }
+ });
+
+ eventSource.addEventListener("task", (e) => {
+ console.log("Task event received:", e.data);
+ try {
+ const taskData = JSON.parse(e.data);
+ setChatBlocks(prev => prev.map(block => {
+ if (block.id === blockId) {
+ const existingTaskIndex = (block.tasks || []).findIndex(t => t.task === taskData.task);
+ if (existingTaskIndex !== -1) {
+ const updatedTasks = [...block.tasks];
+ updatedTasks[existingTaskIndex] = { ...updatedTasks[existingTaskIndex], status: taskData.status };
+ return { ...block, tasks: updatedTasks };
+ } else {
+ return { ...block, tasks: [...(block.tasks || []), taskData] };
+ }
+ }
+ return block;
+ }));
+ } catch (error) {
+ console.error("Error parsing task event:", error);
+ }
+ });
+ };
+
+ // Create a new chat block and initiate the SSE
+ const handleSend = () => {
+ if (!searchText.trim()) return;
+ const blockId = new Date().getTime();
+ setActiveBlockId(blockId);
+ setIsProcessing(true);
+ setChatBlocks(prev => [
+ ...prev,
+ {
+ id: blockId,
+ userMessage: searchText,
+ aiAnswer: "",
+ thinkingTime: null,
+ thoughtLabel: "",
+ sourcesRead: "",
+ tasks: [],
+ sources: [],
+ actions: []
+ }
+ ]);
+ setShowChatWindow(true);
+ const query = searchText;
+ setSearchText("");
+ initiateSSE(query, blockId);
+ };
+
+ const handleKeyDown = (e) => {
+ if (e.key === "Enter" && !e.shiftKey) {
+ e.preventDefault();
+ if (!isProcessing) {
+ handleSend();
+ }
+ }
+ };
+
+ // Stop the user request and close the active SSE connection
+ const handleStop = async () => {
+ // Close the active SSE connection if it exists
+ if (activeEventSourceRef.current) {
+ activeEventSourceRef.current.close();
+ activeEventSourceRef.current = null;
+ }
+ // Send POST request to /stop and update the chat block with the returned message
+ try {
+ const response = await fetch('http://127.0.0.1:8000/stop', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({})
+ });
+ const data = await response.json();
+
+ if (activeBlockId) {
+ setChatBlocks(prev => prev.map(block =>
+ block.id === activeBlockId
+ ? { ...block, aiAnswer: data.message, thinkingTime: 0, tasks: [] }
+ : block
+ ));
+ }
+ } catch (error) {
+ console.error("Error stopping the request:", error);
+ if (activeBlockId) {
+ setChatBlocks(prev => prev.map(block =>
+ block.id === activeBlockId
+ ? { ...block, aiAnswer: "Error stopping task", thinkingTime: 0, tasks: [] }
+ : block
+ ));
+ }
+ }
+ setIsProcessing(false);
+ setActiveBlockId(null);
+ };
+
+ const handleSendButtonClick = () => {
+ if (searchText.trim()) handleSend();
+ };
+
+ // Get the chat block whose details should be shown in the sidebar.
+ const selectedBlock = chatBlocks.find(block => block.id === selectedChatBlockId);
+ const evaluateAction = selectedBlock && selectedBlock.actions
+ ? selectedBlock.actions.find(a => a.name === "evaluate")
+ : null;
+
+ return (
+
+ {showChatWindow && selectedBlock && (sidebarContent !== "default" || (selectedBlock.tasks && selectedBlock.tasks.length > 0) || (selectedBlock.sources && selectedBlock.sources.length > 0)) && (
+
+ setRightSidebarOpen(!isRightSidebarOpen)}
+ sidebarContent={sidebarContent}
+ tasks={selectedBlock.tasks || []}
+ tasksLoading={false}
+ sources={selectedBlock.sources || []}
+ sourcesLoading={false}
+ onSourceClick={(source) => {
+ if (!source || !source.link) return;
+ window.open(source.link, '_blank');
+ }}
+ evaluation={
+ evaluateAction
+ ? { ...evaluateAction.payload, blockId: selectedBlock?.id, onError: handleEvaluationError }
+ : null
+ }
+ />
+
+ )}
+
+
+ {showChatWindow ? (
+ <>
+
+ {chatBlocks.map((block) => (
+ { /* if needed */ }}
+ isError={block.isError}
+ errorMessage={block.errorMessage}
+ />
+ ))}
+
+
+
+
+
+ setShowSettingsModal(true)}
+ >
+
+
+ {/* Conditionally render Stop or Send button */}
+
+ {isProcessing ? : }
+
+
+
+ >
+ ) : (
+
+
How can I help you today?
+
+
+
+
+ setShowSettingsModal(true)}
+ >
+
+
+
+ {isProcessing ? : }
+
+
+
+
+ )}
+
+
+ {showSettingsModal && (
+
setShowSettingsModal(false)}
+ fromAiPage={true}
+ />
+ )}
+
+ );
+}
+
+export default AiPage;
\ No newline at end of file
diff --git a/frontend/src/Components/IntialSetting.css b/frontend/src/Components/IntialSetting.css
new file mode 100644
index 0000000000000000000000000000000000000000..a520ef403252668804751981cbc9835d1c21efe6
--- /dev/null
+++ b/frontend/src/Components/IntialSetting.css
@@ -0,0 +1,174 @@
+.showSetting {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100vh;
+ background-color: rgba(0, 0, 0, 0.2);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 1000;
+ overflow: hidden;
+}
+
+.showSetting-inner {
+ position: relative;
+ border-radius: 12px;
+ padding: 32px;
+ width: 45%;
+ max-width: 100%;
+ background-color: #1e1e1e;
+ max-height: 80vh; /* Limits height to 80% of the viewport */
+ overflow-y: auto; /* Enables vertical scrolling when content overflows */
+}
+
+/* Dark Themed Scrollbar */
+.showSetting-inner::-webkit-scrollbar {
+ width: 8px; /* Width of the scrollbar */
+}
+
+.showSetting-inner::-webkit-scrollbar-track {
+ background: #2a2a2a; /* Darker track background */
+ border-radius: 5px;
+}
+
+.showSetting-inner::-webkit-scrollbar-thumb {
+ background: #444; /* Darker scrollbar handle */
+ border-radius: 5px;
+}
+
+.showSetting-inner::-webkit-scrollbar-thumb:hover {
+ background: #555; /* Lighter on hover */
+}
+
+/* Setting inner container */
+.showSetting-inner {
+ position: relative;
+ scrollbar-color: #444 #2a2a2a; /* Scrollbar thumb and track */
+ scrollbar-width: thin;
+ padding-top: 4.5rem;
+}
+
+/* Ensure the close button stays fixed */
+.showSetting-inner .close-btn {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+ background: none;
+ color: white;
+ padding: 7px;
+ border-radius: 5px;
+ cursor: pointer;
+}
+
+/* Close button hover effect */
+.showSetting-inner .close-btn:hover {
+ background: rgba(255, 255, 255, 0.1);
+ color: white;
+}
+
+/* Ensure the title stays at the top */
+.showSetting-inner .setting-size {
+ position: absolute;
+ font-weight: bold;
+ font-size: 1.5rem;
+ top: 16px;
+ left: 16px;
+}
+
+/* Form groups styling */
+.form-group {
+ margin-bottom: 20px;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+}
+
+.form-group label {
+ font-size: large;
+ margin-bottom: 5px;
+}
+
+.sliders-container {
+ display: flex;
+ justify-content: space-between;
+ gap: 30px;
+ width: 100%;
+}
+
+.slider-item {
+ flex: 1; /* Each slider item will take up equal available space */
+ width: 100%;
+}
+
+/* Container for password input and icon */
+.password-wrapper {
+ position: relative;
+ width: 100%;
+}
+
+/* Style the input to have extra padding on the right so text doesn’t run under the icon */
+.password-wrapper input {
+ width: 100%;
+ padding-right: 40px; /* Adjust based on the icon size */
+}
+
+.password-wrapper .password-toggle {
+ position: absolute !important;
+ color: #DDD;
+ top: 50% !important;
+ left: 95% !important;
+ transform: translateY(-50%) !important;
+}
+
+/* Slider styling */
+.slider-item {
+ text-align: center;
+}
+
+input, select, textarea {
+ background: #1E1E1E;
+ color: #DDD;
+ border: 1px solid #444;
+ padding: 10px;
+ border-radius: 5px;
+ width: 100%;
+ font-size: 16px;
+ transition: border 0.3s ease, background 0.3s ease;
+}
+
+/* Text for re-applying settings snackbar*/
+.re-applying-settings-text {
+ color: #DDD;
+ margin-top: -0.5rem;
+}
+
+/* Spinner styling */
+.re-applying-settings-custom-spinner {
+ width: 1.2rem !important;
+ height: 1.2rem !important;
+ border: 2.5px solid #ececece1 !important; /* Main Spinner */
+ border-top: 2.5px solid #303030 !important; /* Rotating path */
+ border-radius: 50% !important;
+ margin-top: -0.5rem !important;
+ animation: spin 0.9s linear infinite !important;
+}
+
+/* Spinner animation */
+@keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+/* Mobile Responsiveness */
+@media (max-width: 768px) {
+ .showSetting-inner {
+ width: 90%;
+ max-height: 75vh; /* Adjust height for smaller screens */
+ }
+}
diff --git a/frontend/src/Components/IntialSetting.js b/frontend/src/Components/IntialSetting.js
new file mode 100644
index 0000000000000000000000000000000000000000..0ef6a585ab4c519cf767af235878512469762606
--- /dev/null
+++ b/frontend/src/Components/IntialSetting.js
@@ -0,0 +1,397 @@
+import React, { useState, useRef } from 'react';
+import { useNavigate } from 'react-router-dom';
+import Box from '@mui/material/Box';
+import Slider from '@mui/material/Slider';
+import Stack from '@mui/material/Stack';
+import Button from '@mui/material/Button';
+import IconButton from '@mui/material/IconButton';
+import Snackbar from '@mui/material/Snackbar';
+import Alert from '@mui/material/Alert';
+import './IntialSetting.css';
+import { FaTimes, FaEye, FaEyeSlash } from 'react-icons/fa';
+
+function IntialSetting(props) {
+ // Controlled states for Model Provider and sliders
+ const [selectedProvider, setSelectedProvider] = useState("OpenAI");
+ const [modelTemperature, setModelTemperature] = useState(0.0);
+ const [modelTopP, setModelTopP] = useState(1.0);
+ const [showPassword, setShowPassword] = useState(false);
+
+ // Snackbar state for notifications
+ const [snackbar, setSnackbar] = useState({
+ open: false,
+ message: "",
+ severity: "success", // "success", "error", "info", "warning"
+ });
+
+ // Ref for the form element
+ const formRef = useRef(null);
+
+ // React Router hook to navigate programmatically
+ const navigate = useNavigate();
+
+ // Define model options
+ const modelOptions = {
+ OpenAI: {
+ "GPT-4 Turbo": "gpt-4-turbo",
+ "GPT-4o": "gpt-4o",
+ "GPT-4o Latest": "gpt-4o-2024-11-20",
+ "GPT-4o Mini": "gpt-4o-mini",
+ "ChatGPT": "chatgpt-4o-latest",
+ },
+ Anthropic: {
+ "Claude 3.5 Sonnet": "claude-3-5-sonnet-20241022",
+ "Claude 3.5 Haiku": "claude-3-5-haiku-20241022",
+ "Claude 3 Opus": "claude-3-opus-20240229",
+ "Claude 3 Sonnet": "claude-3-sonnet-20240229",
+ "Claude 3 Haiku": "claude-3-haiku-20240307",
+ },
+ Google: {
+ "Gemini 1.5 Pro": "gemini-1.5-pro",
+ "Gemini 1.5 Flash": "gemini-1.5-flash",
+ "Gemini 2.0 Flash Lite": "gemini-2.0-flash-lite-preview-02-05",
+ "Gemini 2.0 Flash Experimental": "gemini-2.0-flash-exp",
+ "Gemini 2.0 Flash": "gemini-2.0-flash",
+ "Gemini 2.0 Pro Experimental": "gemini-2.0-pro-exp-02-05",
+ },
+ XAI: {
+ "Grok-2": "grok-2-latest",
+ "Grok Beta": "grok-beta",
+ },
+ };
+
+ // Reset handler: resets both the form (uncontrolled fields) and controlled states
+ const handleReset = (e) => {
+ e.preventDefault();
+ if (formRef.current) {
+ formRef.current.reset();
+ }
+ setSelectedProvider("OpenAI");
+ setModelTemperature(0.0);
+ setModelTopP(1.0);
+ };
+
+ // Snackbar close handler
+ const handleSnackbarClose = (event, reason) => {
+ if (reason === 'clickaway') return;
+ setSnackbar((prev) => ({ ...prev, open: false }));
+ };
+
+ // Save handler: validates the form, shows notifications, calls the parent's callback
+ // to update the underlying page (spinner/initializing text), sends the API request, and
+ // navigates to /AiPage when the backend returns success.
+ const handleSave = async (e) => {
+ e.preventDefault();
+ const form = formRef.current;
+
+ // Retrieve values from form fields using their name attribute
+ const modelProvider = form.elements["model-provider"].value;
+ const modelName = form.elements["model-name"].value;
+ const modelAPIKeys = form.elements["model-api"].value;
+ const braveAPIKey = form.elements["brave-api"].value;
+ const proxyList = form.elements["proxy-list"].value;
+ const neo4jURL = form.elements["neo4j-url"].value;
+ const neo4jUsername = form.elements["neo4j-username"].value;
+ const neo4jPassword = form.elements["neo4j-password"].value;
+
+ // Validate required fields and collect missing field names
+ const missingFields = [];
+ if (!modelProvider || modelProvider.trim() === "") missingFields.push("Model Provider");
+ if (!modelName || modelName.trim() === "") missingFields.push("Model Name");
+ if (!modelAPIKeys || modelAPIKeys.trim() === "") missingFields.push("Model API Key");
+ if (!braveAPIKey || braveAPIKey.trim() === "") missingFields.push("Brave Search API Key");
+ if (!neo4jURL || neo4jURL.trim() === "") missingFields.push("Neo4j URL");
+ if (!neo4jUsername || neo4jUsername.trim() === "") missingFields.push("Neo4j Username");
+ if (!neo4jPassword || neo4jPassword.trim() === "") missingFields.push("Neo4j Password");
+
+ // If any required fields are missing, show an error notification
+ if (missingFields.length > 0) {
+ setSnackbar({
+ open: true,
+ message: "Please fill in the following required fields: " + missingFields.join(", "),
+ severity: "error",
+ });
+ return;
+ }
+
+ // Build the JSON payload
+ const payload = {
+ "Model_Provider": modelProvider.toLowerCase(),
+ "Model_Name": modelName,
+ "Model_API_Keys": modelAPIKeys,
+ "Brave_Search_API_Key": braveAPIKey,
+ "Neo4j_URL": neo4jURL,
+ "Neo4j_Username": neo4jUsername,
+ "Neo4j_Password": neo4jPassword,
+ "Model_Temperature": modelTemperature,
+ "Model_Top_P": modelTopP,
+ };
+
+ // Include Proxy List if provided
+ if (proxyList && proxyList.trim() !== "") {
+ payload["Proxy_List"] = proxyList;
+ }
+
+ // If opened from AiPage, show "Re-applying settings..." info notification with spinner
+ if (props.fromAiPage) {
+ setSnackbar({
+ open: true,
+ message: (
+
+
+
+
+ Re-applying settings. This may take a few minutes...
+
+
+
+ ),
+ severity: "info",
+ });
+ } else {
+ // Original immediate success notification if opened from Home/App
+ setSnackbar({
+ open: true,
+ message: "Settings saved successfully!",
+ severity: "success",
+ });
+
+ // Call the parent's callback to change the underlying page's content (spinner/text)
+ if (props.onInitializationStart) {
+ props.onInitializationStart();
+ }
+ }
+
+ // Send the payload to the backend
+ try {
+ const response = await fetch("http://127.0.0.1:8000/settings", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(payload),
+ });
+
+ if (response.ok) {
+ const data = await response.json();
+ // When the backend returns {"success": true}, navigate to /AiPage
+ if (data.success === true) {
+ // If from AiPage, show the final "Settings saved successfully!" success notification
+ if (props.fromAiPage) {
+ setSnackbar({
+ open: true,
+ message: "Settings saved successfully!",
+ severity: "success",
+ });
+ }
+ navigate("/AiPage");
+ } else {
+ // If the response is OK but success is not true
+ setSnackbar({
+ open: true,
+ message: "Error saving settings. Please try again.",
+ severity: "error",
+ });
+ }
+ } else {
+ // If response is not OK, display error notification
+ setSnackbar({
+ open: true,
+ message: "Error saving settings. Please try again.",
+ severity: "error",
+ });
+ }
+ } catch (error) {
+ console.error("Error saving settings:", error);
+ // Show error notification
+ setSnackbar({
+ open: true,
+ message: "Error saving settings. Please try again.",
+ severity: "error",
+ });
+ }
+ };
+
+ return props.trigger ? (
+ props.setTrigger(false)}>
+
e.stopPropagation()}>
+
Settings
+
props.setTrigger(false)}>
+
+
+
+
+ {/* Notifications */}
+
+
+ {snackbar.message}
+
+
+ {props.children}
+
+
+ ) : null;
+}
+
+export default IntialSetting;
\ No newline at end of file
diff --git a/frontend/src/Components/settings-gear-1.svg b/frontend/src/Components/settings-gear-1.svg
new file mode 100644
index 0000000000000000000000000000000000000000..df5540311c49303fe54085bd5ed08100d820d32c
--- /dev/null
+++ b/frontend/src/Components/settings-gear-1.svg
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/Icons/bot.png b/frontend/src/Icons/bot.png
new file mode 100644
index 0000000000000000000000000000000000000000..e30193d8778435d2458210bffafb2844fc9f2bb6
Binary files /dev/null and b/frontend/src/Icons/bot.png differ
diff --git a/frontend/src/Icons/copy.png b/frontend/src/Icons/copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc36971b43ce2f8204a66d789f4c67585d6ae4e0
Binary files /dev/null and b/frontend/src/Icons/copy.png differ
diff --git a/frontend/src/Icons/evaluate.png b/frontend/src/Icons/evaluate.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e5678869909d71d0997fb7aed4e011b3aeea840
Binary files /dev/null and b/frontend/src/Icons/evaluate.png differ
diff --git a/frontend/src/Icons/graph.png b/frontend/src/Icons/graph.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e08c9730133177fe99acbc930ac42aebfb77617
Binary files /dev/null and b/frontend/src/Icons/graph.png differ
diff --git a/frontend/src/Icons/loading.png b/frontend/src/Icons/loading.png
new file mode 100644
index 0000000000000000000000000000000000000000..91b898b95929dc8fffd8a88a593676883ecc0b52
Binary files /dev/null and b/frontend/src/Icons/loading.png differ
diff --git a/frontend/src/Icons/reprocess.png b/frontend/src/Icons/reprocess.png
new file mode 100644
index 0000000000000000000000000000000000000000..15625043865a638237cafcab531f0715005585ae
Binary files /dev/null and b/frontend/src/Icons/reprocess.png differ
diff --git a/frontend/src/Icons/settings-2.svg b/frontend/src/Icons/settings-2.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a92dab5fda7ff045e4074a5c13a94e6e256670f7
--- /dev/null
+++ b/frontend/src/Icons/settings-2.svg
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/Icons/settings.png b/frontend/src/Icons/settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..39cdedc229bc0b6301d4ad7755afac1dc4960a11
Binary files /dev/null and b/frontend/src/Icons/settings.png differ
diff --git a/frontend/src/Icons/sources.png b/frontend/src/Icons/sources.png
new file mode 100644
index 0000000000000000000000000000000000000000..47787bd2153da6f4da47d54c119c30caaab90a08
Binary files /dev/null and b/frontend/src/Icons/sources.png differ
diff --git a/frontend/src/Icons/thinking.gif b/frontend/src/Icons/thinking.gif
new file mode 100644
index 0000000000000000000000000000000000000000..833dd18f561c898fd1dd617f918af8dc4f66a80e
Binary files /dev/null and b/frontend/src/Icons/thinking.gif differ
diff --git a/frontend/src/Icons/user.png b/frontend/src/Icons/user.png
new file mode 100644
index 0000000000000000000000000000000000000000..0fc67ed27b24b00b02552d89f3fc1a423bc1041c
Binary files /dev/null and b/frontend/src/Icons/user.png differ
diff --git a/frontend/src/index.css b/frontend/src/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..e3da3d605673c9726600283fdf654f63c89ac3e3
--- /dev/null
+++ b/frontend/src/index.css
@@ -0,0 +1,18 @@
+/* Reset some default styles */
+*, *::before, *::after {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
+ sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+code {
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
+ monospace;
+}
diff --git a/frontend/src/index.js b/frontend/src/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..d563c0fb10ba0e42724b21286eb546ee4e5734fc
--- /dev/null
+++ b/frontend/src/index.js
@@ -0,0 +1,17 @@
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+import './index.css';
+import App from './App';
+import reportWebVitals from './reportWebVitals';
+
+const root = ReactDOM.createRoot(document.getElementById('root'));
+root.render(
+
+
+
+);
+
+// If you want to start measuring performance in your app, pass a function
+// to log results (for example: reportWebVitals(console.log))
+// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
+reportWebVitals();
diff --git a/frontend/src/logo.svg b/frontend/src/logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9dfc1c058cebbef8b891c5062be6f31033d7d186
--- /dev/null
+++ b/frontend/src/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/src/reportWebVitals.js b/frontend/src/reportWebVitals.js
new file mode 100644
index 0000000000000000000000000000000000000000..5253d3ad9e6be6690549cb255f5952337b02401d
--- /dev/null
+++ b/frontend/src/reportWebVitals.js
@@ -0,0 +1,13 @@
+const reportWebVitals = onPerfEntry => {
+ if (onPerfEntry && onPerfEntry instanceof Function) {
+ import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
+ getCLS(onPerfEntry);
+ getFID(onPerfEntry);
+ getFCP(onPerfEntry);
+ getLCP(onPerfEntry);
+ getTTFB(onPerfEntry);
+ });
+ }
+};
+
+export default reportWebVitals;
diff --git a/frontend/src/setupTests.js b/frontend/src/setupTests.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f2609b7b3e0e3897ab3bcaad13caf6876e48699
--- /dev/null
+++ b/frontend/src/setupTests.js
@@ -0,0 +1,5 @@
+// jest-dom adds custom jest matchers for asserting on DOM nodes.
+// allows you to do things like:
+// expect(element).toHaveTextContent(/react/i)
+// learn more: https://github.com/testing-library/jest-dom
+import '@testing-library/jest-dom';
diff --git a/main.py b/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..368e047b5434fc63b7dff2d5a91b8c2b8e1e71fe
--- /dev/null
+++ b/main.py
@@ -0,0 +1,761 @@
+import os
+import re
+import asyncio
+import json
+import time
+import logging
+from typing import Any, Dict
+from fastapi.staticfiles import StaticFiles
+from fastapi import FastAPI, Request, HTTPException
+from fastapi.responses import StreamingResponse, JSONResponse, FileResponse
+from fastapi.middleware.cors import CORSMiddleware
+from dotenv import load_dotenv
+from openai import RateLimitError
+from anthropic import RateLimitError as AnthropicRateLimitError
+from google.api_core.exceptions import ResourceExhausted
+
+logger = logging.getLogger()
+logger.setLevel(logging.INFO)
+
+CONTEXT_LENGTH = 128000
+BUFFER = 10000
+MAX_TOKENS_ALLOWED = CONTEXT_LENGTH - BUFFER
+
+# Per-session state
+SESSION_STORE: Dict[str, Dict[str, Any]] = {}
+
+# Format error message for SSE
+def format_error_sse(event_type: str, data: str) -> str:
+ lines = data.splitlines()
+ sse_message = f"event: {event_type}\n"
+ for line in lines:
+ sse_message += f"data: {line}\n"
+ sse_message += "\n"
+ return sse_message
+
+# Initialize the components
+def initialize_components():
+ load_dotenv(override=True)
+
+ from src.search.search_engine import SearchEngine
+ from src.query_processing.query_processor import QueryProcessor
+ from src.rag.neo4j_graphrag import Neo4jGraphRAG
+ from src.evaluation.evaluator import Evaluator
+ from src.reasoning.reasoner import Reasoner
+ from src.crawl.crawler import CustomCrawler
+ from src.utils.api_key_manager import APIKeyManager
+ from src.query_processing.late_chunking.late_chunker import LateChunker
+
+ manager = APIKeyManager()
+ manager._reinit()
+ SESSION_STORE['search_engine'] = SearchEngine()
+ SESSION_STORE['query_processor'] = QueryProcessor()
+ SESSION_STORE['crawler'] = CustomCrawler(max_concurrent_requests=1000)
+ SESSION_STORE['graph_rag'] = Neo4jGraphRAG(num_workers=os.cpu_count() * 2)
+ SESSION_STORE['evaluator'] = Evaluator()
+ SESSION_STORE['reasoner'] = Reasoner()
+ SESSION_STORE['model'] = manager.get_llm()
+ SESSION_STORE['late_chunker'] = LateChunker()
+ SESSION_STORE["initialized"] = True
+ SESSION_STORE["session_id"] = None
+
+async def process_query(user_query: str, sse_queue: asyncio.Queue):
+ state = SESSION_STORE
+
+ try:
+ category = await state["query_processor"].classify_query(user_query)
+ cat_lower = category.lower().strip()
+
+ if state["session_id"] is None:
+ state["session_id"] = await state["crawler"].create_session()
+
+ user_query = re.sub(r'category:.*', '', user_query, flags=re.IGNORECASE).strip()
+
+ if cat_lower == "internal knowledge base":
+ response = ""
+ async for chunk in state["reasoner"].reason(user_query):
+ response += chunk
+ await sse_queue.put(("token", chunk))
+
+ await sse_queue.put(("final_message", response))
+ SESSION_STORE["chat_history"].append({"query": user_query, "response": response})
+
+ await sse_queue.put(("action", {
+ "name": "evaluate",
+ "payload": {"query": user_query, "response": response}
+ }))
+
+ await sse_queue.put(("complete", "done"))
+
+ elif cat_lower == "simple external lookup":
+ await sse_queue.put(("step", "Searching..."))
+
+ optimized_query = await state['search_engine'].generate_optimized_query(user_query)
+ search_results = await state['search_engine'].search(
+ optimized_query,
+ num_results=3,
+ exclude_filetypes=["pdf"]
+ )
+
+ urls = [r.get('link', 'No URL') for r in search_results]
+ search_contents = await state['crawler'].fetch_page_contents(
+ urls,
+ user_query,
+ state["session_id"],
+ max_attempts=1
+ )
+
+ contents = ""
+ if search_contents:
+ for k, content in enumerate(search_contents, 1):
+ if isinstance(content, Exception):
+ print(f"Error fetching content: {content}")
+ elif content:
+ contents += f"Document {k}:\n{content}\n\n"
+
+ if len(contents.strip()) > 0:
+ await sse_queue.put(("step", "Generating Response..."))
+
+ token_count = state['model'].get_num_tokens(contents)
+ if token_count > MAX_TOKENS_ALLOWED:
+ contents = await state['late_chunker'].chunker(contents, user_query, MAX_TOKENS_ALLOWED)
+
+ await sse_queue.put(("sources_read", len(search_contents)))
+
+ response = ""
+ async for chunk in state["reasoner"].reason(user_query, contents):
+ response += chunk
+ await sse_queue.put(("token", chunk))
+
+ await sse_queue.put(("final_message", response))
+ SESSION_STORE["chat_history"].append({"query": user_query, "response": response})
+
+ await sse_queue.put(("action", {
+ "name": "sources",
+ "payload": {"search_results": search_results, "search_contents": search_contents}
+ }))
+ await sse_queue.put(("action", {
+ "name": "evaluate",
+ "payload": {"query": user_query, "contents": [contents], "response": response}
+ }))
+
+ await sse_queue.put(("complete", "done"))
+ else:
+ await sse_queue.put(("error", "No results found."))
+
+ elif cat_lower == "complex moderate decomposition":
+ current_search_results = []
+ current_search_contents = []
+
+ await sse_queue.put(("step", "Thinking..."))
+
+ start = time.time()
+ intent = await state['query_processor'].get_query_intent(user_query)
+ sub_queries, _ = await state['query_processor'].decompose_query(user_query, intent)
+
+ async def sub_query_task(sub_query):
+ try:
+ await sse_queue.put(("step", "Searching..."))
+ await sse_queue.put(("task", (sub_query, "RUNNING")))
+
+ optimized_query = await state['search_engine'].generate_optimized_query(sub_query)
+ search_results = await state['search_engine'].search(
+ optimized_query,
+ num_results=10,
+ exclude_filetypes=["pdf"]
+ )
+ filtered_urls = await state['search_engine'].filter_urls(
+ sub_query,
+ category,
+ search_results
+ )
+ current_search_results.extend(filtered_urls)
+
+ urls = [r.get('link', 'No URL') for r in filtered_urls]
+ search_contents = await state['crawler'].fetch_page_contents(
+ urls,
+ sub_query,
+ state["session_id"],
+ max_attempts=1
+ )
+ current_search_contents.extend(search_contents)
+
+ contents = ""
+ if search_contents:
+ for k, c in enumerate(search_contents, 1):
+ if isinstance(c, Exception):
+ logger.info(f"Error fetching content: {c}")
+ elif c:
+ contents += f"Document {k}:\n{c}\n\n"
+
+ if len(contents.strip()) > 0:
+ await sse_queue.put(("task", (sub_query, "DONE")))
+ else:
+ await sse_queue.put(("task", (sub_query, "FAILED")))
+
+ return contents
+
+ except (RateLimitError, ResourceExhausted, AnthropicRateLimitError):
+ await sse_queue.put(("task", (sub_query, "FAILED")))
+ return ""
+
+ tasks = [sub_query_task(sub_query) for sub_query in sub_queries]
+ results = await asyncio.gather(*tasks)
+ end = time.time()
+
+ contents = "\n\n".join(r for r in results if r.strip())
+
+ unique_results = []
+ seen = set()
+ for entry in current_search_results:
+ link = entry["link"]
+ if link not in seen:
+ seen.add(link)
+ unique_results.append(entry)
+ current_search_results = unique_results
+ current_search_contents = list(set(current_search_contents))
+
+ if len(contents.strip()) > 0:
+ await sse_queue.put(("step", "Generating Response..."))
+
+ token_count = state['model'].get_num_tokens(contents)
+ if token_count > MAX_TOKENS_ALLOWED:
+ contents = await state['late_chunker'].chunker(
+ text=contents,
+ query=user_query,
+ max_tokens=MAX_TOKENS_ALLOWED
+ )
+ logger.info(f"Number of tokens in the answer: {token_count}")
+ logger.info(f"Number of tokens in the content: {state['model'].get_num_tokens(contents)}")
+
+ await sse_queue.put(("sources_read", len(current_search_contents)))
+
+ response = ""
+ is_first_chunk = True
+ async for chunk in state['reasoner'].reason(user_query, contents):
+ if is_first_chunk:
+ await sse_queue.put(("step", f"Thought and searched for {int(end - start)} seconds"))
+ is_first_chunk = False
+
+ response += chunk
+ await sse_queue.put(("token", chunk))
+
+ await sse_queue.put(("final_message", response))
+ SESSION_STORE["chat_history"].append({"query": user_query, "response": response})
+
+ await sse_queue.put(("action", {
+ "name": "sources",
+ "payload": {
+ "search_results": current_search_results,
+ "search_contents": current_search_contents
+ }
+ }))
+ await sse_queue.put(("action", {
+ "name": "evaluate",
+ "payload": {"query": user_query, "contents": [contents], "response": response}
+ }))
+
+ await sse_queue.put(("complete", "done"))
+ else:
+ await sse_queue.put(("error", "No results found."))
+
+ elif cat_lower == "complex advanced decomposition":
+ current_search_results = []
+ current_search_contents = []
+
+ await sse_queue.put(("step", "Thinking..."))
+
+ start = time.time()
+ main_query_intent = await state['query_processor'].get_query_intent(user_query)
+ sub_queries, _ = await state['query_processor'].decompose_query(user_query, main_query_intent)
+
+ await sse_queue.put(("step", "Searching..."))
+
+ async def sub_query_task(sub_query):
+ try:
+ async def sub_sub_query_task(sub_sub_query):
+ optimized_query = await state['search_engine'].generate_optimized_query(sub_sub_query)
+ search_results = await state['search_engine'].search(
+ optimized_query,
+ num_results=10,
+ exclude_filetypes=["pdf"]
+ )
+ filtered_urls = await state['search_engine'].filter_urls(
+ sub_sub_query,
+ category,
+ search_results
+ )
+ current_search_results.extend(filtered_urls)
+
+ urls = [r.get('link', 'No URL') for r in filtered_urls]
+ search_contents = await state['crawler'].fetch_page_contents(
+ urls,
+ sub_sub_query,
+ state["session_id"],
+ max_attempts=1,
+ timeout=20
+ )
+ current_search_contents.extend(search_contents)
+
+ contents = ""
+ if search_contents:
+ for k, c in enumerate(search_contents, 1):
+ if isinstance(c, Exception):
+ logger.info(f"Error fetching content: {c}")
+ elif c:
+ contents += f"Document {k}:\n{c}\n\n"
+
+ return contents
+
+ await sse_queue.put(("task", (sub_query, "RUNNING")))
+
+ sub_sub_queries, _ = await state['query_processor'].decompose_query(sub_query)
+
+ tasks = [sub_sub_query_task(sub_sub_query) for sub_sub_query in sub_sub_queries]
+ results = await asyncio.gather(*tasks)
+
+ if any(result.strip() for result in results):
+ await sse_queue.put(("task", (sub_query, "DONE")))
+ else:
+ await sse_queue.put(("task", (sub_query, "FAILED")))
+
+ return results
+
+ except (RateLimitError, ResourceExhausted, AnthropicRateLimitError):
+ await sse_queue.put(("task", (sub_query, "FAILED")))
+ return []
+
+ tasks = [sub_query_task(sub_query) for sub_query in sub_queries]
+ results = await asyncio.gather(*tasks)
+ end = time.time()
+
+ previous_contents = []
+ for result in results:
+ if result:
+ for content in result:
+ if isinstance(content, str) and len(content.strip()) > 0:
+ previous_contents.append(content)
+ contents = "\n\n".join(previous_contents)
+
+ unique_results = []
+ seen = set()
+ for entry in current_search_results:
+ link = entry["link"]
+ if link not in seen:
+ seen.add(link)
+ unique_results.append(entry)
+ current_search_results = unique_results
+ current_search_contents = list(set(current_search_contents))
+
+ if len(contents.strip()) > 0:
+ await sse_queue.put(("step", "Generating Response..."))
+
+ token_count = state['model'].get_num_tokens(contents)
+ if token_count > MAX_TOKENS_ALLOWED:
+ contents = await state['late_chunker'].chunker(
+ text=contents,
+ query=user_query,
+ max_tokens=MAX_TOKENS_ALLOWED
+ )
+ logger.info(f"Number of tokens in the answer: {token_count}")
+ logger.info(f"Number of tokens in the content: {state['model'].get_num_tokens(contents)}")
+
+ await sse_queue.put(("sources_read", len(current_search_contents)))
+
+ response = ""
+ is_first_chunk = True
+ async for chunk in state['reasoner'].reason(user_query, contents):
+ if is_first_chunk:
+ await sse_queue.put(("step", f"Thought and searched for {int(end - start)} seconds"))
+ is_first_chunk = False
+
+ response += chunk
+ await sse_queue.put(("token", chunk))
+
+ await sse_queue.put(("final_message", response))
+ SESSION_STORE["chat_history"].append({"query": user_query, "response": response})
+
+ await sse_queue.put(("action", {
+ "name": "sources",
+ "payload": {
+ "search_results": current_search_results,
+ "search_contents": current_search_contents
+ }
+ }))
+ await sse_queue.put(("action", {
+ "name": "evaluate",
+ "payload": {"query": user_query, "contents": [contents], "response": response}
+ }))
+
+ await sse_queue.put(("complete", "done"))
+ else:
+ await sse_queue.put(("error", "No results found."))
+
+ elif cat_lower == "extensive research dynamic structuring":
+ current_search_results = []
+ current_search_contents = []
+
+ match = re.search(
+ r"^This is the previous context of the conversation:\s*.*?\s*Current Query:\s*(.*)$",
+ user_query,
+ flags=re.DOTALL | re.MULTILINE
+ )
+ if match:
+ user_query = match.group(1)
+
+ await sse_queue.put(("step", "Thinking..."))
+ await asyncio.sleep(0.01) # Sleep for a short time to allow the message to be sent
+
+ async def on_event_callback(event_type, data):
+ if event_type == "graph_operation":
+ if data["operation_type"] == "creating_new_graph":
+ await sse_queue.put(("step", "Creating New Graph..."))
+
+ elif data["operation_type"] == "modifying_existing_graph":
+ await sse_queue.put(("step", "Modifying Existing Graph..."))
+
+ elif data["operation_type"] == "loading_existing_graph":
+ await sse_queue.put(("step", "Loading Existing Graph..."))
+
+ elif event_type == "sub_query_created":
+ sub_query = data["sub_query"]
+ await sse_queue.put(("task", (sub_query, "RUNNING")))
+
+ elif event_type == "search_process_started":
+ await sse_queue.put(("step", "Searching..."))
+
+ elif event_type == "sub_query_processed":
+ sub_query = data["sub_query"]
+ await sse_queue.put(("task", (sub_query, "DONE")))
+
+ elif event_type == "sub_query_failed":
+ sub_query = data["sub_query"]
+ await sse_queue.put(("task", (sub_query, "FAILED")))
+
+ elif event_type == "search_results_filtered":
+ current_search_results.extend(data["filtered_urls"])
+
+ filtered_urls = data["filtered_urls"]
+ current_search_results.extend(filtered_urls)
+
+ elif event_type == "search_contents_fetched":
+ current_search_contents.extend(data["contents"])
+
+ contents = data["contents"]
+ current_search_contents.extend(contents)
+
+ state['graph_rag'].set_on_event_callback(on_event_callback)
+
+ start = time.time()
+ state['graph_rag'].initialize_schema()
+ await state['graph_rag'].process_graph(
+ user_query,
+ similarity_threshold=0.8,
+ relevance_threshold=0.8,
+ max_tokens_allowed=MAX_TOKENS_ALLOWED
+ )
+ end = time.time()
+
+ unique_results = []
+ seen = set()
+ for entry in current_search_results:
+ link = entry["link"]
+ if link not in seen:
+ seen.add(link)
+ unique_results.append(entry)
+ current_search_results = unique_results
+ current_search_contents = list(set(current_search_contents))
+
+ await sse_queue.put(("step", "Generating Response..."))
+
+ answer = state['graph_rag'].query_graph(user_query)
+ if answer:
+ token_count = state['model'].get_num_tokens(answer)
+ if token_count > MAX_TOKENS_ALLOWED:
+ answer = await state['late_chunker'].chunker(
+ text=answer,
+ query=user_query,
+ max_tokens=MAX_TOKENS_ALLOWED
+ )
+ logger.info(f"Number of tokens in the answer: {token_count}")
+ logger.info(f"Number of tokens in the content: {state['model'].get_num_tokens(answer)}")
+
+ await sse_queue.put(("sources_read", len(current_search_contents)))
+
+ response = ""
+ is_first_chunk = True
+ async for chunk in state['reasoner'].reason(user_query, answer):
+ if is_first_chunk:
+ await sse_queue.put(("step", f"Thought and searched for {int(end - start)} seconds"))
+ is_first_chunk = False
+
+ response += chunk
+ await sse_queue.put(("token", chunk))
+
+ await sse_queue.put(("final_message", response))
+ SESSION_STORE["chat_history"].append({"query": user_query, "response": response})
+
+ await sse_queue.put(("action", {
+ "name": "sources",
+ "payload": {"search_results": current_search_results, "search_contents": current_search_contents},
+ }))
+ await sse_queue.put(("action", {
+ "name": "graph",
+ "payload": {"query": user_query},
+ }))
+ await sse_queue.put(("action", {
+ "name": "evaluate",
+ "payload": {"query": user_query, "contents": [answer], "response": response},
+ }))
+
+ await sse_queue.put(("complete", "done"))
+ else:
+ await sse_queue.put(("error", "No results found."))
+
+ else:
+ await sse_queue.put(("final_message", "I'm not sure how to handle your query."))
+
+ except Exception as e:
+ await sse_queue.put(("error", str(e)))
+
+# Create a FastAPI app
+app = FastAPI()
+
+# Define allowed origins
+origins = [
+ "http://localhost:3000",
+ "http://localhost:7860"
+ "http://localhost:8000",
+ "http://localhost"
+]
+
+# Add the CORS middleware to your FastAPI app
+app.add_middleware(
+ CORSMiddleware,
+ allow_origins=origins, # Allows only these origins
+ allow_credentials=True,
+ allow_methods=["*"], # Allows all HTTP methods (GET, POST, etc.)
+ allow_headers=["*"], # Allows all headers
+)
+
+# Serve the React app (the production build) at the root URL.
+app.mount("/static", StaticFiles(directory="static/static", html=True), name="static")
+
+# Catch-all route for frontend paths.
+@app.get("/{full_path:path}")
+async def serve_frontend(full_path: str, request: Request):
+ if full_path.startswith("action") or full_path in ["settings", "message-sse", "stop"]:
+ raise HTTPException(status_code=404, detail="Not Found")
+
+ index_path = os.path.join("static", "index.html")
+ if not os.path.exists(index_path):
+ raise HTTPException(status_code=500, detail="Frontend build not found")
+ return FileResponse(index_path)
+
+# Define the routes for the FastAPI app
+
+# Define the route for sources action to display search results
+@app.post("/action/sources")
+def action_sources(payload: Dict[str, Any]) -> Dict[str, Any]:
+ try:
+ search_contents = payload.get("search_contents", [])
+ search_results = payload.get("search_results", [])
+ sources = []
+ word_limit = 15 # Maximum number of words for the description
+
+ for result, contents in zip(search_results, search_contents):
+ if contents:
+ title = result.get('title', 'No Title')
+ link = result.get('link', 'No URL')
+ snippet = result.get('snippet', 'No snippet')
+ cleaned = re.sub(r'<[^>]+>|\[\/?.*?\]', '', snippet)
+
+ words = cleaned.split()
+ if len(words) > word_limit:
+ description = " ".join(words[:word_limit]) + "..."
+ else:
+ description = " ".join(words)
+
+ source_obj = {
+ "title": title,
+ "link": link,
+ "description": description
+ }
+ sources.append(source_obj)
+
+ return {"result": sources}
+ except Exception as e:
+ return JSONResponse(content={"error": str(e)}, status_code=500)
+
+# Define the route for graph action to display the graph
+@app.post("/action/graph")
+def action_graph(payload: Dict[str, Any]) -> Dict[str, Any]:
+ state = SESSION_STORE
+
+ try:
+ q = payload.get("query", "")
+ html_str = state['graph_rag'].display_graph(q)
+
+ return {"result": html_str}
+ except Exception as e:
+ return JSONResponse(content={"error": str(e)}, status_code=500)
+
+# Define the route for evaluate action to display evaluation results
+@app.post("/action/evaluate")
+async def action_evaluate(payload: Dict[str, Any]) -> Dict[str, Any]:
+ try:
+ query = payload.get("query", "")
+ contents = payload.get("contents", [])
+ response = payload.get("response", "")
+ metrics = payload.get("metrics", [])
+
+ state = SESSION_STORE
+ evaluator = state["evaluator"]
+ result = await evaluator.evaluate_response(query, response, contents, include_metrics=metrics)
+
+ return {"result": result}
+ except Exception as e:
+ return JSONResponse(content={"error": str(e)}, status_code=500)
+
+@app.post("/settings")
+async def update_settings(data: Dict[str, Any]):
+ from src.helpers.helper import (
+ prepare_provider_key_updates,
+ prepare_proxy_list_updates,
+ update_env_vars
+ )
+
+ provider = data.get("Model_Provider", "").strip()
+ model_name = data.get("Model_Name", "").strip()
+ multiple_api_keys = data.get("Model_API_Keys", "").strip()
+ brave_api_key = data.get("Brave_Search_API_Key", "").strip()
+ proxy_list = data.get("Proxy_List", "").strip()
+ neo4j_url = data.get("Neo4j_URL", "").strip()
+ neo4j_username = data.get("Neo4j_Username", "").strip()
+ neo4j_password = data.get("Neo4j_Password", "").strip()
+ model_temperature = str(data.get("Model_Temperature", 0.0))
+ model_top_p = str(data.get("Model_Top_P", 1.0))
+
+ prov_lower = provider.lower()
+ key_updates = prepare_provider_key_updates(prov_lower, multiple_api_keys)
+ env_updates = {}
+ env_updates.update(key_updates)
+ px = prepare_proxy_list_updates(proxy_list)
+
+ if px:
+ env_updates.update(px)
+
+ env_updates["BRAVE_API_KEY"] = brave_api_key
+ env_updates["NEO4J_URI"] = neo4j_url
+ env_updates["NEO4J_USER"] = neo4j_username
+ env_updates["NEO4J_PASSWORD"] = neo4j_password
+ env_updates["MODEL_PROVIDER"] = prov_lower
+ env_updates["MODEL_NAME"] = model_name
+ env_updates["MODEL_TEMPERATURE"] = model_temperature
+ env_updates["MODEL_TOP_P"] = model_top_p
+
+ update_env_vars(env_updates)
+ load_dotenv(override=True)
+ initialize_components()
+
+ return {"success": True}
+
+@app.on_event("startup")
+def init_chat():
+ if not SESSION_STORE:
+ print("Initializing chat...")
+
+ SESSION_STORE["settings_saved"] = False
+ SESSION_STORE["session_id"] = None
+ SESSION_STORE["chat_history"] = []
+
+ print("Chat initialized!")
+
+ return {"sucess": True}
+ else:
+ print("Chat already initialized!")
+ return {"success": False}
+
+@app.get("/message-sse")
+async def sse_message(request: Request, user_message: str):
+ state = SESSION_STORE
+ sse_queue = asyncio.Queue()
+
+ async def event_generator():
+ # Build the prompt
+ context = state["chat_history"][-5:]
+ if context:
+ prompt = \
+f"""This is the previous context of the conversation:
+{context}
+
+Current Query:
+{user_message}"""
+ else:
+ prompt = user_message
+
+ task = asyncio.create_task(process_query(prompt, sse_queue))
+ state["process_task"] = task
+
+ while True:
+ if await request.is_disconnected():
+ task.cancel()
+ break
+ try:
+ event_type, data = await asyncio.wait_for(sse_queue.get(), timeout=5)
+
+ if event_type == "token":
+ yield f"event: token\ndata: {data}\n\n"
+
+ elif event_type == "final_message":
+ yield f"event: final_message\ndata: {data}\n\n"
+
+ elif event_type == "error":
+ yield format_error_sse("error", data)
+
+ elif event_type == "step":
+ yield f"event: step\ndata: {data}\n\n"
+
+ elif event_type == "task":
+ subq, status = data
+ j = {"task": subq, "status": status}
+ yield f"event: task\ndata: {json.dumps(j)}\n\n"
+
+ elif event_type == "sources_read":
+ yield f"event: sources_read\ndata: {data}\n\n"
+
+ elif event_type == "action":
+ yield f"event: action\ndata: {json.dumps(data)}\n\n"
+
+ elif event_type == "complete":
+ yield f"event: complete\ndata: {data}\n\n"
+ break
+
+ else:
+ yield f"event: message\ndata: {data}\n\n"
+
+ except asyncio.TimeoutError:
+ if task.done():
+ break
+ continue
+
+ except asyncio.CancelledError:
+ break
+
+ if not task.done():
+ task.cancel()
+
+ if "process_task" in state:
+ del state["process_task"]
+
+ return StreamingResponse(event_generator(), media_type="text/event-stream")
+
+@app.post("/stop")
+def stop():
+ state = SESSION_STORE
+
+ if "process_task" in state:
+ state["process_task"].cancel()
+ del state["process_task"]
+
+ return {"message": "Stopped task manually"}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..5a9e84bed13a27fe521da8efa9c6e23399d8c0bb
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6 @@
+{
+ "name": "ai_search_project",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {}
+}
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c0f7316d04398a3cea4bbe46be59ff35d4c69a75
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,34 @@
+fastapi[standard]
+aiohttp==3.10.10
+anthropic==0.42.0
+beautifulsoup4==4.12.3
+bert_score==0.3.13
+crawl4ai[all]==0.3.731
+deepeval==2.0
+fake_useragent==1.5.1
+fast_async==1.1.0
+htmlrag==0.0.4
+langchain==0.3.14
+langchain_anthropic==0.3.1
+langchain_community==0.3.14
+langchain_core==0.3.29
+langchain_google_genai==2.0.7
+langchain_openai==0.2.14
+langchain_xai==0.1.1
+langgraph==0.2.62
+model2vec==0.3.3
+neo4j==5.26.0
+openai==1.59.3
+protobuf==4.23.4
+PyPDF2==3.0.1
+python-dotenv==1.0.1
+pyvis==0.3.2
+spacy==3.8.3
+scikit_learn==1.6.0
+sentence_transformers==3.1.1
+tenacity==8.4.2
+transformers==4.46.2
+xformers==0.0.29.post1
+# Intall the following seperately:-
+# latest torch cuda version compatible with xformers' version
+# python -m spacy download en_core_web_sm
diff --git a/src/crawl/__init__.py b/src/crawl/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/crawl/crawler.py b/src/crawl/crawler.py
new file mode 100644
index 0000000000000000000000000000000000000000..c9f2b26a024e6a0851ff6e1a693bfbf21505b151
--- /dev/null
+++ b/src/crawl/crawler.py
@@ -0,0 +1,980 @@
+from crawl4ai import AsyncWebCrawler
+from urllib.parse import urlparse
+import aiohttp
+import asyncio
+from asyncio.exceptions import TimeoutError as async_timeout
+from fast_async import make_async
+from bs4 import BeautifulSoup, NavigableString
+import secrets
+from datetime import datetime
+import random
+import os
+import re
+import uuid
+from typing import List, Dict, Tuple, Optional
+from io import BytesIO
+import PyPDF2
+from fake_useragent import FakeUserAgent
+from htmlrag import clean_html, build_block_tree, EmbedHTMLPruner, BM25HTMLPruner
+from transformers import AutoTokenizer, AutoConfig
+import torch
+import time
+
+class Crawler:
+ def __init__(self, user_dir=None, rate_limit=1, headless=True, verbose=False):
+ self.session_pool = {} # Track active sessions
+ self.verbose = verbose
+ self.rate_limit = rate_limit
+ self.user_dir = user_dir
+ self.headless = headless
+ self.crawler = AsyncWebCrawler(
+ context_options={"userDataDir": self.user_dir},
+ headless=self.headless,
+ verbose=self.verbose
+ )
+
+ # Browser context management
+ self._browser_contexts = {}
+ self._context_locks = {}
+
+ async def get_browser_context(self, session_id):
+ """Get or create a browser context with proper locking"""
+ if session_id not in self._context_locks:
+ self._context_locks[session_id] = asyncio.Lock()
+
+ async with self._context_locks[session_id]:
+ if session_id not in self._browser_contexts:
+ context = await self.crawler.new_context()
+ self._browser_contexts[session_id] = context
+ return self._browser_contexts[session_id]
+
+ async def cleanup_browser_context(self, session_id):
+ """Safely cleanup browser context"""
+ if session_id in self._context_locks:
+ async with self._context_locks[session_id]:
+ if session_id in self._browser_contexts:
+ try:
+ await asyncio.shield(
+ self._browser_contexts[session_id].close()
+ )
+ except Exception as e:
+ print(f"Error cleaning up browser context: {e}")
+ finally:
+ del self._browser_contexts[session_id]
+
+ def create_session(self):
+ """Create a new session with secure ID"""
+ session_id = secrets.token_urlsafe(32) # Secure session ID
+ self.session_pool[session_id] = {
+ 'created_at': datetime.now(),
+ 'last_used': datetime.now(),
+ 'requests_count': 0
+ }
+ return session_id
+
+ def rotate_session(self, session_id):
+ """Implement session rotation logic"""
+ if self.session_pool[session_id]['requests_count'] > 100:
+ self.cleanup_session(session_id)
+ return self.create_session()
+ return session_id
+
+ def is_dynamic_page(self, html_content: str) -> Tuple[bool, Optional[str]]:
+ """Analyzes HTML content to determine if a webpage is dynamically loaded"""
+ def _check_structural_indicators(soup: BeautifulSoup) -> Dict[str, int]:
+ """Check structural indicators of dynamic content loading."""
+ scores = {
+ 'empty_containers': 0,
+ 'repeated_structures': 0,
+ 'api_endpoints': 0,
+ 'state_management': 0
+ }
+
+ # 1. Check for empty content containers
+ main_containers = soup.find_all(['main', 'div', 'section'],
+ class_=lambda x: x and any(term in str(x).lower()
+ for term in ['content', 'main', 'feed', 'list', 'container']))
+
+ for container in main_containers:
+ # Check if container is empty or has minimal content
+ if len(container.find_all()) < 3:
+ scores['empty_containers'] += 1
+
+ # Check for repeated similar structures (common in dynamic lists)
+ children = container.find_all(recursive=False)
+ if children:
+ first_child_class = children[0].get('class', [])
+ similar_siblings = [c for c in children[1:]
+ if c.get('class', []) == first_child_class]
+ if len(similar_siblings) > 0:
+ scores['repeated_structures'] += 1
+
+ # 2. Check for API endpoints in scripts
+ scripts = soup.find_all('script', {'src': True})
+ api_patterns = ['/api/', '/graphql', '/rest/', '/v1/', '/v2/']
+ for script in scripts:
+ if any(pattern in script['src'] for pattern in api_patterns):
+ scores['api_endpoints'] += 1
+
+ # 3. Look for state management setup
+ state_patterns = [
+ r'window\.__INITIAL_STATE__',
+ r'window\.__PRELOADED_STATE__',
+ r'__REDUX_STATE__',
+ r'__NUXT__',
+ r'__NEXT_DATA__',
+ r'window\.__data'
+ ]
+
+ inline_scripts = soup.find_all('script')
+ for script in inline_scripts:
+ if script.string:
+ for pattern in state_patterns:
+ if re.search(pattern, script.string):
+ scores['state_management'] += 1
+
+ return scores
+
+ def _check_modern_framework_indicators(soup: BeautifulSoup) -> Dict[str, int]:
+ """Check for indicators of modern web frameworks and dynamic loading patterns."""
+ scores = {
+ 'framework_roots': 0,
+ 'hydration': 0,
+ 'routing': 0
+ }
+
+ # 1. Framework-specific root elements
+ framework_roots = {
+ 'react': ['react-root', 'react-app', 'root', '__next'],
+ 'angular': ['ng-version', 'ng-app'],
+ 'vue': ['v-app', '#app', 'nuxt-app'],
+ 'modern': ['app-root', 'application', 'spa-root']
+ }
+
+ for framework, identifiers in framework_roots.items():
+ for id_value in identifiers:
+ if (soup.find(attrs={'id': re.compile(id_value, re.I)}) or
+ soup.find(attrs={'class': re.compile(id_value, re.I)}) or
+ soup.find(attrs={'data-': re.compile(id_value, re.I)})):
+ scores['framework_roots'] += 1
+
+ # 2. Check for hydration indicators
+ hydration_patterns = [
+ r'hydrate',
+ r'createRoot',
+ r'reactive',
+ r'observable'
+ ]
+
+ scripts = soup.find_all('script')
+ for script in scripts:
+ if script.string:
+ for pattern in hydration_patterns:
+ if re.search(pattern, script.string):
+ scores['hydration'] += 1
+
+ # 3. Check for dynamic routing setup
+ router_patterns = [
+ 'router-view',
+ 'router-link',
+ 'route-link',
+ 'history.push',
+ 'navigation'
+ ]
+
+ for pattern in router_patterns:
+ if soup.find(class_=re.compile(pattern, re.I)) or \
+ soup.find(id=re.compile(pattern, re.I)):
+ scores['routing'] += 1
+
+ return scores
+
+ def _check_dynamic_loading_patterns(soup: BeautifulSoup) -> Dict[str, int]:
+ """Check for various dynamic content loading patterns."""
+ scores = {
+ 'infinite_scroll': 0,
+ 'load_more_buttons': 0,
+ 'pagination': 0,
+ 'lazy_loading': 0,
+ 'loading_indicators': 0
+ }
+
+ # 1. Check for infinite scroll indicators
+ scroll_indicators = [
+ 'infinite-scroll',
+ 'data-infinite',
+ 'data-virtualized',
+ 'virtual-scroll',
+ 'scroll-container',
+ 'scroll-viewport'
+ ]
+
+ for indicator in scroll_indicators:
+ elements = soup.find_all(
+ lambda tag: any(indicator.lower() in str(v).lower()
+ for v in tag.attrs.values())
+ )
+ if elements:
+ scores['infinite_scroll'] += len(elements)
+
+ # 2. Check for load more buttons
+ button_patterns = [
+ r'load[_-]?more',
+ r'show[_-]?more',
+ r'view[_-]?more',
+ r'see[_-]?more',
+ r'more[_-]?posts',
+ r'more[_-]?results'
+ ]
+
+ for pattern in button_patterns:
+ elements = soup.find_all(
+ ['button', 'a', 'div', 'span'],
+ text=re.compile(pattern, re.I)
+ )
+ if elements:
+ scores['load_more_buttons'] += len(elements)
+
+ # 3. Check for pagination
+ pagination_patterns = [
+ 'pagination',
+ 'page-numbers',
+ 'page-nav',
+ 'page-links'
+ ]
+
+ for pattern in pagination_patterns:
+ elements = soup.find_all(class_=re.compile(pattern, re.I))
+ if elements:
+ scores['pagination'] += len(elements)
+
+ # 4. Check for lazy loading
+ lazy_patterns = ['lazy', 'data-src', 'data-lazy']
+ for pattern in lazy_patterns:
+ elements = soup.find_all(
+ lambda tag: any(pattern.lower() in str(v).lower()
+ for v in tag.attrs.values())
+ )
+ if elements:
+ scores['lazy_loading'] += len(elements)
+
+ # 5. Check for loading indicators
+ loading_patterns = [
+ 'loading',
+ 'spinner',
+ 'skeleton',
+ 'placeholder',
+ 'shimmer'
+ ]
+
+ for pattern in loading_patterns:
+ elements = soup.find_all(class_=re.compile(pattern, re.I))
+ if elements:
+ scores['loading_indicators'] += len(elements)
+
+ return scores
+
+ def _evaluate_dynamic_indicators(
+ structural: Dict[str, int],
+ framework: Dict[str, int],
+ loading: Dict[str, int]
+ ) -> Tuple[bool, Optional[str]]:
+ """Evaluate dynamic indicators and return JavaScript instructions."""
+ methods = []
+ js_snippets = []
+
+ # Infinite Scroll
+ if loading['infinite_scroll'] > 0:
+ methods.append("scroll")
+ js_snippets.append(
+ """
+window.scrollTo(0, document.body.scrollHeight);
+await new Promise(resolve => setTimeout(resolve, 1000));
+ """.strip().replace('\n', '')
+ )
+
+ # Load More Buttons
+ if loading['load_more_buttons'] > 0:
+ methods.append("button")
+ js_snippets.append(
+ """
+const button = Array.from(document.querySelectorAll('button, a, div, span')).find(
+ el => /load[_-]?more|show[_-]?more/i.test(el.textContent)
+);
+if (button) {
+ button.click();
+ await new Promise(resolve => setTimeout(resolve, 1000));
+} else {
+ console.warn("No 'Load More' button found.");
+}
+ """.strip().replace('\n', '')
+ )
+
+ # Paginated Interfaces
+ if loading.get('pagination', 0) > 0:
+ methods.append("pagination")
+ js_snippets.append(
+ """
+ const nextPage = document.querySelector('a[rel="next"], .pagination-next, .page-next');
+if (nextPage) {
+ nextPage.click();
+ await new Promise(resolve => setTimeout(resolve, 1000));
+} else {
+ console.warn("No pagination link found.");
+}
+ """.strip().replace('\n', '')
+ )
+
+ # Lazy Loading
+ if loading.get('lazy_loading', 0) > 0:
+ methods.append("lazy")
+ js_snippets.append(
+ """
+if (window.__INITIAL_STATE__ || window.__REDUX_STATE__ || window.__NUXT__ || window.__NEXT_DATA__) {
+ console.log('Framework state detected. Consider monitoring network requests for further actions.');
+}
+ """.strip().replace('\n', '')
+ )
+
+ # Framework and State Management Indicators
+ if framework['framework_roots'] > 0 or structural['state_management'] > 0:
+ methods.append("stateful")
+ js_snippets.append(
+ """
+if (window.__INITIAL_STATE__ || window.__REDUX_STATE__ || window.__NUXT__ || window.__NEXT_DATA__) {
+ console.log('Detected stateful framework data loading.');
+ }
+ """.strip().replace('\n', '')
+ )
+
+ # API-Driven Content
+ if structural['api_endpoints'] > 0:
+ methods.append("api")
+ js_snippets.append(
+ """
+console.log('API requests detected. Use browser devtools to inspect network activity for specific endpoints.');
+ """.strip().replace('\n', '')
+ )
+
+ # Aggregate and finalize
+ if methods:
+ js_code = "\n".join(js_snippets)
+ return True, js_code
+
+ return False, None
+
+ # Main execution
+ soup = BeautifulSoup(html_content, 'html.parser')
+
+ # Run all checks
+ structural_scores = _check_structural_indicators(soup)
+ framework_scores = _check_modern_framework_indicators(soup)
+ loading_scores = _check_dynamic_loading_patterns(soup)
+
+ # Evaluate results
+ return _evaluate_dynamic_indicators(structural_scores, framework_scores, loading_scores)
+
+ async def crawl(
+ self,
+ url,
+ depth=2,
+ max_pages=5,
+ session_id=None,
+ human_simulation=True,
+ rotate_user_agent=True,
+ rotate_proxy=True,
+ return_html=False
+ ):
+ if not session_id:
+ session_id = self.create_session()
+
+ session_id = self.rotate_session(session_id)
+
+ # List of rotating user agents
+ user_agents = [
+ 'Chrome/115.0.0.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
+ 'Chrome/115.0.0.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
+ 'Chrome/115.0.0.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
+ 'Chrome/115.0.0.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
+ 'Chrome/115.0.0.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
+ ]
+
+ # List of rotating proxies
+ proxies = [
+ "http://50.62.183.123:80",
+ "http://104.129.60.84:6516",
+ "http://156.228.118.163:3128",
+ "http://142.111.104.97:6107",
+ "http://156.228.99.99:3128"
+ ]
+
+ try:
+ async with self.crawler as crawler:
+ # Rotate user agent and optimize headers for each attempt
+ headers = {
+ "User-Agent": random.choice(user_agents) if rotate_user_agent else user_agents[0],
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
+ "Accept-Language": "en-US,en;q=0.5",
+ "Accept-Encoding": "gzip, deflate",
+ "Connection": "keep-alive",
+ "Upgrade-Insecure-Requests": "1",
+ "Sec-Fetch-Dest": "document",
+ "Sec-Fetch-Mode": "navigate",
+ "Sec-Fetch-Site": "none",
+ "Sec-Fetch-User": "?1",
+ "Cache-Control": "max-age=0"
+ }
+
+ # Update crawler headers for rotation
+ crawler.crawler_strategy.headers = headers
+
+ if rotate_proxy:
+ # Update crawler proxy for rotation
+ crawler.crawler_strategy.proxy = random.choice(proxies)
+
+ result_1 = await crawler.arun(
+ session_id=session_id,
+ url=url,
+ magic=True if human_simulation else False,
+ simulate_user=True if human_simulation else False,
+ override_navigator=True if human_simulation else False,
+ depth=depth,
+ max_pages=max_pages,
+ bypass_cache=True,
+ remove_overlay_elements=True,
+ delay_before_retrieve_html=1.0,
+ verbose=self.verbose
+ )
+
+ # Update session metrics
+ self.session_pool[session_id]['requests_count'] += 1
+ self.session_pool[session_id]['last_used'] = datetime.now()
+
+ if result_1.success:
+ if hasattr(result_1, 'html'):
+ success, js_code = self.is_dynamic_page(result_1.html)
+
+ if success:
+ async with crawler as crawler:
+ # Update crawler headers for rotation
+ crawler.crawler_strategy.headers = headers
+
+ if rotate_proxy:
+ # Update crawler proxy for rotation
+ crawler.crawler_strategy.proxy = random.choice(proxies)
+
+ print(f"Executing JS code: {js_code}")
+ result_2 = await crawler.arun(
+ session_id=session_id,
+ url=url,
+ magic=True if human_simulation else False,
+ simulate_user=True if human_simulation else False,
+ override_navigator=True if human_simulation else False,
+ depth=depth,
+ max_pages=max_pages,
+ js_code=js_code,
+ bypass_cache=True,
+ remove_overlay_elements=True,
+ delay_before_retrieve_html=1.0,
+ verbose=self.verbose
+ )
+
+ if result_2.success:
+ result = result_2
+ else:
+ result = result_1
+
+ # Update session metrics
+ self.session_pool[session_id]['requests_count'] += 1
+ self.session_pool[session_id]['last_used'] = datetime.now()
+
+ else:
+ result = result_1
+
+ if return_html and hasattr(result, 'html'):
+ return result.html
+ elif hasattr(result, 'fit_markdown'):
+ return result.fit_markdown
+ elif hasattr(result, 'markdown'):
+ return self.extract_content(result.markdown)
+
+ except Exception as e:
+ print(f"Error crawling {url}: {str(e)}")
+
+ return None
+
+ async def crawl_with_retry(
+ self,
+ url,
+ depth=2,
+ max_pages=5,
+ max_retries=3,
+ backoff_factor=1,
+ session_id=None,
+ human_simulation=True,
+ rotate_user_agent=True,
+ rotate_proxy=True,
+ return_html=False,
+ timeout=10.0
+ ):
+ """Crawl with retry logic and anti-blocking measures"""
+
+ async def attempt_crawl(attempt):
+ try:
+ async with async_timeout.timeout(timeout):
+ context = await self.get_browser_context(session_id)
+ return await self.crawl(
+ context,
+ url,
+ depth,
+ max_pages,
+ session_id,
+ human_simulation,
+ rotate_user_agent,
+ rotate_proxy,
+ return_html
+ )
+ except asyncio.TimeoutError:
+ print(f"Timeout on attempt {attempt} for {url}")
+ raise
+ except Exception as e:
+ print(f"Error on attempt {attempt} for {url}: {e}")
+ raise
+
+ if not self.is_valid_url(url) and not self.is_html_url(url):
+ print(f"Invalid URL: {url}")
+ return f"No web results found for query: {url}"
+
+ for attempt in range(max_retries):
+ try:
+ if attempt > 0:
+ # Add delay between retries with exponential backoff
+ delay = backoff_factor * (2 ** (attempt - 1))
+ await asyncio.sleep(delay)
+
+ return await attempt_crawl(attempt + 1)
+ except Exception as e:
+ if attempt == max_retries - 1:
+ print(f"Max retries ({max_retries}) reached for {url}")
+ return f"Failed to crawl after {max_retries} attempts: {url}"
+ continue
+
+ return f"No content found after {max_retries} attempts for: {url}"
+
+ def extract_content(self, html_content):
+ soup = BeautifulSoup(html_content, 'html.parser')
+ for script in soup(["script", "style"]):
+ script.decompose()
+ text = soup.get_text()
+ lines = (line.strip() for line in text.splitlines())
+ chunks = (phrase.strip() for line in lines for phrase in line.split(" "))
+ text = '\n'.join(chunk for chunk in chunks if chunk)
+ return text
+
+ def cleanup_session(self, session_id):
+ """Clean up a session"""
+ print(f"Cleaning up session {session_id}")
+ if session_id in self.session_pool:
+ self.crawler.crawler_strategy.kill_session(session_id)
+ del self.session_pool[session_id]
+
+ def cleanup_expired_sessions(self):
+ """Regular cleanup of expired sessions using proper time calculation"""
+ try:
+ current_time = datetime.now()
+ expired_sessions = []
+
+ for sid, data in self.session_pool.items():
+ # Calculate time difference in seconds
+ time_diff = (current_time - data['last_used']).total_seconds()
+
+ # Check if more than 1 hour (3600 seconds)
+ if time_diff > 3600:
+ expired_sessions.append(sid)
+
+ # Cleanup expired sessions
+ for session_id in expired_sessions:
+ self.cleanup_session(session_id)
+
+ except Exception as e:
+ if self.verbose:
+ print(f"Error during session cleanup: {str(e)}")
+
+ @staticmethod
+ def is_valid_url(url):
+ try:
+ result = urlparse(url)
+ return all([result.scheme, result.netloc])
+ except ValueError:
+ return False
+
+ @staticmethod
+ def is_html_url(url):
+ return url.endswith(".html") or url.endswith(".htm")
+
+class CustomCrawler:
+ def __init__(
+ self,
+ embed_model: str = "HIT-TMG/KaLM-embedding-multilingual-mini-instruct-v1",
+ max_concurrent_requests: int = 10,
+ verbose: bool = True
+ ):
+ print(f"🦀 Initializing the crawler") if verbose else None
+ time.sleep(1)
+ self.embed_model = embed_model
+ self.max_concurrent_requests = max_concurrent_requests
+ self.verbose = verbose
+ self.ua = FakeUserAgent()
+ self.semaphore = asyncio.Semaphore(self.max_concurrent_requests)
+ self.sessions = {}
+
+ # Intilizing HTML Pruners and Tokenizer
+ print(f"🔃 Loading HTML Pruners and Tokenizer with {self.embed_model}") if self.verbose else None
+ self.bm25_html_pruner = BM25HTMLPruner()
+ self.embed_html_pruner = EmbedHTMLPruner(
+ embed_model=self.embed_model,
+ local_inference=True
+ )
+ self.tokenizer = AutoTokenizer.from_pretrained(
+ self.embed_model,
+ use_fast=True,
+ trust_remote_code=True,
+ device="cuda" if torch.cuda.is_available() else "cpu"
+ )
+
+ # Get the model config and set the max context length for the model
+ print(f"🛠️ Getting model configuration for {self.embed_model}") if self.verbose else None
+ self.config = AutoConfig.from_pretrained(self.embed_model)
+ self.tokenizer.max_seq_length = self.config.max_position_embeddings
+ print(f"📏 Setting max context length to {self.tokenizer.max_seq_length}") if self.verbose else None
+
+ async def create_session(self):
+ session_id = str(uuid.uuid4())
+ timeout = aiohttp.ClientTimeout(total=600) # Set a 10-minute timeout
+ connector = aiohttp.TCPConnector(limit=self.max_concurrent_requests) # Connection pool
+ self.sessions[session_id] = aiohttp.ClientSession(timeout=timeout, connector=connector)
+ print(f"🔗 Created session: {session_id}") if self.verbose else None
+ return session_id
+
+ async def close_session(self, session_id):
+ session = self.sessions.pop(session_id, None)
+ if session:
+ await session.close()
+ print(f"🌂 Closed session: {session_id}") if self.verbose else None
+
+ async def cleanup_expired_sessions(self, expiration_time: int = 600): # Default 10 minutes
+ current_time = time.time()
+ expired_sessions = []
+ print("🔍 Checking for expired sessions") if self.verbose else None
+ for session_id, (session, creation_time) in self.sessions.items():
+ if current_time - creation_time > expiration_time:
+ expired_sessions.append(session_id)
+
+ for session_id in expired_sessions:
+ await self.close_session(session_id)
+
+ print(f"🗑️ Successfully cleaned up all expired sessions") if self.verbose else None
+
+ @make_async
+ def html_rag(
+ self,
+ query: str,
+ html: str,
+ max_context_length: int = 32000,
+ buffer: int = 2000
+ ) -> str:
+ if not html:
+ raise Exception("No HTML contents provided.")
+
+ # Validate HTML structure
+ try:
+ BeautifulSoup(html, 'html.parser')
+ except Exception as e:
+ raise Exception(f"Invalid HTML content: {e}")
+
+ prompt_for_retrieval = \
+"""Given a query, your task is to retrieve the most relevant passages that answers and/or is relevant to the query.
+
+Query:"""
+
+ self.embed_html_pruner.query_instruction_for_retrieval = prompt_for_retrieval
+
+ print(f"🧹 Pruning HTML for query: {query}") if self.verbose else None
+ cleaned_html = clean_html(html)
+ block_tree, cleaned_html = build_block_tree(cleaned_html, max_node_words=10)
+
+ block_rankings = self.bm25_html_pruner.calculate_block_rankings(query, cleaned_html, block_tree)
+
+ max_context_window = max_context_length - buffer
+ pruned_html = self.embed_html_pruner.prune_HTML(
+ cleaned_html,
+ block_tree,
+ block_rankings,
+ self.tokenizer,
+ max_context_window
+ )
+ print(f"👍 Successfully pruned HTML for query: {query}") if self.verbose else None
+ return pruned_html
+
+ async def fetch_page_contents(
+ self,
+ urls: List[str],
+ query: Optional[str] = None,
+ session_id: Optional[str] = None,
+ max_attempts: int = 3,
+ delay: float = 1.0,
+ timeout: float = 10.0,
+ return_type: str = "markdown",
+ rotate_headers: bool = True,
+ ) -> List[Optional[str]]:
+ async def fetch_single_page(url, proxies, session=None, query=query):
+ for attempt in range(max_attempts):
+ print(f"🔍 Attempt {attempt + 1}/{max_attempts}: Fetching content from {url}") if self.verbose else None
+ content = await self._fetch_page_contents(
+ url=url,
+ query=query,
+ timeout=timeout,
+ return_type=return_type,
+ rotate_headers=rotate_headers,
+ proxies=proxies,
+ session=session
+ )
+
+ if content:
+ print(f"✅ Successfully fetched content from {url}") if self.verbose else None
+ return content
+ else:
+ print(f"🚫 Failed to fetch content from {url}. Retrying in {delay} seconds...") if self.verbose else None
+ await asyncio.sleep(delay)
+
+ print(f"🚫 Failed to fetch content from {url} after {max_attempts} attempts.") if self.verbose else None
+ return None
+
+ proxy_list = self.load_proxies() # Load proxies from environment variables
+ if proxy_list:
+ proxies = proxy_list
+ else:
+ proxies = None
+
+ if not urls:
+ raise Exception("No URLs provided!")
+
+ if return_type == "fit_markdown" and query is None:
+ raise Exception("Query must be provided when return_type is 'fit_markdown'!")
+
+ if session_id: # Use existing session if provided
+ if session_id not in self.sessions:
+ raise ValueError(f"Invalid session ID: {session_id}")
+ session = self.sessions[session_id]
+ tasks = [fetch_single_page(url, proxies, session) for url in urls] # Pass session to tasks
+ else: # No session handling if session_id is None
+ tasks = [fetch_single_page(url, proxies) for url in urls] # No session passed
+
+ results = await asyncio.gather(*tasks)
+ return [result for result in results if result is not None]
+
+ async def _fetch_page_contents(
+ self,
+ url: str,
+ query: Optional[str] = None,
+ timeout: float = 10.0,
+ return_type: str = "markdown",
+ rotate_headers: bool = True,
+ proxies: Optional[List[str]] = None,
+ session: Optional[aiohttp.ClientSession] = None
+ ) -> Optional[str]:
+ async def get_content(response, return_type=return_type):
+ print(f"📄 Getting content from {url}") if self.verbose else None
+ if return_type == "html":
+ return await response.text()
+
+ response.raise_for_status()
+ content_type = response.headers.get('Content-Type', '').lower()
+
+ if 'application/pdf' in content_type:
+ content = await response.read()
+ text = self.extract_text_from_pdf(content)
+ return text
+ elif 'text/html' in content_type:
+ html_content = await response.text()
+ if return_type == "fit_markdown":
+ html_content = self.html_rag(query, html_content).wait()
+
+ soup = BeautifulSoup(html_content, "html.parser")
+ for script_or_style in soup(["script", "style"]):
+ script_or_style.decompose()
+ text = self.html_to_markdown(soup)
+ return text.strip()
+ else:
+ print(f"🚫 Unsupported content type {content_type} for URL {url}") if self.verbose else None
+ return None
+
+ headers = self.get_headers() if rotate_headers else {}
+ proxy = self.get_proxy(proxies) if proxies else None
+
+ # Split timeout into connection and processing phases
+ timeout_config = aiohttp.ClientTimeout(
+ total=None, # No total timeout
+ connect=timeout, # Connection timeout
+ sock_read=timeout # Socket read timeout
+ )
+
+ try:
+ # Use provided session if available
+ if session:
+ async with session.get(url, proxy=proxy, timeout=timeout_config, headers=headers) as response:
+ return await get_content(response)
+ # Otherwise, create a new session for each request
+ else:
+ async with aiohttp.ClientSession() as new_session:
+ async with new_session.get(url, proxy=proxy, timeout=timeout_config, headers=headers) as response:
+ return await get_content(response)
+
+ except aiohttp.ClientError as e:
+ print(f"🚫 Request Exception for {url}: {e}") if self.verbose else None
+ return None
+ except asyncio.TimeoutError as e:
+ print(f"🚫 Timeout error for {url}") if self.verbose else None
+ return None
+ except Exception as e:
+ print(f"🚫 Unexpected error fetching {url}: {e}") if self.verbose else None
+ return None
+
+ def load_proxies(self) -> Optional[List[str]]:
+ # Get all environment variables
+ env_vars = dict(os.environ)
+
+ # Load proxies from environment variables
+ proxy_pattern = re.compile(r"PROXY_\d+")
+ proxies = [env_vars[key] for key in env_vars if proxy_pattern.match(key)]
+
+ if proxies:
+ print(f"🔌 Loaded {len(proxies)} proxies from environment variables") if self.verbose else None
+ return proxies
+ else:
+ return None
+
+ def get_proxy(self, proxies: List[str]) -> str:
+ if proxies: # Check if the proxies list is not empty
+ return next(iter(proxies))
+ return None # Or raise an exception, handle differently, etc.
+
+ def get_headers(self) -> Dict[str, str]:
+ return {'User-Agent': self.ua.random}
+
+ def extract_text_from_pdf(self, pdf_content: bytes) -> str:
+ try:
+ print(f"📕 Extracting text from PDF") if self.verbose else None
+ pdf_reader = PyPDF2.PdfReader(BytesIO(pdf_content))
+ text = ''
+ for page in pdf_reader.pages:
+ text += page.extract_text()
+ print(f"💪 Successfully extracted text from PDF") if self.verbose else None
+ return text
+ except Exception as e:
+ print(f"🚫 Error extracting text from PDF: {e}") if self.verbose else None
+ return ""
+
+ def html_to_markdown(self, soup):
+ markdown_text = ""
+ print(f"📟 Converting HTML to Markdown") if self.verbose else None
+ def process_element(element, indent=0):
+ nonlocal markdown_text
+
+ if isinstance(element, NavigableString):
+ text = str(element).strip()
+ if text:
+ markdown_text += text + " "
+ return
+
+ tag = element.name
+
+ if tag == "h1":
+ markdown_text += "# " + element.text.strip() + "\n\n"
+ elif tag == "h2":
+ markdown_text += "## " + element.text.strip() + "\n\n"
+ elif tag == "h3":
+ markdown_text += "### " + element.text.strip() + "\n\n"
+ elif tag == "h4":
+ markdown_text += "#### " + element.text.strip() + "\n\n"
+ elif tag == "h5":
+ markdown_text += "##### " + element.text.strip() + "\n\n"
+ elif tag == "h6":
+ markdown_text += "###### " + element.text.strip() + "\n\n"
+ elif tag == "p":
+ markdown_text += element.text.strip() + "\n\n"
+ elif tag == "br":
+ markdown_text += "\n"
+ elif tag == "ul":
+ for li in element.find_all("li", recursive=False):
+ markdown_text += " " * indent + "- "
+ process_element(li, indent + 1)
+ markdown_text += "\n"
+ markdown_text += "\n"
+ elif tag == "ol":
+ for i, li in enumerate(element.find_all("li", recursive=False), 1):
+ markdown_text += " " * indent + f"{i}. "
+ process_element(li, indent + 1)
+ markdown_text += "\n"
+ markdown_text += "\n"
+ elif tag == "table":
+ rows = element.find_all("tr")
+ for row in rows:
+ cells = row.find_all(["td", "th"])
+ row_text = [cell.text.strip() for cell in cells]
+ markdown_text += "| " + " | ".join(row_text) + " |\n"
+ if row == rows[0]: # Header row separator
+ markdown_text += "| " + " | ".join(["---"] * len(cells)) + " |\n"
+ markdown_text += "\n"
+ elif tag == "blockquote":
+ markdown_text += "> " + element.text.strip().replace("\n", "\n> ") + "\n\n"
+ elif tag == "strong" or tag == "b":
+ markdown_text += "**" + element.text.strip() + "**"
+ elif tag == "em" or tag == "i":
+ markdown_text += "*" + element.text.strip() + "*"
+ elif tag == "code":
+ markdown_text += "`" + element.text.strip() + "`"
+ elif tag == "pre":
+ markdown_text += "```\n" + element.text + "\n```\n\n"
+ elif tag == "hr":
+ markdown_text += "---\n\n"
+ else:
+ for child in element.children:
+ process_element(child, indent)
+
+ process_element(soup)
+ print(f"👌 Successfully converted HTML to Markdown") if self.verbose else None
+ return markdown_text
+
+if __name__ == "__main__":
+ import time
+ import winloop
+
+ URLS = [
+ "https://en.wikipedia.org/wiki/Treaty_Principles_Bill#:~:text=The%20Treaty%20Principles%20Bill%2C%20or,of%20the%20Treaty%20of%20Waitangi.",
+ "https://www.parliament.nz/en/pb/sc/make-a-submission/document/54SCJUST_SCF_227E6D0B-E632-42EB-CFFE-08DCFEB826C6/principles-of-the-treaty-of-waitangi-bill",
+ "https://en.wikipedia.org/wiki/Waitangi_Tribunal",
+ "https://aljazeera.com/news/2024/11/19/why-are-new-zealands-maori-protesting-over-colonial-era-treaty-bill",
+ "https://downiewenjack.ca/treaty-of-waitangi-treaty-principles-bill/"
+ ]# * 10 # Make 50 requests
+
+ query = "What is the Treaty of Waitangi Bill?"
+ loop = asyncio.get_event_loop()
+ custom_crawler = CustomCrawler(max_concurrent_requests=1000)
+ session_id = loop.run_until_complete(custom_crawler.create_session())
+ start = time.perf_counter()
+ winloop.install()
+ result = loop.run_until_complete(custom_crawler.fetch_page_contents(
+ URLS,
+ query,
+ session_id=session_id,
+ timeout=20,
+ max_attempts=1,
+ return_type="fit_markdown",
+ )
+ )
+ end = time.perf_counter()
+ loop.run_until_complete(custom_crawler.close_session(session_id))
+ loop.run_until_complete(custom_crawler.cleanup_expired_sessions())
+ print("\n\n".join([f"Document {i+1}:\n\n{result[i]}" for i in range(len(result))]))
+ print(f"\n\nTime taken: {end - start} seconds")
diff --git a/src/evaluation/__init__.py b/src/evaluation/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/evaluation/evaluator.py b/src/evaluation/evaluator.py
new file mode 100644
index 0000000000000000000000000000000000000000..d0bafb7507b5e4dbb7b1454285847703bf8dab75
--- /dev/null
+++ b/src/evaluation/evaluator.py
@@ -0,0 +1,9752 @@
+from deepeval.test_case import LLMTestCase, LLMTestCaseParams
+from deepeval.metrics import (
+ GEval,
+ BiasMetric,
+ ToxicityMetric,
+ FaithfulnessMetric,
+ HallucinationMetric,
+ AnswerRelevancyMetric,
+ ContextualRelevancyMetric
+)
+from src.evaluation.wrapper.langchain_wrapper import LangChainWrapper
+import asyncio
+
+class Evaluator:
+ def __init__(self, verbose: bool = False):
+ self.verbose = verbose
+ self.model = LangChainWrapper()
+ self.metrics = [
+ BiasMetric(model=self.model, verbose_mode=self.verbose),
+ ToxicityMetric(model=self.model, verbose_mode=self.verbose),
+ GEval(
+ name="Answer Correctness",
+ criteria="Determine if the answer is factually correct based on the actual output.",
+ evaluation_params=[LLMTestCaseParams.INPUT, LLMTestCaseParams.ACTUAL_OUTPUT],
+ model=self.model,
+ verbose_mode=self.verbose,
+ _include_g_eval_suffix=False
+ ),
+ GEval(
+ name="Summarization",
+ criteria="Determine the balance between conciseness and detail of the response based on the query and its answer, with conciseness being the goal and thus being scored higher.",
+ evaluation_params=[LLMTestCaseParams.INPUT, LLMTestCaseParams.ACTUAL_OUTPUT],
+ model=self.model,
+ verbose_mode=self.verbose,
+ _include_g_eval_suffix=False
+ ),
+ FaithfulnessMetric(model=self.model, verbose_mode=self.verbose),
+ HallucinationMetric(model=self.model, verbose_mode=self.verbose),
+ AnswerRelevancyMetric(model=self.model, verbose_mode=self.verbose),
+ ContextualRelevancyMetric(model=self.model, verbose_mode=self.verbose),
+ GEval(
+ name="Contextual Recall",
+ criteria="Determine how much of the context is actually used in the response based on the input, actual output, and retrieval context. In other words, how much of the context is actually used to answer the query.",
+ evaluation_params=[LLMTestCaseParams.INPUT, LLMTestCaseParams.ACTUAL_OUTPUT, LLMTestCaseParams.RETRIEVAL_CONTEXT],
+ model=self.model,
+ verbose_mode=self.verbose,
+ _include_g_eval_suffix=False
+ )
+ ]
+
+ async def evaluate_response(
+ self,
+ query,
+ response,
+ context=[],
+ include_metrics=[],
+ exclude_metrics=[],
+ ):
+ async def evaluate_metric_with_retry(metric, data):
+ try:
+ await metric.a_measure(data)
+ except Exception as e:
+ print(f"Error evaluating metric {metric.__name__}: {e}")
+ raise
+
+ if include_metrics and exclude_metrics:
+ raise Exception("Include and exclude metrics cannot be used together.")
+ elif not include_metrics and not exclude_metrics:
+ metrics_to_evaluate = self.metrics
+ elif include_metrics:
+ metrics_to_evaluate = [m for m in self.metrics if m.__name__.lower() in include_metrics]
+ elif exclude_metrics:
+ metrics_to_evaluate = [m for m in self.metrics if m.__name__.lower() not in exclude_metrics]
+
+ data = LLMTestCase(
+ input=query,
+ actual_output=response,
+ context=context,
+ retrieval_context=context
+ )
+
+ await asyncio.gather(*[evaluate_metric_with_retry(metric, data) for metric in metrics_to_evaluate])
+
+ results = {}
+ for metric in metrics_to_evaluate:
+ results[metric.__name__.lower()] = {'score': metric.score, 'reason': metric.reason}
+
+ return results
+
+ def is_satisfactory(self, evaluation, include_metrics=[], exclude_metrics=[], thresholds=[]):
+ if include_metrics and exclude_metrics:
+ raise Exception("Include and exclude metrics cannot be used together.")
+ elif not include_metrics and not exclude_metrics:
+ metrics = self.metrics
+ elif include_metrics:
+ metrics = [m for m in self.metrics if m.__name__.lower() in include_metrics]
+ elif exclude_metrics:
+ metrics = [m for m in self.metrics if m.__name__.lower() not in exclude_metrics]
+
+ if not thresholds:
+ raise Exception("Thresholds are required for evaluation.")
+ if len(thresholds) != len(metrics):
+ raise Exception("Thresholds and metrics must have the same length and be in the same order.")
+
+ for metric, threshold in zip(metrics, thresholds):
+ if evaluation.get(metric, {}).get('score', 0) < threshold:
+ return False
+
+ return True
+
+ def should_respond(self, satisfactory: bool):
+ if satisfactory:
+ return "The response is satisfactory."
+ else:
+ return "The response is unsatisfactory and has been discarded. I apologize for the inconvenience!"
+
+if __name__ == "__main__":
+ import time
+ import asyncio
+ from dotenv import load_dotenv
+
+ load_dotenv()
+
+ evaluator = Evaluator()
+ context = [
+ """- Immigration ** - Canada Immigration Overview
+ - Express Entry Overview - Express Entry for Skilled Immigration
+ - Canada Express Entry Draws 2024
+ - Comprehensive Ranking System (CRS)
+ - Express Entry Invitations to Apply (ITAs)
+
+
+ - Federal Skilled Worker - Federal Skilled Worker Program Eligible Occupations
+
+
+ - Federal Skilled Trades Program
+ - Canadian Experience Class
+ - Provincial Immigration - Overview
+ - Alberta
+ - British Columbia
+ - Manitoba
+ - New Brunswick
+ - Newfoundland
+ - Northwest Territories and Nunavut
+ - Nova Scotia
+ - Ontario
+ - Prince Edward Island
+ - Quebec
+ - Saskatchewan
+ - Yukon
+ - Atlantic Immigration Program
+
+
+ - Quebec Immigration - Quebec Skilled Worker Immigration
+ - Quebec Experience Class (PEQ)
+ - Quebec Business Immigration
+
+
+ - Pilot Immigration Programs - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+
+
+ - Sponsorship Immigration - Overview
+ - Sponsor Your Spouse or Common-Law Partner
+ - Sponsor Your Parents & Grandparents
+ - Parents and Grandparents Super Visa
+ - Sponsor your children
+ - Sponsorship of Adopted Children
+
+
+ - Refugee Immigration
+
+
+- Business ** - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work ** - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study ** - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Comprehensive Guide to Canada’s Post-Graduation Work Permit (PGWP) For 2025
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit ** - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship ** - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources ** - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+****- About - About Us
+ - Advertising Disclosure
+ - Editorial Code of Conduct
+
+
+- Immigration - Canada Immigration Overview
+ - Express Entry Overview - Express Entry for Skilled Immigration
+ - Canada Express Entry Draws 2024
+ - Comprehensive Ranking System (CRS)
+ - Express Entry Invitations to Apply (ITAs)
+
+
+ - Federal Skilled Worker - Federal Skilled Worker Program Eligible Occupations
+
+
+ - Federal Skilled Trades Program
+ - Canadian Experience Class
+ - Provincial Immigration - Overview
+ - Alberta
+ - British Columbia
+ - Manitoba
+ - New Brunswick
+ - Newfoundland
+ - Northwest Territories and Nunavut
+ - Nova Scotia
+ - Ontario
+ - Prince Edward Island
+ - Quebec
+ - Saskatchewan
+ - Yukon
+ - Atlantic Immigration Program
+
+
+ - Quebec Immigration - Quebec Skilled Worker Immigration
+ - Quebec Experience Class (PEQ)
+ - Quebec Business Immigration
+
+
+ - Pilot Immigration Programs - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+
+
+ - Sponsorship Immigration - Overview
+ - Sponsor Your Spouse or Common-Law Partner
+ - Sponsor Your Parents & Grandparents
+ - Parents and Grandparents Super Visa
+ - Sponsor your children
+ - Sponsorship of Adopted Children
+
+
+ - Refugee Immigration
+
+
+- Business - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Comprehensive Guide to Canada’s Post-Graduation Work Permit (PGWP) For 2025
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+# Nova Scotia Immigration
+
+- Colin R. Singer
+- **February 17, 2023
+
+
+The Nova Scotia Nominee Program (NSNP) targets prospective immigrants who have the skills and experience to boost the province’s economy and tackle demographic challenges.
+
+Candidates who meet the criteria of one of nine different streams can be nominated for Nova Scotia immigration, with a target processing time of three months.
+
+The nine streams are:
+
+1. Nova Scotia Experience: Express Entry
+2. Nova Scotia Labour Market Priorities: Express Entry
+3. Nova Scotia Labour Market Priorities For Physicians: Express Entry
+4. Skilled Worker
+5. Physician
+6. Occupations In Demand
+7. International Graduates In Demand
+8. Entrepreneur
+9. International Graduate Entrepreneur
+
+Nova Scotia also welcomes immigrants through the joint federal-provincial Atlantic Immigration Program.
+
+Furthermore, the province operates ‘Study and Stay’, a program specifically aimed at helping international students from China, India and the Philippines stay and build careers in the region after they graduate.
+
+The province previously operated a Nova Scotia Demand: Express Entry stream, but this was closed permanently as of January 4, 2021.
+
+---
+
+### Latest Nova Scotia Immigration News
+
+[catlist name=nova-scotia numberposts=4]
+
+---
+
+### Nova Scotia Immigration Draws
+
+[catlist name=Nova-Scotia-Draws numberposts=4]
+
+---
+
+### 1. Nova Scotia Experience: Express Entry
+
+High skilled immigrants with experience in Nova Scotia qualify under the Nova Scotia Experience: Express Entry stream. As a core requirement, candidates require one year of experience in a National Occupational Classification (NOC) TEER category 0, 1, 2, or 3 position.
+
+Eligibility Requirements: Nova Scotia Experience: Express Entry
+
+- At least one year of work experience in Nova Scotia.
+- Be 21 to 55 years old.
+- Canadian high school graduate or equivalent.
+- Language proficiency in English or French: Canadian Language Benchmark (CLB) 7 for skilled work in NOC TEER 0 and 1, CLB 5 for NOC TEER 2 and 3 jobs.
+- Register a profile in the federal government Canada Express Entry pool.
+
+### 2. Nova Scotia Labour Market Priorities: Express Entry
+
+The Labour Market Priorities stream is designed to allow the province to single out specific occupations for immigration.
+
+Candidates must:
+
+- Receive a Letter of Interest from the Nova Scotia Nominee Program within the Express Entry system.
+- Meet the minimum work experience requirements of the Express Entry stream for which you have qualified.
+- Demonstrate sufficient funds to successfully establish yourself and your family in Nova Scotia and to pay your immigration costs and travel expenses.
+- Have legal status in your current country of residence.
+- Meet eligibility criteria in place at the time you are issued a Letter of Interest.
+
+### 3. Nova Scotia Labour Market Priorities For Physicians: Express Entry
+
+The Nova Scotia Labour Market Priorities For Physicians stream allows the province to select candidates who are qualified doctors from the federal Express Entry pool.
+
+The stream specifically targets two National Occupational Classification (NOC) codes:
+
+1. NOC 31102: Family Physicians
+2. NOC 31100 and 31101: Specialist Physicians
+
+Requirements: Nova Scotia Labour Market Priorities for Physicians
+
+- Have an approved job offer from Nova Scotia Health Authority or the IWK Health Centre as either a Family Physician (NOC 31102) or a Specialist Physician (NOC 31100, 31101).
+- Commit to live and work in Nova Scotia for a minimum period of two years.
+- Receive a Letter of Interest from the NSNP through Express Entry.
+- Submit your application within 30 calendar days of the issue date of the Letter of Interest.
+- Meet the minimum work experience requirements of the Express Entry-linked program for which you have qualified.
+- Demonstrate sufficient funds to establish yourself and your family in Nova Scotia.
+- Have legal status in your current country of residence.
+
+### 4. Skilled Worker
+
+The employer-driven Skilled Worker stream is aimed at foreign workers and international graduates. Employers who have been unable to fill positions with Canadian citizens or permanent residents can access the stream after receiving a positive Labour Market Impact Assessment (LMIA).
+
+Candidate Requirements
+
+- Full-time permanent job offer from a Nova Scotia employer.
+- At least one year of work experience related to the job (semi-skilled and low-skilled workers must have six months of experience with the job-offering employer).
+- Be aged between 21 and 55.
+- Minimum high school diploma.
+- Appropriate training, skills and/or accreditation, if required.
+- Language ability in English or French equal to Canadian Language Benchmark (CLB) Level 5 for skilled workers, CLB Level 4 for semi-skilled and low-skilled workers.
+- Financial resources to successfully settle in Nova Scotia.
+
+---
+
+### 5. Occupations In Demand
+
+Nova Scotia’s Occupations in Demand Pilot targets intermediate-skilled jobs in high demand in the province.
+
+The target occupations are subject to change depending on labour market demand. It specifically targets jobs under National Occupational Classification (NOC) TEER category 3, 4 or 5.
+
+Nova Scotia Occupations in Demand Requirements
+
+- Full-time permanent job offer from a Nova Scotia employer in: - NOC 33102 (Nurse Aides)
+ - NOC 65200 (Food and beverage servers)
+ - NOC 65201 (Food counter attendants, kitchen helpers and related support occupations)
+ - NOC 65310 (Light duty cleaners)
+ - NOC 73300 (Transport truck drivers)
+ - NOC 73400 (Heavy equipment operators)
+ - NOC 75110 (Construction trades helpers and labourers)
+
+
+- One year of work experience related to the job.
+- Be aged 21 to 55.
+- High school diploma.
+- Appropriate training, skills and/or accreditation for the job.
+- Prove language ability equal to Canadian Language Benchmark (CLB) Level 4 even if your first language is English or French.
+- Show financial resources to successfully settle in Nova Scotia.
+
+---
+
+### 6. Physician
+
+The Nova Scotia Physician Stream assists the province’s public health system to hire general practitioners, family physicians, and specialist physicians. It is designed to help recruit and retain doctors for positions the province has been unable to fill with a Canadian citizen or permanent resident.
+
+Requirements
+
+Legal Status in Country of Residence
+
+If you are living in Canada, you must provide proof of your legal status as a temporary worker or visitor.
+
+If you apply from outside Canada, you must provide proof that you have legal status in your country of residence.
+
+If you have lost your status, you are not eligible to apply until your status has been restored.
+
+Job Offer
+
+Written approved opportunity with the Nova Scotia Health Authority (NSHA) or the Izaak Walton Killam Health Centre as a:
+
+1. NOC 31102: Family Physicians
+2. NOC 31100 and 31101: Specialist Physicians
+
+The approved opportunity must be on official NSHA or IWK letterhead and must:
+
+- Be signed and dated by a person authorized to hire physicians at the NSHA or IWK
+- Be signed and dated by the applicant who is accepting the opportunity
+- Indicate eligibility for licensure with the College of Physicians and Surgeons of NS
+- Indicate that the applicant is eligible to apply for privileges and credentials with NSHA and the IWK
+
+Education and Training
+
+A copy of an Education Credential Assessment or proof of education and medical training required for licensure in Nova Scotia.
+
+Language Ability
+
+The ability to perform the job in one of Canada’s official languages as evidenced by an employment offer from the NSHA or the IWK.
+
+---
+
+### 7. International Graduates in Demand
+
+Nova Scotia’s International Graduates in Demand stream targets international; graduates with a permanent job offer in one of two National Occupational Classification codes:
+
+1. NOC 33102: nurse aides, orderlies, and patient service associates
+2. NOC 42202: early childhood educators and assistants
+
+International Graduates in Demand Stream: Requirements
+
+- Full-time permanent job offer from a Nova Scotia employer in NOC 33102 or 42202 that corresponds with your recent field of study.
+- Be aged 21 to 55.
+- High school diploma.
+- Complete a course of study within three years of your application of at least 30 weeks in length with at least 50 percent in Nova Scotia.
+- Candidates under NOC 33102: Program must grant a certificate, diploma, or degree.
+- Candidates under NOC 42202: Program must grant a diploma or degree.
+- Certifications issued by NS regulatory bodies required for the job.
+- Language ability equal to Canadian Language Benchmark (CLB) Level 5 in English or French.
+- Financial resources to successfully settle in Nova Scotia.
+
+---
+
+### 8. Entrepreneur
+
+The Nova Scotia Entrepreneur stream targets candidates with business ownership or senior management experience. They must live in Nova Scotia, either start a new business or buy an existing business, and actively participate in the day-to-day management of that business.
+
+Under the Entrepreneur stream, candidates are first issued a temporary work permit before applying for permanent residence after operating the business for a year. The stream uses an Expression of Interest format, where candidates in a pool are invited to apply.
+
+Entrepreneur Stream: Steps
+
+1. Expression of Interest
+2. Invitation to Apply
+3. In Person Interview and Business Performance Agreement
+4. Work Permit and Business Establishment in Nova Scotia
+5. Request for Nomination
+6. Apply for Permanent Residence
+
+Entrepreneur Stream: Candidate Requirements
+
+- Be aged 21 or older.
+- Want to live permanently in Nova Scotia while owning and actively managing a Nova Scotia business.
+- Minimum net worth of $600,000.
+- Minimum investment of $150,000 to establish or purchase a business in Nova Scotia.
+- Minimum 3 years of experience actively managing and owning a business (33 per cent ownership minimum) OR more than 5 years of experience in a senior business management role.
+- Score minimum of 5 on the Canadian Language Benchmark in speaking, listening, reading and writing in English or French.
+
+### 9. International Graduate Entrepreneur
+
+The International Graduate Entrepreneur stream is similar to the Entrepreneur stream, only aimed at recent graduates from a Nova Scotia university or the Nova Scotia Community College. They must have started or purchased a Nova Scotia business and operated it for a year on a Post-Graduation Work Permit.
+
+Candidates are nominated for permanent residence if they intend to settle in the province. The stream works on an Expression of Interest format similar to the Entrepreneur stream.
+
+International Graduate Entrepreneur: Steps
+
+1. Expression of Interest
+2. Invitation to Apply
+3. In-Person Interview and Nomination
+4. Apply for Permanent Residence
+
+International Graduate Entrepreneur Stream: Candidate Requirements
+
+- Want to live permanently in Nova Scotia while owning and actively managing a Nova Scotia business.
+- Minimum one year of continuous experience actively managing and owning your current Nova Scotia business (100 per cent ownership).
+- Have completed a degree or diploma including minimum 2 academic years of full-time, in-person study at a Nova Scotia university or the Nova Scotia Community College.
+- Valid post-graduation work permit.
+- Minimum score of 7 on the Canadian Language Benchmark in speaking, listening, reading and writing in English or French.
+
+---
+
+### Choose a province to learn more about Provincial Nominee Programs
+
+
+
+
+
+Advertisement #### Colin R. Singer
+
+Colin R. Singer, Managing Partner of immigration.ca, is a licensed immigration lawyer in Canada with Barreau du Quebec, for the past 30+ years. - Tags: Canada , Express Entry , Immigration , Nova Scotia Nominee Program , Permanent Resident , skilled worker , trades worker
+
+**************### Related articles
+
+##### PEI PNP Draw: Province Targets Manufacturing, Healthcare and Construction
+
+Read More » Colin R. Singer November 28, 2024 ##### Ontario Express Entry Draw: 243 French-Speaking Skilled Workers Invited
+
+Read More » Colin R. Singer September 27, 2024 Provincial Immigration - Provincial Immigration Overview
+- Ontario Immigration 2025
+- Quebec Immigration
+- Alberta Immigration
+- British Columbia Immigration
+- Manitoba Immigration
+- New Brunswick Immigration
+- Newfoundland Immigration
+- Nova Scotia Immigration
+- Saskatchewan Immigration
+- Yukon Immigration
+- Prince Edward Island Immigration
+- Northwest Territories and Nunavut Immigration
+- Atlantic Immigration
+
+Subscribe to our Latest Newsletter Latest News - Canadian CV guide – dos and don’ts for 2025: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+November 28, 2024
+- Manitoba Issues First Region-Specific Invitations In First Canada Immigration Draw of 2025
+January 10, 2025
+- Canadian job search guide to making the most of your time
+January 10, 2025
+- Key Canada Tax Changes Affecting Start-Up Visa Candidates in 2025
+January 10, 2025
+- What to Expect from Canada Express Entry Immigration in 2025
+January 9, 2025
+- Second Express Entry Draw of 2025: Canada Invites 1,350 Candidates in Canadian Experience Class
+January 8, 2025
+- The Impact of Justin Trudeau’s Departure on Canada’s Future Immigration Policies
+January 8, 2025
+
+## Useful Links
+
+- **Free Immigration to Canada Evaluation
+- **Sign-up for Canadian Immigration Newsletters
+- **Canadian Citizenship Requirements
+- **Canada Work Visa – Work in Canada
+- **Canada Visitor Visa Guide
+- **12 Ways You Can Immigrate To Canada
+
+## Help
+
+- **Book an Immigration Consultation
+- **Contact Us
+- **Disclaimer
+- **Privacy Policy
+- **Fraud alert
+
+Linkedin **Facebook **Instagram **Youtube **Twitter **Podcast **Go to Top
+
+
+
+Document 1:
+html Start Preload scrips from tracking section Google Tag Manager End Google Tag Manager END Preload scrips from tracking section Meta Pixel Code End Meta Pixel Code Ontario Entrepreneur Stream Business Immigration | Canadavisa.com **1. **Home
+2. Immigrate
+3. Provincial Nominee Program (PNP)
+4. Ontario PNP
+5. OINP Entrepreneur Stream
+
+# OINP Entrepreneur Stream
+
+Last updated: 25 May 2023 ---
+
+## The Ontario Immigrant Nominee Program (OINP) Entrepreneur Stream is designed to attract individuals who are looking to implement a new business initiative or buy an existing business in Ontario.
+
+Discover how you can come to Canada as a business immigrant
+
+---
+
+## Table of Contents
+
+- Application Process Overview
+- Minimum Eligibility Requirements
+- Ineligible Businesses
+- EOI Points System
+- EOI Scoring, Draws, and Processing Periods
+- Interview
+- Performance Agreement
+- Business Establishment
+- Nomination Requirements
+
+---
+
+## OINP Entrepreneur Stream Application Process Overview
+
+The OINP Entrepreneur Stream application process can be summed up as a two-phase process:
+
+Phase I:
+
+1. Prepare to submit an online Expression of Interest (EOI) .
+2. Register an online EOI with the OINP.
+3. Prepare an application to the Entrepreneur Stream (if invited to apply).
+4. Submit a complete online OINP Entrepreneur Stream application, upload all the necessary supporting documents and pay the required application fee.
+5. Attend a mandatory interview as part of the application assessment process.
+6. Sign a Performance Agreement outlining investment and job creation conditions with the OINP (if the application is approved).
+
+Phase II:
+
+1. Obtain a temporary work permit support letter to apply for a work permit with Immigration, Refugees and Citizenship Canada (IRCC) from OINP.
+2. Arrive in Ontario on a temporary work permit to establish the business and carry out the business plan . Entrepreneurs will have 20 months to establish the business in Ontario.
+3. Receive a nomination from the Government of Ontario if the conditions of the signed Performance Agreement are met.
+4. Apply for Canadian permanent residence with IRCC within six (6) months of nomination. The OINP performs post-nomination monitoring for a period of 36 months following the issuance of permanent resident status.
+
+## Minimum Eligibility Requirements
+
+### Minimum Requirements for Applicants
+
+In order to make an Expression of Interest (EOI), prospective entrepreneur applicants must:
+
+- Have at least 24 months of full-time business experience in the last 60 months as a business owner or senior manager; - If the applicant has experience as both a business owner and a senior manager, he or she must choose only ONE to use for the EOI and for the application.
+ - As a business owner, the prospective applicant must have had an active role in the business and owned at least one-third of the business.
+ - As a senior manager, the prospective applicant must have had senior decision-making responsibilities in the business.
+
+
+- Have a minimum net worth, which varies depending on where the business will be located; - For businesses located within the Greater Toronto Area (GTA), applicants must have a minimum net worth of $800,000.
+ - For businesses located outside the GTA, applicants must have a minimum net worth of $400,000.
+ - For businesses in the ICT/Digital Communications sector (regardless of where it will be located), applicants must have a minimum net worth of $400,000.
+
+
+- Provide a third-party verification report, prepared by an authorized service provider, in order to demonstrate their net worth.
+- Make a minimum personal investment, which varies depending on the location of the proposed business; - Personal investments must be made towards expenditures that are essential to the establishment and operation of the business, excluding cash, cash equivalents, working capital, or wages paid to the entrepreneur applicant or a family member.
+ - If the proposed business will be located within the GTA, applicants must make a minimum personal investment of $600,000.
+ - If the proposed business will be located outside the GTA, applicants must make a minimum personal investment of $200,000.
+ - If the proposed business will be in the ICT/Digital Communications sector (regardless of where it will be located), applicants must make a minimum personal investment of $200,000.
+
+
+- Have a minimum equity ownership of 33.3 percent (one-third);
+- For businesses located within the GTA, applicants must commit to creating at least two permanent, full-time jobs for Canadian citizens and/or permanent residents;
+- For businesses located outside the GTA, applicants must commit to creating at least one permanent, full-time job for a Canadian citizen or permanent resident; and - For businesses located within the GTA, if purchasing an existing business, the applicant must create two new full-time permanent positions in addition to the current staff.
+ - For businesses located outside the GTA, if purchasing an existing business, the applicant must create one new full-time permanent position in addition to the current staff.
+
+
+- Make at least one business-related visit to Ontario in the 12 months prior to submitting the Expression of Interest, if purchasing an existing business.
+- Be actively involved on an ongoing basis in the management of the proposed business.
+- Not invest the capital in the proposed business for the primary purpose of deriving interest, dividends or capital gains.
+
+Note: If applying with a business partner who is also seeking nomination, both the entrepreneur applicant and business partner must individually meet all the minimum requirements listed above. The applicant is only permitted to include one foreign national business partner.
+
+### Minimum Requirements for Businesses
+
+The proposed business must meet the following general requirements to participate in the Entrepreneur Stream:
+
+- The purpose of the proposed business must be to make profit through the sale of goods and/or services;
+- Primary income sources must be from active (earned) income, not passive (unearned) income;
+- The proposed business must comply with Canadian legal requirements and all regulatory industry and licensing requirements which govern its legitimate operation;
+- The proposed business must comply with all Ontario labour laws, including but not limited to employment standards, health and safety and labour relations legislation;
+- The proposed business must be considered a permanent business in Ontario; and
+- Third-party investors must be a Schedule I* or Schedule II** bank or an institutional investor.
+- The applicant must submit a business plan .
+
+* Schedule I Bank: Domestic (within Canada) banks authorized under the Bank Act to accept deposits, which may be eligible for deposit insurance provided by the Canada Deposit and Insurance Corporation.
+
+** Schedule II Bank: Foreign (outside Canada) bank subsidiaries authorized under the Bank Act to accept deposits, which may be eligible for deposit insurance provided by the Canada Deposit and Insurance Corporation. Foreign bank subsidiaries are controlled by eligible foreign institutions.
+
+Requirements for purchasing an existing business:
+
+- Any existing business must have been in continuous operation by the same owner or group of owners for the last 60 months prior to the applicant's purchase of the business; - Proof of ownership and either a letter of intent to purchase the business or sale agreement is required.
+
+
+- The purchase must completely transfer ownership from the previous owner(s) to the applicant, his or her business partner, if applicable, and/or any third-party investor(s), if applicable;
+- The proposed business must not have been previously owned/operated by current or former OINP business stream nominees;
+- The applicant must preserve all existing permanent full-time jobs and;
+- For businesses located within the GTA, if purchasing an existing business, the applicant must create two new full-time permanent positions in addition to the current staff.
+- For businesses located outside the GTA, if purchasing an existing business, the applicant must create one new full-time permanent position in addition to the current staff.
+ - The applicant must maintain, at minimum, the current wage levels and employment terms of existing staff; and
+
+
+- The proposed business plan must show how the applicant intends to grow the business.
+- At least 10% of the minimum personal investment must be allocated towards improving or expanding the business in Ontario.
+
+### Minimum Requirements for Nominations
+
+Entrepreneurs must meet the following requirements in order to be nominated once they have established the business and met the performance agreement. Successfully obtaining a nomination certificate allows applicants to make an application for Canadian permanent residence.
+
+The following criteria must be met when entrepreneurs apply for a Government of Ontario nomination after the business has been established, not when applying to the OINP Entrepreneur Stream.
+
+- Entrepreneurs must demonstrate official language proficiency at a Canadian Language Benchmark (CLB) 4 level or equivalent; - CLB 4 can be demonstrated through the following tests: International English Language Testing System (IELTS) General Test Scores, Canadian English Language Proficiency Index Program (CELPIP) for English, Test d'évaluation du français (TEF) or Test de connaissance du français (TCF) . The following is a breakdown of eligible scores under each language ability: - Listening: IELTS 4.5 | CELPIP 4 | TEF 145-180 | TCF 331-368
+ - Reading: IELTS 3.5 | CELPIP 4 | TEF 121-150 | TCF 342-374
+ - Writing: IELTS 4.0 | CELPIP 4 | TEF 181-225 | TCF 4-5
+ - Speaking: IELTS 4.0 | CELPIP 4 | TEF 181-225 | TCF 4-5
+
+
+
+
+- To meet the residency requirements of the program, applicants must be physically residing in Ontario for 75 percent (nine months out of the year) of the period in which they are establishing the business in Ontario (i.e. the performance agreement period);
+- Entrepreneurs must be actively involved in the daily management of business activities.
+
+Note: Nominees must also continue to meet the conditions of the Performance Agreement, including the information provided in the EOI and business plan, within 20 months of arriving in Ontario.
+
+## Ineligible Businesses
+
+Ontario will not process applications where there is a risk of little to no long-term economic benefit to the province. Consequently, the proposed business cannot be included in the following list of ineligible businesses.
+
+### Ineligible Businesses in the Greater Toronto Area (GTA)
+
+- Existing Franchises in Ontario (new foreign franchises expanding into Ontario are permitted)
+- Gas Stations
+- Tire Recycling
+- Scrap Metal Recycling
+- Pawnbrokers
+- Bed and Breakfasts
+- Holding Companies
+- Laundromats
+- Automated Car Wash Operations
+- Payday loan and related businesses
+- Businesses which have been previously owned/operated by current or former OINP business stream nominees
+- Businesses involved in producing, distributing or selling pornography or sexually explicit products or services, or providing sexually oriented services
+
+### Ineligible Businesses outside the GTA
+
+- Tire Recycling
+- Scrap Metal Recycling
+- Pawnbrokers
+- Holding Companies
+- Laundromats
+- Automated Car Wash Operations
+- Payday loan and related businesses
+- Businesses which have been previously owned/operated by current or former OINP business stream nominees
+- Businesses involved in producing, distributing or selling pornography or sexually explicit products or services, or providing sexually oriented services
+
+## Expression of Interest (EOI)
+
+An EOI is not an application, but rather an expression of the candidate's interest in participating in the OINP Entrepreneur Stream. If an entrepreneur candidate is invited to apply based on the EOI, he or she may submit a complete application to the Entrepreneur Stream.
+
+The EOI model functions on a self-declared points-based system, therefore applicants may claim a score based on the scoring information provided below. The total score will determine whether or not the applicant may receive an Invitation to Apply under the OINP Entrepreneur Stream.
+
+### Scoring Factors and Breakdown of Points
+
+Applicants can claim points for factors under three categories: Business Concept, Investment and Human Capital. The maximum score available is 200 points.
+
+| Scoring Sections | Points |
+| --- | --- |
+| Business Concept | 74 |
+| Investment Factors | 46 |
+| Human Capital Factors | 80 |
+| Total Points Available | 200 |
+
+### Business Concept
+
+Business Concept Factor 1: Business Model
+
+Entrepreneur candidates may claim a maximum of 15 points for the Business Model factor. The business model is a written document that outlines in detail the proposed business. The OINP Entrepreneur Stream business plan should include:
+
+- The purpose and objectives of the proposed business (what is selling, who are the customers, and how it will operate).
+- The way in which the proposed business will achieve the purpose and objective.
+- The operational and financial goals of the business.
+- The obstacles that may affect the implementation of the business plan and the achievement of the purpose, objectives and goals.
+- The entrepreneur's plan to overcome challenges that arise (i.e. sales, advertising, pricing, marketing, competition, industry regulations, cash flow/finances, market conditions, hiring the right people).
+
+Entrepreneur candidates who are invited to apply will be required to show how the proposed business will meet the minimum requirements of the OINP and the claims made in the EOI. The OINP states that the content of the business plan is more important than the length. The OINP guide outlines the following business plan sections: Executive Summary, Business Model, Regulatory Requirements, Risk Management, Financial Analysis and People Case.
+
+The OINP also provides sample business plans in the program guide.
+
+| Business Model | Points |
+| --- | --- |
+| Unsatisfactory/Unclear | 0 |
+| Fair | 7 |
+| Good | 15 |
+| Total Points Available | 15 |
+
+Business Concept Factor 2: Market Research
+
+Entrepreneur candidates may claim a maximum of 15 points for the Market Research factor. The applicant must provide a clear and comprehensive market entry strategy that outlines how their new business will be successful in Ontario. If the applicant is purchasing an existing business, they must show how the business can surge and improve under their authority. In the market research strategy, the applicant must outline the following information:
+
+- Report on any research activities coordinated in Ontario that resulted in the applicant having decided to open either a new business or purchase an existing business in the province.
+- Sum up any critical market factors and data pertaining to policies, marketing and advertising, competition and pricing acquired through the research activities and explain how the applicant proposes on overcoming those that directly affect the business.
+- Outline the target market of the proposed business as well as the trends that influence the target market of the product or service that will be offered by the proposed business.
+
+| Market Research | Points |
+| --- | --- |
+| Unsatisfactory/Unclear | 0 |
+| Fair | 7 |
+| Good | 15 |
+| Total Points Available | 15 |
+
+Business Concept Factor 3: Significant Economic Benefit and Key Sector
+
+Applicants may claim a maximum of 10 points if the proposed business is in a key sector, as determined by the Government of Ontario and they can explain how the proposed business will be economically beneficial for Ontario. These key sectors have been defined as economic priorities for Ontario:
+
+
+In order to show that the business is a benefit for the economy of Ontario, the applicant must outline how their plan lines up with provincial and regional economic development interests.
+
+| Significant Economic Benefit and Key Sector | Points |
+| --- | --- |
+| Unsatisfactory/Unclear | 0 |
+| Fair | 5 |
+| Good | 10 |
+| Total Points Available | 10 |
+
+Business Concept Factor 4: Investment Allocation
+
+Entrepreneur candidates may claim a maximum of 10 points for the Investment Allocation factor. The points are awarded based on a detailed explanation provided by the applicant on how they plan on growing the proposed business.
+
+| Investment Allocation | Points |
+| --- | --- |
+| Unsatisfactory/Unclear | 0 |
+| Fair | 5 |
+| Good | 10 |
+| Total Points Available | 10 |
+
+Business Concept Factor 5: Business Location
+
+Entrepreneur candidates may claim up to 10 points based on the location of the proposed business.
+
+The OINP uses Census Metropolitan Area (CMA) and Census Agglomeration (CA) data to divide business locations into three broad categories based on population size.
+
+CMAs and CAs are areas consisting of one or more neighbouring municipalities situated around a population centre (known as a core). A CMA is defined as having a total population, of at least 100,000 of which 50,000 or more live in the core. A CA is defined as having a core population of at least 10,000. Some locations may be part of larger categories. Therefore, individuals may find the business location is in a CMA or CA.
+
+| Business Location | Points |
+| --- | --- |
+| CMA with a population of 175,000 or more | 0 |
+| CMA or CA with a population greater than 100,000 but less than 175,000 | 5 |
+| Other location with a population of 100,000 or below | 10 |
+| Total Points Available | 10 |
+
+Business Concept Factor 6: Job Creation
+
+Applicants may claim up to 14 points based on the total number of permanent full-time jobs they will create for Canadian citizens or permanent residents within the first 20 months of establishing the business.
+
+Applicants must demonstrate that they will create at least two permanent full-time jobs for Canadian citizens or permanent residents in order to be eligible under the OINP Entrepreneur Stream, as mentioned in the above minimum requirements section. These jobs must be paid at the prevailing wage rate and must consist of a minimum of 1,560 hours of paid employment in a 12-month period.
+
+| Job Creation | Points |
+| --- | --- |
+| 1 for outside GTA or ICT/Digital Communications sector or 2 for inside GTA | 3 |
+| 3 – 4 jobs | 5 |
+| 5 or more jobs | 7 |
+| Total Points Available | 7 |
+
+If the applicant has a business partner, he or she must also create two jobs, making a total of four new jobs for the proposed business.
+
+Wage Requirements
+
+The OINP expects that all employees will receive pay for hours worked and be appropriately remunerated based on the information provided by the employer in the proposed business plan. The OINP, however, does not consider pay by piece work, bonuses, commissions, vacation pay or non-financial compensation as comprising part of an employee’s offered wage. An employer may offer an employee piece work, bonuses, commissions, or non-financial compensation in addition to base pay. In addition, the offered wage must meet or exceed the median wage established by the occupation and region as outlined on the Government of Canada's Job Bank website.
+
+Applicants may also claim up to 7 additional points under job creation, based on the NOC 0, A or B jobs the proposed business will create for Canadian citizens or permanent residents.
+
+| Creation of N0C 0, A or B Jobs | Points |
+| --- | --- |
+| 0 NOC 0, A or B job(s) | 0 |
+| 1 NOC 0, A or B job(s) | 5 |
+| 2 NOC 0, A or B job(s) | 7 |
+| Total Points Available | 7 |
+
+### Investment Factors
+
+Investment Factor 1: Net Worth
+
+Entrepreneur candidates may claim a maximum of 15 points for the Net Worth Investment factor. Personal net worth must be legally obtained and verifiable. Personal net worth includes all assets and those of the applicant's spouse or common-law partner, less any liabilities including mortgages and personal debts. Net worth must be in the applicant's and his or her spouse/common-law partner’s name.
+
+As mentioned in the minimum eligibility requirements section above, there is a minimum requirement for personal net worth to be eligible for the Entrepreneur Stream, which varies according to where the proposed business will be located.
+
+If the applicant has a Business Partner, the partner must also meet the appropriate minimum personal net worth requirement.
+
+| Personal Net Worth | Points |
+| --- | --- |
+| If the proposed business will be within the GTA | Less than $800,000 | Not eligible |
+| $800,000 to $2,499,000 | 5 |
+| More than $2,500,000 | 10 |
+| OR |
+| If the proposed businesswill be outside the GTAORIf the proposed businesswill be in the ICT/Digital Communications Sector (regardless of location) | Less than $400,000 | Not eligible |
+| $400,000 to $999,999 | 10 |
+| More than $1,000,000 | 15 |
+| Total Points Available | 15 |
+
+Investment Factor 2: Investment Amount
+
+The minimum eligible personal investment must be derived from the applicant's personal net worth. A maximum number of 25 points are awarded for the investment amount.
+
+Third parties may provide external financing beyond the minimum investment amount if they are a Schedule I or Schedule II bank or an institutional investor. Third-party personal investments are not permitted. Applicants cannot claim points for investments that will be made by a third-party.
+
+In order to be considered an eligible investment, the expenditure must be essential to the establishment and operation of a new business or to purchase, improve and operate an existing business.
+
+If the applicant is purchasing an existing business, he or she must:
+
+- Invest some funds towards improvement/expansion of the business; and
+- Note that improvement/expansion does not include regular operating expenses such as recurring inventory, wages, rent, utilities, or maintaining the same levels of marketing or advertising expenses, legal or professional fees, business licenses, etc.
+
+The following are considered ineligible investments:
+
+
+As mentioned in the minimum eligibility requirements section above, there is a minimum requirement for investment amount to be eligible for the Entrepreneur Stream, which varies according to where the proposed business will be located.
+
+If the applicant has a business partner, the partner must also meet the appropriate minimum investment amount requirement.
+
+Even though the OINP does not encourage making investments prior to the signing of the Performance Agreement, the program will accept investments made by invited candidates up to one year before the application date. Applicants must provide proof that investments were made from personal funds. The OINP notes that making an investment prior to applying does not guarantee an application's approval.
+
+| Investment Amount | Points |
+| --- | --- |
+| If the proposed business will be within the GTA | Less than $600,000 | Not eligible |
+| $600,000 to $1,499,999 | 10 |
+| $1,500,000 to $2,999,999 | 15 |
+| More than $3,000,000 | 20 |
+| OR |
+| If the proposed businesswill be outside the GTAORIf the proposed businesswill be in the ICT/Digital Communications Sector (regardless of location) | Less than $200,000 | Not eligible |
+| $200,000 to $499,999 | 15 |
+| $500,000 to $799,999 | 20 |
+| More than $800,000 | 25 |
+| Total Points Available | 25 |
+
+Investment Factor 3: Business-Related Visits
+
+Entrepreneur candidates may claim a maximum of 6 points for any business-related visits to Ontario made within the year prior to the EOI submission. There is no mandatory requirement for exploratory visits, however, if the entrepreneur purchased or is planning on purchasing an existing business, the candidate must make a business-related visit to Ontario to be considered for the OINP Entrepreneur Stream.
+
+| Business Related Visits to Ontario | Points |
+| --- | --- |
+| No | 0 |
+| Yes | 6 |
+| Total Points Available | 6 |
+
+If invited to apply to the OINP Entrepreneur Stream, applicants who claim points for business-related visits to Ontario in their EOI will be required to provide evidence of visits to Ontario, including cities/municipalities visited and the dates when entered and exited Ontario, by submitting at least three of the following forms of verification:
+
+- Flight itinerary and boarding passes;
+- Accommodation receipts;
+- Summary of meetings including the itinerary;
+- Email correspondence with any business contacts in Ontario;
+- Photographs or meeting notes from the business trip;
+- Business cards or contact information from business interactions.
+
+### Human Capital Factors
+
+Individuals may claim a maximum of 25 points for business experience. The number of points is based on the individual's past business ownership experience OR senior management experience in the 60 months prior to submitting an EOI. If the individual has both business ownership and senior management experience in 24 of the past 60 months, he or she must choose one of these experiences in the EOI. As mentioned in the minimum eligibility requirements section above, there is a minimum requirement of 36 months of experience to be eligible for the Entrepreneur Stream.
+
+If the applicant has a business partner, the partner must also demonstrate a minimum of 24 months of experience in the last 60 months.
+
+Human Capital Factor 1: Business Owner
+
+Individuals claiming points under the Business Owner factor must have owned at least 33.3 percent of the business during the period claimed as the length of experience. It must also be demonstrated that they held an active role in the business, meaning that the individual was personally involved in the day-to-day operations of the business and had direct involvement in decision-making.
+
+Human Capital Factor 2: Senior Manager
+
+The Senior Manager role must have included senior decision-making responsibilities in areas such as operations, sales, finance, marketing, distribution, human resources, research and development, etc.
+
+| Experience | Total Duration | Points |
+| --- | --- | --- |
+| Business Owner | Less than 24 months | Not eligible |
+| 24 – 47 months | 13 |
+| 48 – 59 months | 19 |
+| 60 months | 25 |
+| OR |
+| Senior Manager | Less than 24 months | Not eligible |
+| 24 – 47 months | 13 |
+| 48 – 59 months | 19 |
+| 60 months | 25 |
+| Total Points Available | 25 |
+
+Human Capital Factor 3: Specific Experience
+
+Individuals may claim up to 35 points based on their past specific experience in a high-growth business and/or in an export trade business if the experience was acquired within the last 60 months.
+
+- **High-Growth Business Experience:**experience in a business that experienced at least 20 percent increase in revenue for two consecutive years. Submission of supporting documentation (e.g. financial statements) is mandatory if the individual is invited to apply.
+- **Export Trade Business Experience:**experience in a business exporting at least 20 percent of total goods/services to a foreign market. Submission of supporting documentation (e.g. financial statements with export declarations, purchase orders, invoices) is mandatory if the individual is invited to apply.
+
+Business owners who can provide supporting documentation verifying that their business was a high-growth business or an export-trade business may claim these points.
+
+Senior managers who can provide a reference letter from the employer and/or other supporting documentation indicating that their role in the business had a direct decision-making authority or a direct impact on the high-growth activity/activities of the business may claim these points. There is no mandatory requirement for specific experience to be considered as an OINP Entrepreneur Stream candidate.
+
+| Past Specific Experience | Points |
+| --- | --- |
+| None | 0 |
+| Yes: one past specific experience | 15 |
+| Yes: two past specific experiences | 25 |
+| Yes: three past specific experiences | 35 |
+| Total Points Available | 35 |
+
+Human Capital Factor 4: Level of Education
+
+Candidates may claim a maximum of 10 points based on their highest level of education completed. There is no minimum requirement to be considered for the Entrepreneur Stream.
+
+Applicants invited to apply who are claiming to have completed six months or more of post-secondary education will be required to provide evidence of this education, including Educational Credential Assessment (ECA) results.
+
+Note: The OINP will not consider language training (such as English as a Second Language (ESL) courses) towards meeting the post-secondary requirement.
+
+| Level of Education | Points |
+| --- | --- |
+| No post-secondary education | 0 |
+| 2 Year Program (post-secondary degree or diploma) | 5 |
+| 3 Year Program (post-secondary degree or diploma) | 10 |
+| Total Points Available | 10 |
+
+Human Capital Factor 5: Official Language Ability
+
+Entrepreneur candidates may claim a maximum 10 points for the Entrepreneur Stream Official Language Ability factor. While it is not mandatory to demonstrate language abilities in English and/or French in to be considered for the Entrepreneur Stream at the time of submitting the EOI, language proficiency equivalent to Canadian Language Benchmark (CLB) 4 is required at the time of nomination by OINP. If applying with a business partner, the partner will also be required to demonstrate a minimum CLB 4 or equivalent at the time of nomination.
+
+Applicants invited to apply will be required to demonstrate their language proficiency with either International English Language Testing System (IELTS) General Test scores, Canadian English Language Proficiency Index Program (CELPIP), Test d’Evaluation de Français (TEF) or Test de Connaissance du Français (TCF Canada).
+
+| Official Language Ability | Points |
+| --- | --- |
+| None or minimal (CLB 3 or below) | 0 |
+| Basic understanding (CLB 4) | 5 |
+| Intermediate and advanced (CLB 5 or higher) | 10 |
+| Total Points Available | 10 |
+
+Find out what the 12 Canadian Language Benchmarks (CLBs) mean in terms of language ability.
+
+## Expression of Interest (EOI) Scoring, Draws, and Processing Periods
+
+Meeting all the minimum requirements does not guarantee that an applicant will be invited to apply to the OINP Entrepreneur Stream. There is no minimum score, as EOIs will be ranked against each other and only top candidates will be invited to apply. If an applicant is applying with a Business Partner, the final score will be calculated using the lowest submitted score of the two candidates. The final score will be used to rank the EOI against other EOI scores received.
+
+At the beginning of each Processing Period, a draw will occur, with only the top scoring EOI’s being selected for processing. The final “cut-off” score may vary between Processing Periods due to differences in scores submitted during respective months.
+
+EOIs not selected within 12 months from the date of receipt will be removed from the selection pool. Individuals will be able to re-apply to enter the selection pool after an EOI has been removed.
+
+## Interview
+
+The entrepreneur applicant (and the business partner, if applicable) will be required to attend a mandatory in-person interview at the OINP’s offices. The purpose of the mandatory interview is for the OINP to better understand the business plan and past experience of the applicant and business partner. Applicants and their business partners are responsible for all transportation arrangements and costs incurred associated with the interview.
+
+## Performance Agreement
+
+If the application is approved, the applicant (and Business Partner, if applicable) will be required to sign a Performance Agreement with the Government of Ontario. The Performance Agreement outlines the commitments required in order to be nominated for permanent resident status. This document will include, but may not be limited to:
+
+- A description of the business (including industry and its location);
+- The investment amounts and timelines;
+- The number and type of jobs to be created for Canadian citizens or permanent residents;
+- Mandatory business milestones and achievements (depending on the specific business); and
+- Timeframes for any commitments.
+
+Performance Agreements are unique to each applicant and are based on the information provided in the application (including the EOI), the business plan, and the interview, if applicable. Applicants who fail to satisfy the business commitments outlined in the Performance Agreement will not be eligible for nomination for permanent resident status.
+
+Once the applicant (and his or her Business Partner, if applicable) have signed the agreement, OINP will issue a Letter of Confirmation so that he or she can apply to Immigration, Refugees and Citizenship Canada (IRCC) for a temporary work permit.
+
+## Business Establishment
+
+After the Performance Agreement is signed, successful applicants must arrive in Ontario with their valid temporary work permit issued by IRCC within one year of the date of the Letter of Confirmation.
+
+After arrival in Ontario, individuals have up to 20 months to implement the business plan and meet all commitments under the Performance Agreement. Successful applicants are responsible for submitting a Final Report to the OINP between 18 and 20 months after their arrival in Ontario with a valid temporary work permit. The Final Report should demonstrate that the candidate has met all objectives set out in the Performance Agreement.
+
+The required permanent full-time jobs created by the new business must be filled within 10 months of the date of the applicant's arrival in Canada and they must remain filled for at least 10 months, up to the date that the Final Report is submitted to the OINP.
+
+The Final Report along with supporting documentation must be submitted to the OINP in order to initiate the nomination process.
+
+## Nomination Requirements
+
+Successful nominees must apply to IRCC for permanent resident status within six months of being nominated by OINP. In addition to meeting all obligations of the Performance Agreement, applicants (and their business partners, if applicable) must:
+
+- Be actively involved in the day-to-day management of the business;
+- Physically reside in Ontario for 75 percent of the year (nine months out of the year) to support the business during the performance agreement period; and
+- Demonstrate CLB 4 or higher in English or French.
+
+Federal admissibility requirements, including security and medical background checks, also apply. ##
+
+#### Discover your options for Canada business immigration
+
+
+
+
+
+
+
+### Immigrate
+
+Immigrate to Canada - Overview
+- USA to Canada Options
+- Immigrate from Nigeria
+- Immigrate from India
+- Immigrate from Pakistan
+- Immigrate from the Philippines
+- Immigrate from Kenya
+- Immigrate from Saudi Arabia
+- Immigrate from the UAE
+- Immigrate from Qatar
+- Hong Kong Options
+- Ukraine Measures
+- Study Pathways to PR
+
+Express Entry - Overview
+- Federal Skilled Worker Program
+- Canadian Experience Class
+- Federal Skilled Trades Program
+- Comprehensive Ranking System
+- Improve Your CRS Score
+- Invitations to Apply
+- Express Entry Draw Results
+
+Provincial Nominee Programs - Overview
+- Alberta
+- British Columbia
+- Manitoba
+- New Brunswick
+- Newfoundland and Labrador
+- Northwest Territories
+- Nova Scotia
+- Ontario
+- Prince Edward Island
+- Saskatchewan
+- Yukon
+
+Quebec Immigration - Overview
+- Quebec Skilled Worker Program
+- Quebec Experience Program
+- Expression of Interest System
+- Arrima Portal
+- Quebec Immigration Pilot Programs
+- Quebec Immigration Levels Plan
+
+Other Federal Economic Programs - Overview
+- Atlantic Immigration Program
+- Caregivers
+- Agri-Food Immigration Pilot
+- Rural and Northern Pilot
+- Start-Up Visa Program
+- Self-Employed Persons Program
+
+National Occupational Classification Language Test Requirements Education Credential Assessment Immigration Levels Plan About the Immigration Department About the Immigration Minister ### Latest News
+
+#### Canada's Express Entry Draw Results from August 14, 2024
+
+Immigration, Refugees and Citizenship Canada (IRCC) has conducted a second Express Entry draw this week, issuing 3,200 more Invitations to Apply (ITAs) to Canadian immigration candidates. Here are the results from IRCC's August 14 Express Entry draw.
+
+Read more... #### Canada's Express Entry Draw Results from July 31, 2024
+
+Immigration, Refugees and Citizenship Canada (IRCC) has conducted a second Express Entry draw this week. Read on for the results from the department's July 31st Express Entry draw.
+
+Read more... ### Explore your options
+
+- **I want to IMMIGRATE
+- **I want a WORK PERMIT
+- **I want to SPONSOR
+- **I want to STUDY
+- **I want to INVEST
+- **I'm new to CANADA
+- **I am an EMPLOYER
+- **I want LEGAL HELP
+- **I want to overcome INADMISSIBILITY
+
+### Canada Immigration Network
+
+- **CanadaVisa.com
+- **CICNews.com
+- **Canadian Immigration Forum
+- **Canadian Immigration News
+- **CanadaVisa News Team
+
+### Connect with us
+
+- **
+- **
+- **
+- **
+- **
+- **
+
+### Call us
+
+**+1 (514) 937-9445 ### Toll-free in U.S. and Canada
+
+**+1 (888) 947-9445 #### Subscribe to our Newsletter
+
+Subscribe CanadaVisa.com | 1303 Greene Ave., Suite 200|Westmount, Montreal, QC, Canada|H3Z 2A7
+
+© Copyright 2024 CanadaVisa.com. All Rights Reserved
+
+- Sitemap
+- Unsubscribe
+- Privacy Policy
+- Disclaimer
+- Copyright
+- Contact Us
+
+
+**× **- FREE ASSESSMENT
+- Immigrate - Immigrate to Canada - • USA to Canada Options
+ - • Immigrate from Nigeria
+ - • Immigrate from India
+ - • Immigrate from Pakistan
+ - • Immigrate from the Philippines
+ - • Immigrate from Kenya
+ - • Immigrate from Saudi Arabia
+ - • Immigrate from the UAE
+ - • Immigrate from Qatar
+ - • Hong Kong Options
+ - • Ukraine Measures
+ - • Study Pathways to PR
+
+
+ - Express Entry - • Federal Skilled Worker Program
+ - • Canadian Experience Class
+ - • Federal Skilled Trades Program
+ - • Comprehensive Ranking System
+ - • Improve Your CRS Score
+ - • Invitations to Apply
+ - • Express Entry Draw Results
+
+
+ - Provincial Nominee Programs - • Alberta
+ - • British Columbia
+ - • Manitoba
+ - • New Brunswick
+ - • Newfoundland and Labrador
+ - • Northwest Territories
+ - • Nova Scotia
+ - • Ontario
+ - • Prince Edward Island
+ - • Saskatchewan
+ - • Yukon
+
+
+ - Quebec Immigration - • Quebec Skilled Worker Program
+ - • Quebec Experience Program
+ - • Expression of Interest System
+ - • Arrima Portal
+ - • Quebec Immigration Pilot Programs
+ - • Quebec Immigration Levels Plan
+
+
+ - Other Federal Economic Programs - • Atlantic Immigration Program
+ - • Caregivers
+ - • Agri-Food Immigration Pilot
+ - • Rural and Northern Pilot
+ - • Start-Up Visa Program
+ - • Self-Employed Persons Program
+
+
+ - National Occupational Classification
+ - Language Test Requirements
+ - Education Credential Assessment
+ - Immigration Levels Plan
+ - About the Immigration Department
+ - About the Immigration Minister
+
+
+- Work - Working in Canada
+ - TFWP & IMP
+ - Work Permit Process
+ - Work without a Work Permit
+ - Get Maintained Status
+ - Business Visitors - • After Sales Service / Warranty
+ - • Entertainment Business Visitors
+ - • Tour Guides Operating in Canada
+ - • IT Workers as Business Visitors
+ - • Guest Speakers in Canada
+
+
+ - Options for H-1B Visa Holders
+ - Tech Talent Options
+ - LMIA-Exempt Work Permits (IMP) - • Canada's Free Trade Agreements
+ - • Post-Graduation Work Permits
+ - • PGWP Open Work Permit Extension
+ - • Spousal Open Work Permit
+ - • Temporary Work Permits In Quebec
+ - • International Mobility Program Plus
+ - • Significant Benefit
+ - • Intra-Company Transfers
+ - • TV and Film Production Workers
+ - • Bridging Open Work Permit
+ - • Open Work Permits
+ - • Vulnerable Workers
+ - • International Experience Canada
+ - • Athletes and Staff
+ - • Charitable or Religious Work
+
+
+ - LMIA-Based Work Permits (TFWP) - • Advertising Requirements
+ - • LMIA Advertising Exemptions
+ - • Global Talent Stream
+ - • Recognized Employer Pilot
+ - • Quebec Facilitated LMIA Processing
+ - • Quebec Acceptance Certificate
+
+
+ - Employer Compliance - • Employer Compliance (IMP)
+ - • Employer Compliance (TFWP)
+
+
+ - About ESDC
+
+
+- Sponsor - Family Class Sponsorship
+ - Spouse or Common-Law Partner - • Outland Sponsorship
+ - • Inland Sponsorship
+ - • Spousal Open Work Permit
+
+
+ - Child or Other Dependent
+ - Parents and Grandparents - • PGP Invitation to Apply
+ - • Super Visa
+
+
+ - Requirements for Each Program - • Minimum Necessary Income
+
+
+ - Get Maintained Status
+
+
+- Study - Study in Canada - • Canada Study Assessment Form
+ - • Getting Admitted
+ - • Designated Learning Institutions
+ - • Letter of Acceptance
+ - • Programs and Areas of Study
+ - • Levels of Study
+ - • Transfer Programs
+ - • Pathway Programs
+ - • Accommodation
+ - • Financial Aid
+ - • Student Health Insurance
+ - • Compliance
+
+
+ - Get a Study Permit - • Student Direct Stream
+ - • Study without a Study Permit
+ - • Study Permit Refusals
+ - • Renewing or Changing a Study Permit
+
+
+ - Study Pathways to PR
+ - Bringing your Family to Canada
+ - Working While Studying
+ - Post-Graduation Work Permits
+
+
+- Citizenship - About Canadian Citizenship - • Citizenship Eligibility
+ - • Calculate Your Citizenship Eligibility
+ - • How to Apply for Citizenship
+
+
+ - Benefits of Canadian Passport
+ - Apply for Proof of Citizenship
+ - Dual Citizenship
+ - Citizenship Ceremony
+
+
+- Inadmissibility - Overcome Inadmissibility
+ - Temporary Resident Permit - • What is a TRP?
+
+
+ - Criminal Rehabilitation - • Individual Rehabilitation
+ - • Deemed Rehabilitation
+
+
+ - Inadmissible Legal Opinion Letter - • Pre-Sentence Legal Opinion Letter
+
+
+ - Visiting with a Criminal Record
+ - DUI
+ - Marijuana
+ - Common Offences - • Entering with a Felony
+ - • Entering with a Misdemeanor
+ - • Denied Entry to Canada
+ - • Deported from USA
+ - • Serious Criminality
+ - • Airlines and Staff
+ - • Performing Artists
+ - • Travel to and from Alaska
+ - • Cross-Border Trade
+ - • Hunting and Fishing Trips
+ - • Transit Through Canada
+
+
+ - Charges Within Canada
+ - Authorization to Return to Canada
+ - Refusals and Appeals
+ - Canada Security Clearances
+ - Overcome Medical Inadmissibility
+ - eTA FAQ
+ - Canada Border Services Agency
+
+
+- Legal Help - About Cohen Immigration Law - • Our Legal Advice
+ - • Our Professional Credentials
+
+
+ - How to Avoid Fraud
+ - Workers' Rights in Canada
+ - Biometrics
+ - Temporary Resident Visas - • Electronic Travel Authorization
+ - • eTA FAQ
+
+
+ - GCMS Notes
+ - Tools and Resources - • Immigration Processing Times
+ - • Skilled Occupations by NOC
+ - • Immigration Processing Fees
+
+
+
+
+- Business - Business Immigration Overview
+ - Investors
+ - Entrepreneurs - • Federal Start-Up Visa
+ - • Quebec Entrepreneur
+
+
+ - Self-Employed - • Federal Self-Employed
+ - • Quebec Self-Employed
+
+
+ - Business Visitors
+
+
+- Life in Canada - Getting Settled in Canada - • Pre-arrival Guide
+ - • COPR
+ - • When you Arrive
+ - • What to do in your First Month
+ - • Phone and Internet
+ - • Soft Landing as a PR
+ - • PR Card - • Temporary Travel Document
+
+
+ - • PR Obligations
+
+
+ - Opening a Bank Account - • Bank with TD
+ - • Credit Cards
+ - • Saving and Investing
+ - • About Insurance in Canada
+ - • Filing your Taxes
+
+
+ - How to Find Work - • Where to Find Jobs
+ - • Networking
+ - • Writing a Canadian Resume
+ - • Preparing for Job Interviews
+ - • Bridging Programs
+ - • Workers' Rights in Canada
+
+
+ - Renting a Home
+ - Buying a Home
+ - Free Settlement Services
+ - Healthcare
+ - Education
+ - Public Transportation
+ - Driving
+ - Buying a Car
+ - Food and Grocery Options
+ - Buying Furniture
+ - How to Dress for the Weather
+ - TV and Home Entertainment
+ - Get to Know Canada - • Alberta
+ - • British Columbia
+ - • Manitoba
+ - • New Brunswick
+ - • Newfoundland and Labrador
+ - • Northwest Territories
+ - • Nova Scotia
+ - • Nunavut
+ - • Ontario
+ - • Prince Edward Island
+ - • Quebec
+ - • Saskatchewan
+ - • Yukon
+
+
+
+
+- Quick Links
+- Home
+- About
+- Forums
+- News
+- Client Portal
+- Contact
+- Advertise
+
+Google Tag Manager (noscript) End Google Tag Manager (noscript)
+
+Document 2:
+html [if lte IE 9]> End cookieyes banner Ontario Entrepreneur Stream | Canadim Google Tag Manager for WordPress by gtm4wp.com End Google Tag Manager for WordPress by gtm4wp.com This site is optimized with the Yoast SEO Premium plugin v22.7 (Yoast SEO v24.1) - https://yoast.com/wordpress/plugins/seo/ / Yoast SEO Premium plugin. Google Tag Manager for WordPress by gtm4wp.com GTM Container placement set to automatic End Google Tag Manager for WordPress by gtm4wp.com If no sidebar menu, add class "wide" to o-page and c-header - - English
+
+
+
+- About us
+- Contact us
+- Free Phone Consultation +1 (514) 989-9700
+
+- Immigrate ### Immigrate
+
+ - Immigrate to Canada
+ - Express Entry - Comprehensive Ranking System - CRS Score Calculator
+
+
+ - Express Entry Pool of Candidates
+ - Canadian Experience Class
+ - Federal Skilled Worker (FSW) Program
+ - Federal Skilled Trades
+ - Express Entry Draw
+ - When is the Next Express Entry Draw?
+ - Invitation to Apply (ITA)
+ - Electronic Application for Permanent Residence (eAPR)
+ - Proof of Funds for Express Entry
+
+
+ - Canada Provincial Nominee Programs (PNPs) - Latest PNP Draws in Canada
+ - Alberta – Provincial Nominee Programs - Farm Stream
+ - Alberta Express Entry
+ - Alberta Accelerated Tech Pathway
+ - Alberta Opportunity Stream
+ - Graduate Entrepreneur Stream
+ - Foreign Graduate Entrepreneur Stream
+
+
+ - British Columbia – Provincial Nominee Programs - Skills Immigration Stream
+ - BC PNP Tech
+ - Entrepreneur Immigration Stream
+
+
+ - Manitoba - Farm Investor Pathway
+ - Skilled Workers in Manitoba
+ - Skilled Workers Overseas
+ - International Education Stream
+ - Business Investor Stream
+
+
+ - New Brunswick - Express Entry Labour Market Stream
+ - Entrepreneurial Stream
+ - Post-Graduate Entrepreneurial Stream
+ - Skilled Worker Applicants with Employer Support
+ - New Brunswick Critical Worker Pilot
+ - New Brunswick Strategic Initiative Stream
+ - New Brunswick PNP – Information Sessions
+
+
+ - Newfoundland and Labrador - Express Entry Skilled Worker Category
+ - Skilled Worker Category
+ - International Graduate Category
+ - International Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Priority Skills NL: In-Demand Academic Path
+ - Priority Skills NL: In-Demand Work Path
+
+
+ - Northwest Territories - Express Entry
+ - Employer Driven
+ - Critical Impact Worker
+ - Skilled Worker
+ - Business Driven
+ - Entrepreneur
+
+
+ - Nova Scotia - Nova Scotia Demand: Express Entry (Closed)
+ - Nova Scotia Experience: Express Entry
+ - Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Skilled Worker Category
+ - Physician Stream
+ - Nova Scotia Labour Market Priorities
+ - Nova Scotia Labour Market Priorities for Physicians
+ - Occupations In Demand
+
+
+ - Ontario - Ontario’s Express Entry Streams
+ - Employer Job Offer
+ - Masters Graduates
+ - PhD Graduates
+ - Entrepreneur
+ - Regional Immigration Pilot
+
+
+ - Prince Edward Island - PEI PNP Express Entry
+ - Business Impact
+ - Work Permit
+ - Labour Impact
+ - Skilled Worker in PEI
+ - Skilled Worker Outside Canada
+ - Critical Worker
+ - International Graduate
+
+
+ - Saskatchewan - International Skilled Worker
+ - Saskatchewan Experience
+ - Saskatchewan Entrepreneur and Farm
+
+
+ - Yukon - Yukon Express Entry
+ - Skilled Worker
+ - Critical Impact Worker
+ - Business Nominee
+ - Yukon Community Pilot
+
+
+
+
+ - Quebec Immigration - Immigrate to Quebec
+ - Regular Skilled Worker Program (RSWP)
+ - Quebec Experience Program (PEQ)
+ - Quebec Entrepreneur Program
+ - Quebec Self-Employed Worker Program
+ - Quebec Investor Program – QIIP
+ - Certificat de Selection du Quebec (CSQ)
+ - Quebec Immigration FAQ
+
+
+ - Canada Permanent Resident (PR) - Confirmation of Permanent Residence (COPR)
+ - Permanent Resident Card (PR card)
+ - Permanent Resident Card Renewal
+ - Permanent Resident Travel Document
+ - Residency Obligations
+
+
+ - Professional & Skilled Workers - Canadian Experience Class (CEC)
+ - Federal Skilled Worker (FSW) Program
+ - Regular Skilled Worker Program (RSWP)
+
+
+ - Atlantic Immigration Program
+ - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+ - Caregiver Program Canada - Home Child Care Provider Pilot
+ - Home Support Worker Pilot
+ - Past Caregiver Programs
+
+
+ - Canada Immigration FAQ
+ - Moving to Canada From Another Country - Moving to Canada from the USA
+
+
+
+
+- Work ### Work
+
+ - Work in Canada
+ - Work without a Work Permit - Business Visitors
+
+
+ - Temporary Foreign Worker Program - Labour Market Impact Assessment (LMIA)
+ - Facilitated LMIA (Quebec) List of Occupations
+ - Canada Global Talent Stream (GTS)
+
+
+ - International Mobility Program - Intra-Company Transfers
+ - CUSMA (formerly called NAFTA) Work Permit
+ - Working with CSQ
+ - CETA Work Permits
+ - Open Work Permits - Post-Graduate Work Permit
+ - International Experience Canada
+ - Spouse Open Work Permit (SOWP) Canada
+ - Bridging Open Work Permit (BOWP) Canada
+
+
+
+
+ - Tools & Resources - Job Search Tool
+ - Social Media Presence Guide
+ - Canadian Resume Guide
+
+
+ - For Employers
+
+
+- Study ### Study
+
+ - Study & Immigrate in Canada - Study in Canada: Changes for 2024 -2026
+ - Our International Student Program
+
+
+ - Canadian Designated Learning Institutions (DLI)
+ - Levels of Study
+ - Study Permit in Canada - Student Direct Stream (SDS) Canada
+ - Provincial Attestation Letter (PAL)
+
+
+ - Certificat d’acceptation du Quebec (CAQ)
+ - Refusals and Appeals
+ - Live as a student in Canada - International Students in Canada
+ - Extend a Study Permit
+ - International Student Health Insurance in Canada - Quebec Health Insurance Plan for International Students
+
+
+ - Student Accommodation
+ - Work While Studying
+ - International Students: Spouse and Family Dependent Visa
+
+
+ - Post-Graduate Work Permit
+ - Permanent Residence (PR) for international students
+
+
+- Sponsorship ### Sponsorship
+
+ - Canada Sponsorship
+ - Spousal Sponsorship: Sponsor your Spouse or Partner for Canadian Immigration - Inland Sponsorship
+ - Outland Sponsorship
+ - Spousal Sponsorship Quebec
+ - Spouse Open Work Permit (SOWP) Canada
+
+
+ - Child or Other Dependant Sponsorship
+ - Parents and Grandparents Sponsorship - Super Visa Canada
+
+
+ - Minimum Necessary Income (MNI) Requirements for 2024
+ - Canada Sponsorship FAQ
+
+
+- Business ### Business
+
+ - Business Immigration
+ - Investor Programs in Canada - Federal Investor Program (Terminated)
+ - Federal Venture Capital (Closed)
+ - Quebec Investor Program – QIIP
+
+
+ - Entrepreneur Programs - Federal Entrepreneur Program (Terminated)
+ - Start-Up Visa Canada
+ - Quebec Entrepreneur Program
+
+
+ - Self Employed Programs - Federal Self-Employed
+ - Quebec Self-Employed
+
+
+ - About our Business Immigration Team
+
+
+- Resources ### Resources
+
+ - Our Canadian Immigration Services
+ - Inadmissible to Canada - Criminal Inadmissibility
+ - Temporary Resident Permit (TRP)
+ - Medical Inadmissibility
+ - Legal Opinion Letters
+ - Entering Canada with a DUI
+ - Criminal Rehabilitation
+
+
+ - How to Get Canadian Citizenship - Citizenship Requirements
+ - Citizenship Application
+ - Citizenship FAQ
+
+
+ - Life in Canada - Canadian Economy
+ - Taxation in Canada
+ - Newcomers Services
+ - How to Find Accommodation in Canada
+
+
+ - Visitor Visa - Visitor Visa
+ - Super Visa Canada
+ - Business Visitor Visas
+ - electronic Travel Authorization (eTA)
+
+
+ - Canadian Immigration News & Updates
+ - Canadian Immigration Blog & Resources
+ - Tools - CRS Score Calculator
+ - CLB Language Converter
+ - Job Search
+ - Visiting Canada Tool
+
+
+ - Guides - What is a NOC Code in Canada?
+ - How to Write a Reference Letter
+ - Educational Credentials Assessment (ECA) Guide
+ - Canadian Resume Guide
+ - Canadian Cover Letter Guide
+ - Social Media Presence Guide
+ - Canadim’s Employment Services
+ - Canadian Language Benchmark Guide
+ - Canadian Immigration Glossary
+ - See all guides & FAQs
+
+
+ - Refugees & Humanitarian
+ - Canadian Immigration Processing Fees
+
+
+- Search...
+
+- - English
+
+
+
+- About us
+- Contact us
+
+-
+-
+-
+-
+-
+
+Immigrate
+### Immigrate
+
+- Immigrate to Canada
+- Express Entry - Comprehensive Ranking System - CRS Score Calculator
+
+
+ - Express Entry Pool of Candidates
+ - Canadian Experience Class
+ - Federal Skilled Worker (FSW) Program
+ - Federal Skilled Trades
+ - Express Entry Draw
+ - When is the Next Express Entry Draw?
+ - Invitation to Apply (ITA)
+ - Electronic Application for Permanent Residence (eAPR)
+ - Proof of Funds for Express Entry
+
+
+- Canada Provincial Nominee Programs (PNPs) - Latest PNP Draws in Canada
+ - Alberta – Provincial Nominee Programs - Farm Stream
+ - Alberta Express Entry
+ - Alberta Accelerated Tech Pathway
+ - Alberta Opportunity Stream
+ - Graduate Entrepreneur Stream
+ - Foreign Graduate Entrepreneur Stream
+
+
+ - British Columbia – Provincial Nominee Programs - Skills Immigration Stream
+ - BC PNP Tech
+ - Entrepreneur Immigration Stream
+
+
+ - Manitoba - Farm Investor Pathway
+ - Skilled Workers in Manitoba
+ - Skilled Workers Overseas
+ - International Education Stream
+ - Business Investor Stream
+
+
+ - New Brunswick - Express Entry Labour Market Stream
+ - Entrepreneurial Stream
+ - Post-Graduate Entrepreneurial Stream
+ - Skilled Worker Applicants with Employer Support
+ - New Brunswick Critical Worker Pilot
+ - New Brunswick Strategic Initiative Stream
+ - New Brunswick PNP – Information Sessions
+
+
+ - Newfoundland and Labrador - Express Entry Skilled Worker Category
+ - Skilled Worker Category
+ - International Graduate Category
+ - International Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Priority Skills NL: In-Demand Academic Path
+ - Priority Skills NL: In-Demand Work Path
+
+
+ - Northwest Territories - Express Entry
+ - Employer Driven
+ - Critical Impact Worker
+ - Skilled Worker
+ - Business Driven
+ - Entrepreneur
+
+
+ - Nova Scotia - Nova Scotia Demand: Express Entry (Closed)
+ - Nova Scotia Experience: Express Entry
+ - Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Skilled Worker Category
+ - Physician Stream
+ - Nova Scotia Labour Market Priorities
+ - Nova Scotia Labour Market Priorities for Physicians
+ - Occupations In Demand
+
+
+ - Ontario - Ontario’s Express Entry Streams
+ - Employer Job Offer
+ - Masters Graduates
+ - PhD Graduates
+ - Entrepreneur
+ - Regional Immigration Pilot
+
+
+ - Prince Edward Island - PEI PNP Express Entry
+ - Business Impact
+ - Work Permit
+ - Labour Impact
+ - Skilled Worker in PEI
+ - Skilled Worker Outside Canada
+ - Critical Worker
+ - International Graduate
+
+
+ - Saskatchewan - International Skilled Worker
+ - Saskatchewan Experience
+ - Saskatchewan Entrepreneur and Farm
+
+
+ - Yukon - Yukon Express Entry
+ - Skilled Worker
+ - Critical Impact Worker
+ - Business Nominee
+ - Yukon Community Pilot
+
+
+
+
+- Quebec Immigration - Immigrate to Quebec
+ - Regular Skilled Worker Program (RSWP)
+ - Quebec Experience Program (PEQ)
+ - Quebec Entrepreneur Program
+ - Quebec Self-Employed Worker Program
+ - Quebec Investor Program – QIIP
+ - Certificat de Selection du Quebec (CSQ)
+ - Quebec Immigration FAQ
+
+
+- Canada Permanent Resident (PR) - Confirmation of Permanent Residence (COPR)
+ - Permanent Resident Card (PR card)
+ - Permanent Resident Card Renewal
+ - Permanent Resident Travel Document
+ - Residency Obligations
+
+
+- Professional & Skilled Workers - Canadian Experience Class (CEC)
+ - Federal Skilled Worker (FSW) Program
+ - Regular Skilled Worker Program (RSWP)
+
+
+- Atlantic Immigration Program
+- Rural and Northern Immigration Pilot
+- Agri-Food Pilot
+- Caregiver Program Canada - Home Child Care Provider Pilot
+ - Home Support Worker Pilot
+ - Past Caregiver Programs
+
+
+- Canada Immigration FAQ
+- Moving to Canada From Another Country - Moving to Canada from the USA
+
+
+
+Back to top - Home
+- How to Immigrate to Canada
+- Canada Provincial Nominee Programs (PNPs)
+- Ontario
+- Entrepreneur
+
+# Entrepreneur
+
+The Ontario Entrepreneur stream is one of the Business Streams of the Ontario Immigrant Nominee Program (OINP), a Provincial Nominee Program (PNP), operated by the province of Ontario. This stream is designed to target experienced business owners or senior business managers who want to live in Ontario. Successful applicants must start a new business or buy an existing business in which they participate in the day-to-day management duties.
+
+- Program Requirements
+- Ineligible Types of Businesses
+- Application Procedure
+- Ontario Entrepreneur Ranking System
+- Ontario Entrepreneur - Recent Draws & Invitation History
+
+Get Started After operating an Ontario business for a minimum of 18 months, the entrepreneur may be nominated for permanent resident status. This program is by invitation only. Interested candidates must first submit an Expression of Interest (EOI) through the OINP e-Filing Portal. After registering a profile the candidate will be assigned a score based on the Ontario Entrepreneur Ranking System. The candidates with the most competitive scores will be invited to submit an official application to the program.
+
+## Program Requirements
+
+| Requirement | |
+| --- | --- |
+| Express Entry Profile | No |
+| Connection to Province | No |
+| Job Offer | No |
+| Language Proficiency | CLB 4 |
+| Level of Education | No minimum |
+| Work Experience | Business owner or senior manager (business management) for at least 24 months of the last 60 months. |
+| Investment Requirement | Investment: $200,000 CAD
+Personal Net Worth: $400,000 CAD |
+
+#tablepress-322 from cache In order to qualify to submit an EOI for the Ontario Entrepreneur stream, a candidate must be able to prove they have the interest, ability, and financial resources to own and actively manage an Ontario business. For this reason, the program requires a high level of business management experience as well as a significant financial net worth.
+
+
+
+Investment Requirement
+
+This stream requires a significant net worth and investment on the part of the applicant. The exact amount varies depending on the location of the proposed business and the type of business:
+
+1. **Inside the Greater Toronto Area (GTA)**If the proposed business is located within the Greater Toronto Area (GTA) the applicant must have a minimum net worth of at least $800,000 CAD. As well, the applicant must make a minimum personal investment of at least $600,000 CAD and control at least one-third of the equity in the business.
+2. **Outside of the Greater Toronto Area (GTA)******If the proposed business is located outside of the GTA, the applicant must have a minimum net worth of at least $400,000 CAD and must invest at least $200,000 CAD and control at least one-third of the equity in the business.
+3. **In the Information and Communications Technology (ICT)/Digital Communications Sector**If the proposed business is in the Information and Communications Technology (ICT)/Digital Communications sector then the applicant must have a net worth of at least $400,000 CAD and must invest at least $200,000 CAD.
+
+Additionally, the proposed business cannot be on the list of ineligible businesses.
+
+
+
+Work Experience
+
+In order to qualify, the applicant must have at least 24 months of full-time business experience in the last 60 months. This work must be in an active role, meaning that the applicant participated in day-to-day operations rather than as a passive business investor. The applicant will also have to maintain an active role with their proposed business in Ontario and must control at least one-third of the equity in the proposed business.
+
+
+
+Business Plan
+
+Interested applicants will have to provide an in-depth proposal for their business plan in Ontario. The proposed business must create at least two permanent full-time jobs for Canadian citizens or permanent residents.
+
+
+
+Language Proficiency
+
+Candidates for this stream must have valid language test scores showing proficiency equivalent to the Canadian Language Benchmark (CLB) Level 4 or higher in English. This is not required to submit an Expression of Interest (EOI) but is required as part of the official application to OINP.
+
+
+
+Residency Requirement
+
+While in Ontario, applicants will be required to reside in the province for at least 75% of the time establishing their business.
+
+
+
+Business Partner
+
+An applicant may be able to submit an application with a business partner, but both parties must meet all minimum requirements. Only one business partner is permitted.
+
+### Ineligible Types of Businesses
+
+The following types of businesses are not eligible to apply for the Ontario Entrepreneur stream:
+
+
+
+List of ineligible types of business in the Greater Toronto Area (GTA)
+
+
+
+
+Existing franchises in Ontario (new foreign franchises expanding into Ontario are permitted)
+
+
+Gas stations
+
+
+Tire recycling
+
+
+Scrap metal recycling
+
+
+Pawnbrokers
+
+
+Bed and breakfasts
+
+
+Holding companies
+
+
+Laundromats
+
+
+Automated car wash operations
+
+
+Pay dar loan and related businesses
+
+
+Businesses which have been previously owned/operated by current or former OINP business stream nominees
+
+
+
+
+
+
+
+List of ineligible types of business outside of the Greater Toronto Area (GTA)
+
+
+
+
+Tire recycling
+
+
+Scrap metal recycling
+
+
+Pawnbrokers
+
+
+Holding companies
+
+
+Laundromats
+
+
+Automated car wash operations
+
+
+Pay day loan and related businesses
+
+
+Businesses which have been previously owned/operated by current or former OINP business stream nominees
+
+## Application Procedure
+
+The Ontario Entrepreneur stream operates on an Expression of Interest (EOI) system. Candidates who meet the minimum stream requirements can register a profile and submit an EOI by creating a ONe-key account with the OINP e-Filing Portal. Once the profile has been submitted, candidates will be assigned a score and ranked against one another using the Ontario Entrepreneur Ranking system. The highest ranking candidates will be invited to apply to the stream.
+
+Candidates who receive an invitation to apply have 90 days to submit all required information and documents, including a business plan and a review of personal net worth. This verification of personal net worth must be completed by a qualified third party. The Ontario Entrepreneur stream charges a $3,500 CAD application fee per applicant. Note that if an application is complete, the next stage of the application requires the applicant to attend a mandatory in-person interview at the OINP offices in Ontario. Travel and accommodations for this interview are at the applicant’s expense.
+
+If the application is approved, the applicant will have to sign a Performance Agreement with the OINP. After this, the OINP will issue a work permit support letter, enabling the applicant to gain authorization to Canada. Select business categories of immigration allow foreign nationals to apply for temporary work permits allowing them to work in Canada while establishing their business practice. These work permits do not require a Labour Market Impact Assessment (LMIA), meaning they are LMIA-exempt. To apply for such a work permit, an applicant must include a work permit support letter issued by the province and submit their applications to Immigration, Refugees and Citizenship Canada (IRCC).
+
+Once arriving in Canada, the applicant has a maximum of 20 months to implement their business plan. Between 18 to 20 months, the applicant must submit a final report to OINP which acts as a request for nomination. If an applicant’s final report is approved by the OINP, they will receive an official provincial nomination.
+
+With a provincial nomination in hand, the applicant may apply for Canadian permanent residence. Applicants in this program must complete and submit a paper-based application for permanent residence and submit it by mail to the appropriate application centre. Paper-based PNP applications for permanent residence are generally processed within 18 months.
+
+## Ontario Entrepreneur Ranking System
+
+The Ontario Entrepreneur stream uses the following points-grid to rank candidates who have submitted EOIs. Only those candidates with the most competitive scores will be invited to apply to the program.
+
+### Overview of Factors
+
+| Scoring Sections | Points |
+| --- | --- |
+| Experience Factors | 50 |
+| Investment Factors | 100 |
+| Human Capital Factors | 20 |
+| Total Points Available | 170 |
+
+#tablepress-159 from cache ##
+
+## Experience Duration
+
+| Experience Total Duration | Points |
+| --- | --- |
+| Business Owner |
+| Less than 24 months | Not eligible |
+| 24 - 47 months | 13 |
+| 48 – 59 months | 19 |
+| 60 months | 25 |
+| Senior Manager (Business Management) |
+| Less than 24 months | Not eligible |
+| 48 - 59 months | 19 |
+| 60 months | 25 |
+| Total Points Available | 25 |
+
+#tablepress-160 from cache ## Specific Experience
+
+| Past Specific Experience | Points |
+| --- | --- |
+| No | 0 |
+| Yes: 1 past specific experience | 15 |
+| Yes: 2 past specific experience | 25 |
+| Yes: 3 past specific experience | 35 |
+| Total Points Available | 35 |
+
+#tablepress-161 from cache ## Personal Net Worth
+
+| Personal Net Worth | Points |
+| --- | --- |
+| If your proposed business will be within the GTA |
+| Less than $800,000 | Not eligible |
+| $800,000 to $2,499,999 | 5 |
+| $2,500,000 or more | 10 |
+| If your proposed business will be outside the GTA OR If your proposed business will be in the ICT/Digital Communications sector (regardless of location) |
+| Less than $400,000 | Not eligible |
+| $400,000 to $999,999 | 10 |
+| $1,000,000 or more | 15 |
+| Total Points Available | 15 |
+
+#tablepress-162 from cache ## Investment Amount
+
+| Investment Amount | Points |
+| --- | --- |
+| If your proposed business will be within the GTA |
+| Less than $600,000 | Not eligible |
+| $600,000 to $1,499,999 | 10 |
+| $1,500,000 to $2,999,999 | 15 |
+| $3,000,000 or more | 20 |
+| If your proposed business will be outside the GTA OR if your proposed business will be in the ICT/Digital Communications sector (regardless of location) |
+| Less than $200,000 | Not eligible |
+| $200,000 to $499,999 | 15 |
+| $500,000 to $799,999 | 20 |
+| $800,000 or more | 25 |
+| Total Points Available | 25 |
+
+#tablepress-163 from cache ## Job Creation
+
+| Job Creation | Points |
+| --- | --- |
+| 1 for outside GTA or ICT/Digital Communications sector
+2 for inside GTA | 3 |
+| 3-4 jobs | 5 |
+| 5 or more jobs | 7 |
+| Total Points Available | 7 |
+
+#tablepress-164 from cache ## Business Visits
+
+| Business-Related Visits to Ontario | Points |
+| --- | --- |
+| No | 0 |
+| Yes | 6 |
+| Total Points Available | 6 |
+
+#tablepress-165 from cache ## Targeted Key Sector
+
+| Significant Economic Benefit and Key Sector | Points |
+| --- | --- |
+| Unsatisfactory/Unclear | 0 |
+| Fair | 5 |
+| Good | 10 |
+| Total Points Available | 10 |
+
+#tablepress-166 from cache ## Business Location
+
+| Business Location | Points |
+| --- | --- |
+| CMA with a population of 175,000 or more | 0 |
+| CMA or CA with a population greater than 100,000 but less than 175,000 | 5 |
+| Other location with a population of 100,000 or below | 10 |
+| Total Points Available | 10 |
+
+#tablepress-167 from cache ## Job Creation NOC Level
+
+| Creation of N0C 0, A or B Jobs | Points |
+| --- | --- |
+| 0 NOC 0, A or B job(s) | 0 |
+| 1 NOC 0, A or B job(s) 5 | 5 |
+| 2 or more NOC 0, A or B job(s) 7 | 7 |
+| Total Points Available | 7 |
+
+#tablepress-168 from cache ## Education
+
+| Level of Education | Points |
+| --- | --- |
+| No post-secondary education | 0 |
+| Post-secondary degree or diploma - two-year
+program | 5 |
+| Post-secondary degree or diploma - three-year
+program or longer | 10 |
+| Total Points Available | 10 |
+
+#tablepress-169 from cache ## Language Ability
+
+| Official Language Ability | Points |
+| --- | --- |
+| None or minimal (CLB 3 or below) | 0 |
+| Basic understanding (CLB 4) | 5 |
+| Intermediate and advanced (CLB 5 or higher) | 10 |
+| Total Points Available | 10 |
+
+#tablepress-170 from cache ## Ontario Entrepreneur - Recent Draws & Invitation History
+
+Below is the information regarding recent Ontario Entrepreneur stream draws and the historic information about issuance of invitations to apply.
+
+
+
+DateNumber of InvitationsMinimum Score/Targeted Score Range
+
+
+
+
+July 28, 202311134 to 151
+
+
+May 12, 202314135-178
+
+
+March 31, 202313139-159
+
+
+January 27, 202310137-162
+
+
+15 July 202233146-174
+
+
+4 March 202221152-169
+
+
+28 October 202120147-174
+
+
+26 August 202120
+142-200
+
+
+7 July 202121146
+
+
+15 December 202019140
+
+
+26 October 202021142
+
+
+27 August 202021144
+
+
+25 June 202024134
+
+
+22 April 202026132
+
+
+26 February 202020136
+
+
+20 September 201915127
+
+
+5 April 201922112
+
+
+17 January 201913115
+
+
+23 November 201815112
+
+
+23 October 201818110
+
+
+21 September 201816117
+
+
+24 August 201821110
+
+
+17 July 201820120
+
+
+13 June 201813124
+
+
+14 May 201810127
+
+
+16 April 201813132
+
+
+14 March 201810135
+
+
+6 February 201813137
+
+## Ready tostart?
+
+#### Free Immigration Assessment
+
+Discover your Canadian immigration options! Complete our free assessment today and a member of the Canadim Team will contact you to discuss your immigration to Canada.
+
+Get Started ## Related Links
+
+- ## British Columbia Entrepreneur
+
+
+- ## Manitoba Business Investor Stream
+
+
+- ## Nova Scotia Entrepreneur
+
+
+- ## Prince Edward Island Business Impact
+
+
+- ## Saskatchewan Entrepreneur and Farm
+
+
+
+## Canadian Immigration Options
+
+- I want to immigrate
+- I want to study
+- I want a work permit
+- I want to invest
+- I want to sponsor
+
+Follow us
+
+-
+-
+-
+-
+-
+
+## Newsletter
+
+Sign up to our Newsletter to keep you up-to-date on the
+ newest programs & development in the Canadian
+ Immigration world.
+
+## Contact
+
+1455 Saint Mathieu Street
+ Suite #100
+ Montréal (QC) H3H 2M4
+
+Email attorney@canadim.com
+Phone +1 514-989-9700
+Fax +1 514-989-9290
+
+Free Phone Consultation
+ +1 (514) 989-9700
+
+© Canadim 2025 -all rights reserved - Privacy Policy - Sitemap
+
+
+
+
+ Free assessment Free assessment Popup start Discover your Canadian immigration options. Get your free assessment now!
+
+Find out if you qualify Popup end Free assessment Express Entry Canadim Services Immigration news Our Blog ## Free assessment
+
+### Canada immigration form
+
+Discover your Canadian permanent residency options.
+
+Start now ### Student Immigration Form
+
+Discover your options to study in Canada.
+
+Start now Start of LiveChat (www.livechatinc.com) code Chat with us ,
+powered by LiveChat End of LiveChat code
+
+Document 3:
+html Search Engine Optimization by Rank Math - https://rankmath.com/ Ontario's OINP Entrepreneur Stream | A Step-By-Step Guide /Rank Math WordPress SEO plugin Meta Pixel Code End Meta Pixel Code HubSpot WordPress Plugin v11.1.75: embed JS disabled as a portalId has not yet been configured MailerLite Universal End MailerLite Universal Google Tag Manager End Google Tag Manager MailerLite Universal End MailerLite Universal Google Tag Manager (noscript) End Google Tag Manager (noscript) Skip to main content - CLIENT LOGIN
+- ABOUT
+- NEWS
+- BLOG
+- CONTACT US
+- **+1(604) 496-0735
+- **info@elaarimmigration.com
+
+/span_12 /inner-wrap /search-box Close Search /container /search /search-outer /span_3 search Menu **- IMMIGRATE - – ** - Express Entry ** - Federal Skilled Worker Program
+ - Canadian Experience Class
+ - Federal Skilled Trades Program
+
+
+ - Alternative Pathways to PR ** - Moving from the U.S.
+ - Quebec Immigration
+ - Immigrate After 40 Age
+
+
+
+
+ - Provincial Nominee Programs ** - Alberta
+ - British Columbia
+ - Ontario
+ - Manitoba
+ - Saskatchewan
+ - New Brunswick
+ - Newfoundland & Labrador
+ - Northwest Territories
+ - Nova Scotia
+ - Prince Edward Island
+ - Yukon
+
+
+ - Pilot Immigration Programs ** - Atlantic Immigration Pilot
+ - Caregiver Immigration Pilot
+ - Agri-Food Pilot
+ - Humanitarian & Compassionate
+ - Rural and Northern Immigration Pilot
+
+
+ - Family & Spousal Sponsorship ** - Spouse or Common-Law Partner Sponsorship
+ - Parents and Grandparents Sponsorship
+ - Dependent Child Sponsorship
+ - Super Visa for Parents and Grandparents
+
+
+
+
+- WORK - Open Work Permit ** - Post-Graduate Work Permit
+ - Spousal Open Work Permit
+ - International Experience Canada
+ - SOWP for Students
+
+
+ - Employer-Specific Work Permits ** - LMIA-Based Work Permit
+ - LMIA Exempt Work Permit
+ - LMIA Requirements
+
+
+ - Caregiver Program ** - Home Support Worker Pilot Program Canada (HSWP)
+ - Home Child Care Provider Program Canada (HCCP)
+
+
+ - Job Opportunity, Tools & Resources ** - How to Get a Job Offer
+ - Visitor Visa to Work Permit
+
+
+
+
+- VISIT - Visitor Visa for Parents
+ - Visitor Visa for Spouse
+ - Super Visa
+
+
+- STUDY - Study Permits ** - Student Visa After 5 to 25 Years Gap
+ - Study Permit Refusal Reasons
+ - Canada Student Spouse Visa
+ - Schooling Visa for Minor
+
+
+ - Resources ** - Student Direct Stream
+ - Student Path of Permanently Residency
+ - Student Visa Reapply
+ - Top Universities
+ - Document Checklist for Study Permit
+
+
+
+
+- BUSINESS IMMIGRATION - – ** - Federal Business Programs ** - Start-up Visa
+ - Self-Employed Visa
+ - Quebec Startup Visa
+ - Quebec Self-Employment Visa
+
+
+ - Investment in Canada ** - Buy a Business in Canada for PR
+ - Expand Your Existing Business to Canada
+
+
+
+
+ - Provincial Business Programs ** - Alberta
+ - British Columbia
+ - Ontario
+ - Manitoba
+ - Newfoundland and Labrador
+ - Nova Scotia
+ - Northwest Territories
+ - Saskatchewan
+ - New Brunswick
+ - Prince Edward Island
+ - Yukon
+
+
+ - Entrepreneur Work Permit ** - C11 Visa
+ - C10 Visa
+ - Entrepreneur LMIA (Owner Operator)
+ - Intra Company Transfer
+
+
+
+
+- RESOURCES - Tools ** - CRS Calculator
+ - FSW Calculator
+ - BC PNP Calculator
+ - SINP Calculator
+ - Business Immigration Assessment
+
+
+ - Immigration Guides ** - Express Entry Draw History
+ - Comprehensive Ranking System (CRS)
+ - National Occupation Classification
+
+
+
+
+- START ASSESSMENT
+
+- search
+
+/span_9 /row /container # A Step-by-Step Guide to OINP Entrepreneur Stream
+
+OINP Entrepreneur Stream lets you immigrate to Canada as an entrepreneur. Complete your free assessment to check if you’re eligible.
+
+BOOK A CONSULTATION **CHECK ELIGIBLITY **Thousands of immigrants settle in Ontario every year. They are drawn to the province for its growing economy and industry diversity. Many foreign entrepreneurs also start businesses in Ontario. Such individuals may benefit from immigrating using Ontario’s OINP Entrepreneur Stream. This guide will examine this immigration program’s eligibility requirements and application process.
+
+## What is OINP Entrepreneur Stream?
+
+The OINP Entrepreneur Stream is among the immigration programs offered under Ontario’s Immigrant Nominee Program (OINP). This stream caters to foreign entrepreneurs and business people who want to start a new business or acquire an existing one in Ontario. - Refugee Immigration
+
+
+- Business - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Post Graduation Work Permit
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+****- About - About Us
+ - Advertising Disclosure
+ - Editorial Code of Conduct
+
+
+- Immigration - Canada Immigration Overview
+ - Express Entry Overview - Express Entry for Skilled Immigration
+ - Canada Express Entry Draws 2024
+ - Comprehensive Ranking System (CRS)
+ - Express Entry Invitations to Apply (ITAs)
+
+
+ - Federal Skilled Worker - Federal Skilled Worker Program Eligible Occupations
+
+
+ - Federal Skilled Trades Program
+ - Canadian Experience Class
+ - Provincial Immigration - Overview
+ - Alberta
+ - British Columbia
+ - Manitoba
+ - New Brunswick
+ - Newfoundland
+ - Northwest Territories and Nunavut
+ - Nova Scotia
+ - Ontario
+ - Prince Edward Island
+ - Quebec
+ - Saskatchewan
+ - Yukon
+ - Atlantic Immigration Program
+
+
+ - Quebec Immigration - Quebec Skilled Worker Immigration
+ - Quebec Experience Class (PEQ)
+ - Quebec Business Immigration
+
+
+ - Pilot Immigration Programs - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+
+
+ - Sponsorship Immigration - Overview
+ - Sponsor Your Spouse or Common-Law Partner
+ - Sponsor Your Parents & Grandparents
+ - Parents and Grandparents Super Visa
+ - Sponsor your children
+ - Sponsorship of Adopted Children
+
+
+ - Refugee Immigration
+
+
+- Business - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Post Graduation Work Permit
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+- Business Immigration
+- Canada Immigration
+
+# Requirements for Ontario Entrepreneur Stream Immigration Program
+
+- Colin R. Singer
+- **July 10, 2019
+
+
+### Applicant Requirements for Ontario Entrepreneur Stream Immigration Program
+
+Applicants under the OES must:
+
+- Have at least 24 months of full time business experience in the past 60 months. - The experience must be as an owner or senior manager of a business.
+
+
+- Have a minimum net worth of $800,000 if your proposed business will be in the Greater Toronto Area (GTA). - If your proposed business will be outside of the GTA, the minimum net worth requirement is $400,000.
+ - If your proposed business will be involved in Information Communications Technology or Digital Communications anywhere in the province, the minimum net worth requirement is $400,000.
+
+
+- Be ready to invest at least $600,000 in an Ontario business and possess at least 33% equity ownership if the business is in the GTA. - If the business is outside the GTA, you must be ready to invest at least $200,000 and have at least 33% equity ownership.
+ - If the business will be involved in Information Communications Technology or Digital Communications anywhere in the province, you must be ready to invest at least $200,000 and have at least 33% equity ownership.
+
+
+- Commit to creating two full time jobs for Canadian citizens or permanent residents in the proposed company. - If the business is outside the GTA, you must create at least one job for Canadian citizens or permanent residents.
+ - If the business will be involved in Information Communications Technology or Digital Communications anywhere in the province, you must create at least one job for Canadian citizens or permanent residents.
+
+
+- **Additional requirements if purchasing an existing business** - Make at least one business-related visit to Ontario within 12 months from the date of registering an Expression of Interest.
+ - Business being purchased must have been in continuous operation by the same owner(s) for the previous 60 months.
+ - Ownership of the business must be completely transferred to the applicant or any business partner.
+ - You must use at least 10% of your personal investment towards improving or expanding the business in Ontario.
+ - You must keep all permanent full-time employees that worked in the business prior to the transfer of ownership.
+
+
+
+At the time of nomination, applicants under the OES must:
+
+- Score minimum CLB 4 in English or French.
+- Actively involved in the daily management of the business
+- Physically reside in Ontario for at least 75% of the time in which you are managing the business.
+
+If you are applying with a business partner, the partner must also meet all the requirements described above.
+
+### Business Requirements for Ontario Entrepreneur Stream Immigration Program
+
+1. **Business purpose**
+
+- The business purpose must be to make a profit from active income through the sale of goods and/or services.
+
+1. **Canadian and Ontario legal requirements**
+
+- Your business must comply with all relevant federal, provincial or municipal legal, regulatory and licensing requirements. This includes compliance with Ontario’s labour and employment standards laws.
+
+1. **Permanent business**
+
+- Your business must be permanent. Project-based and seasonal businesses are not eligible.
+
+1. **Business in Ontario**
+
+- You must maintain a place of business in Ontario at all times
+
+### Ineligible Business
+
+The following businesses inside the GTA are ineligible:
+
+- Existing Franchises in Ontario (new foreign franchises expanding into Ontario are permitted).
+- Gas Stations
+- Tire Recycling
+- Scrap Metal Recycling
+- Pawnbrokers
+- Bed and Breakfasts
+- Holding Companies
+- Laundromats
+- Automated Car Washes
+- Pay day loan businesses
+
+The following businesses outside of the GTA are ineligible:
+
+- Tire Recycling
+- Scrap Metal Recycling
+- Pawnbrokers
+- Holding Companies
+- Laundromats
+- Automated Car Washes
+- Pay day loan businesses
+
+Read more about the Ontario Entrepreneur Stream
+
+Interested employers: Kindly contact us here to receive further information.
+
+Interested candidates: Find out whether you qualify to Canada by completing our free on-line evaluation. We will provide you with our evaluation within 1-2 business days.
+
+
+Advertisement #### Colin R. Singer
+
+Colin R. Singer, Managing Partner of immigration.ca, is a licensed immigration lawyer in Canada with Barreau du Quebec, for the past 30+ years. **Share on facebook **Share on twitter **Share on linkedin **Share on whatsapp **Share on pinterest **Share on reddit **Share on email ### Related articles
+
+##### What to Expect From Canada’s Start-Up Visa Program in 2025
+
+Read More » Colin R. Singer December 23, 2024 ##### Canadian CV checklist: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+
+Read More » Melissa Gosselin December 23, 2024 Business Immigration - Start-Up Visa Program
+- How to Apply for Canada’s Start-Up Visa from India
+- Quebec Immigrant Investor Program (QIIP)
+- Quebec Entrepreneur Program
+- Quebec Business Immigration
+- Buy a Business & Move to Canada
+- Provincial Entrepreneur Programs
+- Self-Employed Visa Canada: Your Path to Canadian Residency
+- International Business Immigration Programs
+
+Permanent Residence - Express Entry
+- Express Entry Immigration Draws
+- Skilled Worker Immigration
+- Quebec Immigration
+- Business & Investment Immigration
+- Sponsorship Immigration
+- Provincial Immigration
+- Refugee Immigration
+- Skilled Trades Immigration
+- How a Caregiver Can Apply For Canadian Permanent Residence
+- Canada Citizenship
+- Analyzing Citizenship Bill C-6 (Video)
+- What Settlement Funds Do I Need?
+- Canada Immigration FAQ
+- Government of Canada Fee Schedule
+- Canada Immigration Applications Processing times
+- Rural and Northern Immigration Pilot
+
+Subscribe to our Latest Newsletter Latest News - Canadian CV guide – dos and don’ts for 2025: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+November 28, 2024
+- What to Expect From Canada’s Start-Up Visa Program in 2025
+December 23, 2024
+- Canadian CV checklist: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+December 23, 2024
+- Manitoba Issues 399 Canada Immigration Invitations In New PNP Draw
+December 23, 2024
+- Celebrate the holidays in Canadian style: Check out Oh Canada, immigration.ca’s weekly culture and lifestyle newsletter for newcomers
+December 20, 2024
+- Canada The Top Destination for International Job Seekers, Report Says
+December 20, 2024
+- Prince Edward Island PNP Draw: Province Issues 33 Skilled Worker And Business Invitations
+December 20, 2024
+
+## Useful Links
+
+- **Free Immigration to Canada Evaluation
+- **Sign-up for Canadian Immigration Newsletters
+- **Canadian Citizenship Requirements
+- **Canada Work Visa – Work in Canada
+- **Canada Visitor Visa Guide
+- **12 Ways You Can Immigrate To Canada
+
+## Help
+
+- **Book an Immigration Consultation
+- **Contact Us
+- **Disclaimer
+- **Privacy Policy
+- **Fraud alert
+
+Linkedin **Facebook **Instagram **Youtube **Twitter **Podcast **Go to Top
+
+
+
+Document 1:
+html head meta Global site tag (gtag.js) - Google Analytics wp_head() Prince-Edward-Island PNP for Entrepreneurs - siminca script | dynamic This site is optimized with the Yoast SEO plugin v8.0 - https://yoast.com/wordpress/plugins/seo/ / Yoast SEO plugin. LayerSlider updates and docs at: https://layerslider.kreaturamedia.com style | dynamic style | custom css | theme options [if lte IE 9]> End cookieyes banner Prince Edward Island Business Impact | Canadim Google Tag Manager for WordPress by gtm4wp.com End Google Tag Manager for WordPress by gtm4wp.com This site is optimized with the Yoast SEO Premium plugin v22.7 (Yoast SEO v24.1) - https://yoast.com/wordpress/plugins/seo/ / Yoast SEO Premium plugin. Google Tag Manager for WordPress by gtm4wp.com GTM Container placement set to automatic End Google Tag Manager for WordPress by gtm4wp.com If no sidebar menu, add class "wide" to o-page and c-header - - English
+
+
+
+- About us
+- Contact us
+- Free Phone Consultation +1 (514) 989-9700
+
+- Immigrate ### Immigrate
+
+ - Immigrate to Canada
+ - Express Entry - Comprehensive Ranking System - CRS Score Calculator
+
+
+ - Express Entry Pool of Candidates
+ - Canadian Experience Class
+ - Federal Skilled Worker (FSW) Program
+ - Federal Skilled Trades
+ - Express Entry Draw
+ - When is the Next Express Entry Draw?
+ - Invitation to Apply (ITA)
+ - Electronic Application for Permanent Residence (eAPR)
+ - Proof of Funds for Express Entry
+
+
+ - Canada Provincial Nominee Programs (PNPs) - Latest PNP Draws in Canada
+ - Alberta – Provincial Nominee Programs - Farm Stream
+ - Alberta Express Entry
+ - Alberta Accelerated Tech Pathway
+ - Alberta Opportunity Stream
+ - Graduate Entrepreneur Stream
+ - Foreign Graduate Entrepreneur Stream
+
+
+ - British Columbia – Provincial Nominee Programs - Skills Immigration Stream
+ - BC PNP Tech
+ - Entrepreneur Immigration Stream
+
+
+ - Manitoba - Farm Investor Pathway
+ - Skilled Workers in Manitoba
+ - Skilled Workers Overseas
+ - International Education Stream
+ - Business Investor Stream
+
+
+ - New Brunswick - Express Entry Labour Market Stream
+ - Entrepreneurial Stream
+ - Post-Graduate Entrepreneurial Stream
+ - Skilled Worker Applicants with Employer Support
+ - New Brunswick Critical Worker Pilot
+ - New Brunswick Strategic Initiative Stream
+ - New Brunswick PNP – Information Sessions
+
+
+ - Newfoundland and Labrador - Express Entry Skilled Worker Category
+ - Skilled Worker Category
+ - International Graduate Category
+ - International Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Priority Skills NL: In-Demand Academic Path
+ - Priority Skills NL: In-Demand Work Path
+
+
+ - Northwest Territories - Express Entry
+ - Employer Driven
+ - Critical Impact Worker
+ - Skilled Worker
+ - Business Driven
+ - Entrepreneur
+
+
+ - Nova Scotia - Nova Scotia Demand: Express Entry (Closed)
+ - Nova Scotia Experience: Express Entry
+ - Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Skilled Worker Category
+ - Physician Stream
+ - Nova Scotia Labour Market Priorities
+ - Nova Scotia Labour Market Priorities for Physicians
+ - Occupations In Demand
+
+
+ - Ontario - Ontario’s Express Entry Streams
+ - Employer Job Offer
+ - Masters Graduates
+ - PhD Graduates
+ - Entrepreneur
+ - Regional Immigration Pilot
+
+
+ - Prince Edward Island - PEI PNP Express Entry
+ - Business Impact
+ - Work Permit
+ - Labour Impact
+ - Skilled Worker in PEI
+ - Skilled Worker Outside Canada
+ - Critical Worker
+ - International Graduate
+
+
+ - Saskatchewan - International Skilled Worker
+ - Saskatchewan Experience
+ - Saskatchewan Entrepreneur and Farm
+
+
+ - Yukon - Yukon Express Entry
+ - Skilled Worker
+ - Critical Impact Worker
+ - Business Nominee
+ - Yukon Community Pilot
+
+
+
+
+ - Quebec Immigration - Immigrate to Quebec
+ - Regular Skilled Worker Program (RSWP)
+ - Quebec Experience Program (PEQ)
+ - Quebec Entrepreneur Program
+ - Quebec Self-Employed Worker Program
+ - Quebec Investor Program – QIIP
+ - Certificat de Selection du Quebec (CSQ)
+ - Quebec Immigration FAQ
+
+
+ - Canada Permanent Resident (PR) - Confirmation of Permanent Residence (COPR)
+ - Permanent Resident Card (PR card)
+ - Permanent Resident Card Renewal
+ - Permanent Resident Travel Document
+ - Residency Obligations
+
+
+ - Professional & Skilled Workers - Canadian Experience Class (CEC)
+ - Federal Skilled Worker (FSW) Program
+ - Regular Skilled Worker Program (RSWP)
+
+
+ - Atlantic Immigration Program
+ - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+ - Caregiver Program Canada - Home Child Care Provider Pilot
+ - Home Support Worker Pilot
+ - Past Caregiver Programs
+
+
+ - Canada Immigration FAQ
+ - Moving to Canada From Another Country - Moving to Canada from the USA
+
+
+
+
+- Work ### Work
+
+ - Work in Canada
+ - Work without a Work Permit - Business Visitors
+
+
+ - Temporary Foreign Worker Program - Labour Market Impact Assessment (LMIA)
+ - Facilitated LMIA (Quebec) List of Occupations
+ - Canada Global Talent Stream (GTS)
+
+
+ - International Mobility Program - Intra-Company Transfers
+ - CUSMA (formerly called NAFTA) Work Permit
+ - Working with CSQ
+ - CETA Work Permits
+ - Open Work Permits - Post-Graduate Work Permit
+ - International Experience Canada
+ - Spouse Open Work Permit (SOWP) Canada
+ - Bridging Open Work Permit (BOWP) Canada
+
+
+
+
+ - Tools & Resources - Job Search Tool
+ - Social Media Presence Guide
+ - Canadian Resume Guide
+
+
+ - For Employers
+
+
+- Study ### Study
+
+ - Study & Immigrate in Canada - Study in Canada: Changes for 2024 -2026
+ - Our International Student Program
+
+
+ - Canadian Designated Learning Institutions (DLI)
+ - Levels of Study
+ - Study Permit in Canada - Student Direct Stream (SDS) Canada
+ - Provincial Attestation Letter (PAL)
+
+
+ - Certificat d’acceptation du Quebec (CAQ)
+ - Refusals and Appeals
+ - Live as a student in Canada - International Students in Canada
+ - Extend a Study Permit
+ - International Student Health Insurance in Canada - Quebec Health Insurance Plan for International Students
+
+
+ - Student Accommodation
+ - Work While Studying
+ - International Students: Spouse and Family Dependent Visa
+
+
+ - Post-Graduate Work Permit
+ - Permanent Residence (PR) for international students
+
+
+- Sponsorship ### Sponsorship
+
+ - Canada Sponsorship
+ - Spousal Sponsorship: Sponsor your Spouse or Partner for Canadian Immigration - Inland Sponsorship
+ - Outland Sponsorship
+ - Spousal Sponsorship Quebec
+ - Spouse Open Work Permit (SOWP) Canada
+
+
+ - Child or Other Dependant Sponsorship
+ - Parents and Grandparents Sponsorship - Super Visa Canada
+
+
+ - Minimum Necessary Income (MNI) Requirements for 2024
+ - Canada Sponsorship FAQ
+
+
+- Business ### Business
+
+ - Business Immigration
+ - Investor Programs in Canada - Federal Investor Program (Terminated)
+ - Federal Venture Capital (Closed)
+ - Quebec Investor Program – QIIP
+
+
+ - Entrepreneur Programs - Federal Entrepreneur Program (Terminated)
+ - Start-Up Visa Canada
+ - Quebec Entrepreneur Program
+
+
+ - Self Employed Programs - Federal Self-Employed
+ - Quebec Self-Employed
+
+
+ - About our Business Immigration Team
+
+
+- Resources ### Resources
+
+ - Our Canadian Immigration Services
+ - Inadmissible to Canada - Criminal Inadmissibility
+ - Temporary Resident Permit (TRP)
+ - Medical Inadmissibility
+ - Legal Opinion Letters
+ - Entering Canada with a DUI
+ - Criminal Rehabilitation
+
+
+ - How to Get Canadian Citizenship - Citizenship Requirements
+ - Citizenship Application
+ - Citizenship FAQ
+
+
+ - Life in Canada - Canadian Economy
+ - Taxation in Canada
+ - Newcomers Services
+ - How to Find Accommodation in Canada
+
+
+ - Visitor Visa - Visitor Visa
+ - Super Visa Canada
+ - Business Visitor Visas
+ - electronic Travel Authorization (eTA)
+
+
+ - Canadian Immigration News & Updates
+ - Canadian Immigration Blog & Resources
+ - Tools - CRS Score Calculator
+ - CLB Language Converter
+ - Job Search
+ - Visiting Canada Tool
+
+
+ - Guides - What is a NOC Code in Canada?
+ - How to Write a Reference Letter
+ - Educational Credentials Assessment (ECA) Guide
+ - Canadian Resume Guide
+ - Canadian Cover Letter Guide
+ - Social Media Presence Guide
+ - Canadim’s Employment Services
+ - Canadian Language Benchmark Guide
+ - Canadian Immigration Glossary
+ - See all guides & FAQs
+
+
+ - Refugees & Humanitarian
+ - Canadian Immigration Processing Fees
+
+
+- Search...
+
+- - English
+
+
+
+- About us
+- Contact us
+
+-
+-
+-
+-
+-
+
+Immigrate
+### Immigrate
+
+- Immigrate to Canada
+- Express Entry - Comprehensive Ranking System - CRS Score Calculator
+
+
+ - Express Entry Pool of Candidates
+ - Canadian Experience Class
+ - Federal Skilled Worker (FSW) Program
+ - Federal Skilled Trades
+ - Express Entry Draw
+ - When is the Next Express Entry Draw?
+ - Invitation to Apply (ITA)
+ - Electronic Application for Permanent Residence (eAPR)
+ - Proof of Funds for Express Entry
+
+
+- Canada Provincial Nominee Programs (PNPs) - Latest PNP Draws in Canada
+ - Alberta – Provincial Nominee Programs - Farm Stream
+ - Alberta Express Entry
+ - Alberta Accelerated Tech Pathway
+ - Alberta Opportunity Stream
+ - Graduate Entrepreneur Stream
+ - Foreign Graduate Entrepreneur Stream
+
+
+ - British Columbia – Provincial Nominee Programs - Skills Immigration Stream
+ - BC PNP Tech
+ - Entrepreneur Immigration Stream
+
+
+ - Manitoba - Farm Investor Pathway
+ - Skilled Workers in Manitoba
+ - Skilled Workers Overseas
+ - International Education Stream
+ - Business Investor Stream
+
+
+ - New Brunswick - Express Entry Labour Market Stream
+ - Entrepreneurial Stream
+ - Post-Graduate Entrepreneurial Stream
+ - Skilled Worker Applicants with Employer Support
+ - New Brunswick Critical Worker Pilot
+ - New Brunswick Strategic Initiative Stream
+ - New Brunswick PNP – Information Sessions
+
+
+ - Newfoundland and Labrador - Express Entry Skilled Worker Category
+ - Skilled Worker Category
+ - International Graduate Category
+ - International Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Priority Skills NL: In-Demand Academic Path
+ - Priority Skills NL: In-Demand Work Path
+
+
+ - Northwest Territories - Express Entry
+ - Employer Driven
+ - Critical Impact Worker
+ - Skilled Worker
+ - Business Driven
+ - Entrepreneur
+
+
+ - Nova Scotia - Nova Scotia Demand: Express Entry (Closed)
+ - Nova Scotia Experience: Express Entry
+ - Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Skilled Worker Category
+ - Physician Stream
+ - Nova Scotia Labour Market Priorities
+ - Nova Scotia Labour Market Priorities for Physicians
+ - Occupations In Demand
+
+
+ - Ontario - Ontario’s Express Entry Streams
+ - Employer Job Offer
+ - Masters Graduates
+ - PhD Graduates
+ - Entrepreneur
+ - Regional Immigration Pilot
+
+
+ - Prince Edward Island - PEI PNP Express Entry
+ - Business Impact
+ - Work Permit
+ - Labour Impact
+ - Skilled Worker in PEI
+ - Skilled Worker Outside Canada
+ - Critical Worker
+ - International Graduate
+
+
+ - Saskatchewan - International Skilled Worker
+ - Saskatchewan Experience
+ - Saskatchewan Entrepreneur and Farm
+
+
+ - Yukon - Yukon Express Entry
+ - Skilled Worker
+ - Critical Impact Worker
+ - Business Nominee
+ - Yukon Community Pilot
+
+
+
+
+- Quebec Immigration - Immigrate to Quebec
+ - Regular Skilled Worker Program (RSWP)
+ - Quebec Experience Program (PEQ)
+ - Quebec Entrepreneur Program
+ - Quebec Self-Employed Worker Program
+ - Quebec Investor Program – QIIP
+ - Certificat de Selection du Quebec (CSQ)
+ - Quebec Immigration FAQ
+
+
+- Canada Permanent Resident (PR) - Confirmation of Permanent Residence (COPR)
+ - Permanent Resident Card (PR card)
+ - Permanent Resident Card Renewal
+ - Permanent Resident Travel Document
+ - Residency Obligations
+
+
+- Professional & Skilled Workers - Canadian Experience Class (CEC)
+ - Federal Skilled Worker (FSW) Program
+ - Regular Skilled Worker Program (RSWP)
+
+
+- Atlantic Immigration Program
+- Rural and Northern Immigration Pilot
+- Agri-Food Pilot
+- Caregiver Program Canada - Home Child Care Provider Pilot
+ - Home Support Worker Pilot
+ - Past Caregiver Programs
+
+
+- Canada Immigration FAQ
+- Moving to Canada From Another Country - Moving to Canada from the USA
+
+
+
+Back to top - Home
+- How to Immigrate to Canada
+- Canada Provincial Nominee Programs (PNPs)
+- Prince Edward Island
+- Business Impact
+
+# Business Impact
+
+PEI is seeking experienced business people and entrepreneurs with the skills needed to help propel its provincial economy forward while creating job opportunities for other Canadian citizens and permanent residents alike.
+
+- PEI Business Impact Ranking System
+- PEI Business Impact Recent Draws
+
+Get Started Individuals wishing to invest in and manage a Prince Edward Island business can take advantage of the Work Permit stream of business immigration through the Prince Edward Island Provincial Nominee Program (PEI PNP). The PEI Business Impact category currently includes one stream:
+
+- PEI Work Permit
+
+## Important Updates
+
+As of September 2018, PEI closed two Business Impact streams. Both the PEI 100% Ownership Stream and the PEI Partial Ownership Streams have been closed. These programs are not expected to open in the near future.
+
+## PEI Work Permit
+
+The PEI Work Permit stream provides eligible applicants with the opportunity to come to PEI on a temporary work permit to establish a business. Once the business has been in operation for at least one year, the applicant will receive a provincial nomination for permanent residency.
+
+## PEI Business Impact Ranking System
+
+If a candidate meets all of the eligibility requirements outlined by PEI PNP, they will be able to create a profile in the Expression of Interest (EOI) system. An applicant’s profile will be awarded up to 200 assessment points based on their age, language, education, business ownership or management experience, community endorsement, and adaptability.
+
+### Overview of Factors
+
+| Factor | Max Points |
+| --- | --- |
+| Age | 20 |
+| Language | 40 |
+| Education | 20 |
+| Business ownership or senior management experience | 50 |
+| Community endorsement | 35 |
+| Adaptability | 35 |
+| Maximum Points | 200 |
+
+#tablepress-177 from cache ##
+
+## Age
+
+| Age | Points |
+| --- | --- |
+| 21-24 | 7 |
+| 25-29 | 20 |
+| 30-44 | 20 |
+| 45-49 | 15 |
+| 50-54 | 7 |
+| Over 54 | 0 |
+| Maximum | 20 |
+
+#tablepress-178 from cache ## Language Proficiency
+
+| Proficiency in English or French | Points |
+| --- | --- |
+| CLB/NCLC 10 | 40 |
+| CLB/NCLC 9 | 40 |
+| CLB/NCLC 8 | 35 |
+| CLB/NCLC 7 | 30 |
+| CLB/NCLC 6 | 20 |
+| CLB/NCLC 5 | 10 |
+| CLB/NCLC 4 | 0 |
+| Maximum | 40 |
+
+#tablepress-179 from cache ## Education
+
+| Level of Education | Points (20 max) |
+| --- | --- |
+| Master's or Doctoral (PhD) level | 20 |
+| Post-secondary degree - program of at least 3 years of full-time study | 17 |
+| Post-secondary diploma in a trade that requires at least 2 years of full-time study | 12 |
+| High school | 0 |
+| Maximum | 20 |
+
+#tablepress-180 from cache ## Work Experience
+
+| Work Experience | Points |
+| --- | --- |
+| Business Ownership Experience |
+| Owner (50% or more) and manager involved in the daily operations and have direct involvement in decision-making | At least 5 out of the last 7 years | 50 |
+| At least 3 out of the last 5 years | 40 |
+| Owner (20-50%) and manager involved in the daily operations and have direct involvement in decision-making | At least 5 out of the last 7 years | 35 |
+| At least 3 out of the last 5 years | 25 |
+| Senior Management Experience |
+| Senior Manager involved in daily operations as a primary decision maker and supervising a staff of at least 3 people. Less than 20% ownership in the company | At least 5 out of the last 7 years | 30 |
+| At least 3 out of the last 5 years | 20 |
+| Maximum points | 50 |
+
+#tablepress-181 from cache ## Community Endorsement
+
+| Community Endorsement | Points |
+| --- | --- |
+| Received written endorsement from a rural community | 35 |
+| Received written endorsement from a community within capital region | 10 |
+| Maximum | 35 |
+
+#tablepress-182 from cache ## Adaptability
+
+| Adapdability | Points |
+| --- | --- |
+| The applicant's dependent children have been enrolled in a PEI educational institution for a minimum of 6 consecutive months | 10 |
+| The applicant's spouse or common-law partner successfully graduated from a PEI post-secondary institution | 5 |
+| The applicant's spouse or common-law partner and/or their dependent children have a language ability of CLB 6 or higher in English or French | 10 |
+| The applicant's spouse or common-law partner has at least 3 years of work
+experience in the last 5 years | 5 |
+| The applicant has a close relative that is a Canadian citizen or permanent resident living in PEI for at least 12 consecutive months | 10 |
+| The applicant has experience farming, transferrable farming skills and plan to operate a farm in PEI | 10 |
+| Maximum | 35 |
+
+#tablepress-183 from cache ## PEI Business Impact Recent Draws
+
+| Date | Number of Invitations | Minimum Score |
+| --- | --- | --- |
+| 07/19/2024 | 2 | 105 |
+| 02/21/2024 | 2 | 80 |
+| 02/15/2024 | 1 | 105 |
+| 01/18/2024 | 2 | 80 |
+| 12/21/2023 | 3 | 92 |
+| 11/16/2023 | 7 | 80 |
+| 10/19/2023 | 2 | 80 |
+| 09/21/2023 | 4 | 80 |
+| 08/17/2023 | 4 | 102 |
+| 07/20/2023 | 9 | 80 |
+| 06/15/2023 | 4 | 82 |
+| 05/18/2023 | 3 | 65 |
+| Apr 20, 2023 | 9 | 72 |
+| Mar 16, 2023 | 6 | 52 |
+| Feb 16, 2023 | 6 | 70 |
+| Sep 15, 2022 | 85 | 142 |
+| Aug 18, 2022 | 97 | 117 |
+| Jul 21, 2022 | 60 | 138 |
+| Jun 16, 2022 | 65 | 127 |
+| May 20, 2022 | 62 | 137 |
+| Apr 21, 2022 | 67 | 130 |
+| Mar 17, 2022 | 62 | 130 |
+| 17 February 2022 | 6 | 67 |
+| 20 January 2022 | 11 | 72 |
+| 16 December 2021 | 11 | 67 |
+| 18 November 2021 | 16 | 16 |
+| 21 October 2021 | 9 | 72 |
+| 16 September 2021 | 14 | 72 |
+| 19 August 2021 | 9 | 72 |
+| 15 July 2021 | 9 | 75 |
+| 17 June 2021 | 12 | 60 |
+| 20 May 2021 | 17 | 80 |
+| 15 April 2021 | 16 | 75 |
+| 18 March 2021 | 10 | 70 |
+| 18 February 2021 | 19 | 82 |
+| 21 January 2020 | 15 | 80 |
+| 17 December 2020 | 21 | 85 |
+| 19 November 2020 | 33 | 92 |
+| 15 October 2020 | 27 | 97 |
+| 17 September 2020 | 32 | 102 |
+| 20 August 2020 | 28 | 112 |
+| 16 July 2020 | 29 | 117 |
+| 23 June 2020 | 20 | 117 |
+| 20 February 2020 | 10 | 122 |
+| 16 January 2020 | 13 | 125 |
+| 20 December 2019 | 11 | 140 |
+| 21 November 2019 | 14 | 130 |
+| 17 October 2019 | 12 | 122 |
+| 19 September 2019 | 13 | 115 |
+| 15 August 2019 | 10 | 112 |
+| 18 July 2019 | 17 | 112 |
+| 20 June 2019 | 7 | 112 |
+| 16 May 2019 | 14 | 107 |
+| 18 April 2019 | 17 | 107 |
+| 21 March 2019 | 19 | 110 |
+| 21 February 2019 | 29 | 117 |
+| 17 January 2019 | 30 | 120 |
+| 20 December 2018 | 9 | 130 |
+| 15 November 2018 | 29 | 130 |
+| 18 October 2018 | 27 | 135 |
+| 20 September 2018 | 8 | 152 |
+| 16 August 2018 | 7 | 145 |
+| 19 July 2018 | 50 | 135 |
+| 21 June 2018 | 43 | 140 |
+| 19 April 2018 | 17 | 135 |
+| 15 March 2018 | 7 | 135 |
+| 15 February 2018 | 9 | 117 |
+
+#tablepress-174 from cache ## Ready tostart?
+
+#### Free Immigration Assessment
+
+Discover your Canadian immigration options! Complete our free assessment today and a member of the Canadim Team will contact you to discuss your immigration to Canada.
+
+Get Started ## Related Links
+
+- ## British Columbia Entrepreneur
+
+
+- ## Manitoba Business Investor Stream
+
+
+- ## Nova Scotia Entrepreneur
+
+
+- ## Ontario Business
+
+
+- ## Saskatchewan Entrepreneur and Farm
+
+
+
+## Canadian Immigration Options
+
+- I want to immigrate
+- I want to study
+- I want a work permit
+- I want to invest
+- I want to sponsor
+
+Follow us
+
+-
+-
+-
+-
+-
+
+## Newsletter
+
+Sign up to our Newsletter to keep you up-to-date on the
+ newest programs & development in the Canadian
+ Immigration world.
+
+## Contact
+
+1455 Saint Mathieu Street
+ Suite #100
+ Montréal (QC) H3H 2M4
+
+Email attorney@canadim.com
+Phone +1 514-989-9700
+Fax +1 514-989-9290
+
+Free Phone Consultation
+ +1 (514) 989-9700
+
+© Canadim 2025 -all rights reserved - Privacy Policy - Sitemap
+
+
+
+
+ Free assessment Free assessment Popup start Discover your Canadian immigration options. Get your free assessment now!
+
+Find out if you qualify Popup end Free assessment Express Entry Canadim Services Immigration news Our Blog ## Free assessment
+
+### Canada immigration form
+
+Discover your Canadian permanent residency options.
+
+Start now ### Student Immigration Form
+
+Discover your options to study in Canada.
+
+Start now Start of LiveChat (www.livechatinc.com) code Chat with us ,
+powered by LiveChat End of LiveChat code
+
+Document 3:
+html Prince Edward Island Business Immigration Programs - Canada Immigration and Visa Information. Canadian Immigration Services and Free Online Evaluation. Skip to content **Clear **Search **Free Evaluation Form **Book a Consultation **Free Evaluation Form Search ****Book a Consultation - About ** - About Us
+ - Advertising Disclosure
+ - Editorial Code of Conduct
+
+
+- Immigration ** - Canada Immigration Overview
+ - Express Entry Overview - Express Entry for Skilled Immigration
+ - Canada Express Entry Draws 2024
+ - Comprehensive Ranking System (CRS)
+ - Express Entry Invitations to Apply (ITAs)
+
+
+ - Federal Skilled Worker - Federal Skilled Worker Program Eligible Occupations
+
+
+ - Federal Skilled Trades Program
+ - Canadian Experience Class
+ - Provincial Immigration - Overview
+ - Alberta
+ - British Columbia
+ - Manitoba
+ - New Brunswick
+ - Newfoundland
+ - Northwest Territories and Nunavut
+ - Nova Scotia
+ - Ontario
+ - Prince Edward Island
+ - Quebec
+ - Saskatchewan
+ - Yukon
+ - Atlantic Immigration Program
+
+
+ - Quebec Immigration - Quebec Skilled Worker Immigration
+ - Quebec Experience Class (PEQ)
+ - Quebec Business Immigration
+
+
+ - Pilot Immigration Programs - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+
+
+ - Sponsorship Immigration - Overview
+ - Sponsor Your Spouse or Common-Law Partner
+ - Sponsor Your Parents & Grandparents
+ - Parents and Grandparents Super Visa
+ - Sponsor your children
+ - Sponsorship of Adopted Children
+
+
+ - Refugee Immigration
+
+
+- Business ** - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work ** - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study ** - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Post Graduation Work Permit
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit ** - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship ** - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources ** - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+****- About - About Us
+ - Advertising Disclosure
+ - Editorial Code of Conduct
+
+
+- Immigration - Canada Immigration Overview
+ - Express Entry Overview - Express Entry for Skilled Immigration
+ - Canada Express Entry Draws 2024
+ - Comprehensive Ranking System (CRS)
+ - Express Entry Invitations to Apply (ITAs)
+
+
+ - Federal Skilled Worker - Federal Skilled Worker Program Eligible Occupations
+
+
+ - Federal Skilled Trades Program
+ - Canadian Experience Class
+ - Provincial Immigration - Overview
+ - Alberta
+ - British Columbia
+ - Manitoba
+ - New Brunswick
+ - Newfoundland
+ - Northwest Territories and Nunavut
+ - Nova Scotia
+ - Ontario
+ - Prince Edward Island
+ - Quebec
+ - Saskatchewan
+ - Yukon
+ - Atlantic Immigration Program
+
+
+ - Quebec Immigration - Quebec Skilled Worker Immigration
+ - Quebec Experience Class (PEQ)
+ - Quebec Business Immigration
+
+
+ - Pilot Immigration Programs - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+
+
+ - Sponsorship Immigration - Overview
+ - Sponsor Your Spouse or Common-Law Partner
+ - Sponsor Your Parents & Grandparents
+ - Parents and Grandparents Super Visa
+ - Sponsor your children
+ - Sponsorship of Adopted Children
+
+
+ - Refugee Immigration
+
+
+- Business - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Post Graduation Work Permit
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+- Canada Immigration
+
+# Prince Edward Island Business Immigration Programs
+
+- Colin R. Singer
+- **September 24, 2018
+
+
+The Prince Edward Island Business Impact Category issues permanent residence to entrepreneurs who have established a business in the province.
+
+The Work Permit Stream operates on a two-stage basis:
+
+1. Candidates come to Canada on a temporary work permit and establish their business.
+2. Candidates are nominated for permanent residence once their business is established and the terms of an agreement met.
+
+Previously, the province operated direct permanent residence business streams, but these were closed in September 2018 over immigration fraud concerns.
+
+### P.E.I. Business Immigration Program Eligibility
+
+Applicants can pursue investment in a P.E.I. company on their own or with the help of an approved Island Agent.
+
+Island Agents serve to connect immigration applicants with P.E.I. businesses. Once an immigration applicant has chosen a business in which to purchase or invest, the applicant and the business must jointly submit a business plan to the P.E.I. Office of Immigration through an Island Agent.
+
+The business plan must include:
+
+- A company overview
+- A description of products and services offered
+- A description of the industry in which the business will operate
+- A description of the competitive landscape in which the business will operate
+- A marketing plan
+- An operational plan
+- A description of the company’s management team and staffing
+- A description of applicant’s role in the business
+- Historical financial statements
+- If requested, projected financial statements prepared by a qualified accountant
+
+All businesses that were contacted by an applicant without the help of an Island Agent must also submit the following before submitting a business plan:
+
+- A completed Consent to Pursue Investment Form
+- An up to date, year-end comparative financial statement, including supporting notes
+
+### P.E.I. Business Immigration Program: Financial Requirements
+
+All business immigration applicants to P.E.I. must:
+
+- Invest at least $150,000 Canadian dollars in a P.E.I. company.
+- Control at least 1/3 of the company’s equity OR make an equity investment in the company of at least $1,000,000.
+- Actively and consistently manage the business from within P.E.I.
+- Not include a redemption option in the terms of their investment.
+
+Eligibility Criteria
+
+Businesses must meet the following criteria:
+
+- Is a for-profit corporation incorporated under the Companies Act of Prince Edward Island or the Canada Business Corporations Act.
+- Operate for the purpose of earning profits from active income through providing goods and/or services.
+- Be in good standing on all debts and obligations.
+- Have headquarters in Prince Edward Island.
+- Maintain a “permanent establishment” in P.E.I. as defined under the Income Tax Act by regulation 400 (2).
+- Be liable to pay income tax on taxable income earned as a result of being a “permanent establishment” in Prince Edward Island.
+- Gave good potential for sustained profits in the future.
+- Have assets with a value of at least $150,000. These assets must be actively used for the expansion of the business.
+- Have the potential to create significant economic benefits for Prince Edward Island by contributing to one or more of the following industries. - Value-added manufacturing, processing or primary resource activities.
+ - Exports of goods or services.
+ - Destination tourism.
+ - Tourism attractions.
+ - Fixed roof accommodations.
+ - Research and development.
+ - Technology commercialization.
+ - Any industry in an underserved local or regional market.
+ - Retail and restaurant investment.
+
+
+
+If the business is an Inn or Boutique Hotel, it must:
+
+- Not be a startup
+- Have at least 5 rental units, with each unit having at least a three-piece bath.
+- Have revenues of at least $100,000 in the last operating year. These revenues must be provable by financial statements or a tax return.
+- Have operating expenses of at least $75,000 in the last operating year. These expenses must be provable by financial statements or a tax return.
+
+If the business is in the construction or renovation sector, the applicant must:
+
+- Employ at least 3 arms-length staff members full time for at least 6 months of the year.
+- Conduct business in a location that is not his or her personal residence.
+- Possess sufficient education or at least 5 years of experience in the proposed business.
+- Meet all terms and conditions of any applicable escrow agreement.
+
+If a licence or credential is required in order for the business to operate, the applicant must show in his or her business plan that all relevant licenses and credentials have been obtained.
+
+All businesses participating in the P.E.I. business immigration program will be required to report to the P.E.I. government in order to ensure that the business is following all relevant rules and regulations. These reports will only be mandatory over the first five years of the business’ operation.
+
+### Invalid Businesses
+
+The following businesses CANNOT be used for business immigration applications to P.E.I.:
+
+- Bed and breakfasts
+- Hobby farms
+- Home-based businesses
+- Pay day loan businesses
+- Cheque cashing businesses
+- Money changing businesses
+- Cash machine businesses
+- Pawnbrokers
+- Businesses involving the sale of used goods **except for the following businesses which are still eligible for business immigration.** - Companies involved in the sale of collectibles
+ - Repair companies
+ - Refurbishing companies
+ - Recycling companies
+ - Any other businesses that provides added value for used goods
+ - Most real estate development businesses. A real estate business will still be eligible for the program, however, if it provides significant economic benefit to the P.E.I. economy.
+ - Real estate, insurance or business brokerage
+ - Businesses with the sole purpose of gaining access to immigrant investment
+ - Professional practices
+ - Financial services
+ - Consulting services
+ - An entity that cannot issue shares
+ - Any other type of business that could bring the the Government of Prince Edward Island into disrepute.
+ - Any business that has received any immigration related investments over the past 48 months.
+ - Any business that is already in contact with an immigrant investor.
+ - Any company that is associated with another company that is currently involved in a P.E.I. business immigration program.
+
+
+
+Further excluded businesses:
+
+Only businesses that sell goods and services to the general public are eligible for the program. Thus, the following kinds of businesses are NOT eligible for P.E.I. business immigration:
+
+- Investment companies
+- Real estate rental companies
+- Loan companies
+- Non-active investment companies
+
+### Start-ups and Newly-Incorporated Companies
+
+Companies that are created from the assets of an existing P.E.I. business are eligible as long as:
+
+- A P.E.I. business provides $150,000 in assets to the new company.
+- The new company is a stand-alone business that does not rely on the original business.
+- The P.E.I. business owner has sufficient expertise in the new company’s area of operation.
+
+### Dependants
+
+The following dependants can be included in all P.E.I. business immigration applications.
+
+- Spouse
+- Common Law Partner
+- Dependent children who are: - Younger than 19 and do not have a spouse or common law partner OR,
+ - Financially dependant on their parents due to physical or mental illness
+
+
+
+Interested employers: Kindly contact us here to receive further information.
+
+Interested candidates: Find out whether you qualify to Canada by completing our free online evaluation. We will provide you with our evaluation within 1-2 business days.
+
+
+Advertisement #### Colin R. Singer
+
+Colin R. Singer, Managing Partner of immigration.ca, is a licensed immigration lawyer in Canada with Barreau du Quebec, for the past 30+ years. **Share on facebook **Share on twitter **Share on linkedin **Share on whatsapp **Share on pinterest **Share on reddit **Share on email ### Related articles
+
+##### What to Expect From Canada’s Start-Up Visa Program in 2025
+
+Read More » Colin R. Singer December 23, 2024 ##### Canadian CV checklist: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+
+Read More » Melissa Gosselin December 23, 2024 Subscribe to our Latest Newsletter Latest News - Canadian CV guide – dos and don’ts for 2025: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+November 28, 2024
+- What to Expect From Canada’s Start-Up Visa Program in 2025
+December 23, 2024
+- Canadian CV checklist: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+December 23, 2024
+- Manitoba Issues 399 Canada Immigration Invitations In New PNP Draw
+December 23, 2024
+- Celebrate the holidays in Canadian style: Check out Oh Canada, immigration.ca’s weekly culture and lifestyle newsletter for newcomers
+December 20, 2024
+- Canada The Top Destination for International Job Seekers, Report Says
+December 20, 2024
+- Prince Edward Island PNP Draw: Province Issues 33 Skilled Worker And Business Invitations
+December 20, 2024
+
+## Useful Links
+
+- **Free Immigration to Canada Evaluation
+- **Sign-up for Canadian Immigration Newsletters
+- **Canadian Citizenship Requirements
+- **Canada Work Visa – Work in Canada
+- **Canada Visitor Visa Guide
+- **12 Ways You Can Immigrate To Canada
+
+## Help
+
+- **Book an Immigration Consultation
+- **Contact Us
+- **Disclaimer
+- **Privacy Policy
+- **Fraud alert
+
+Linkedin **Facebook **Instagram **Youtube **Twitter **Podcast **Go to Top
+
+Document 4:
+html Start Preload scrips from tracking section Google Tag Manager End Google Tag Manager END Preload scrips from tracking section Meta Pixel Code End Meta Pixel Code PEI Provincial Nominee Program : Business Impact | Canadavisa.com +1 (514) 937-9445 or Toll-free (Canada & US) +1 (888) 947-9445 | Home About Forum News Client Portal Contact Advertise **Canada Immigration Lawyers - FREE ASSESSMENT
+- Immigrate
+
+- Work
+
+- Sponsor
+
+- Study
+
+- Citizenship
+
+- Inadmissibility
+
+- Legal Help
+
+- Business
+
+- Life in Canada
+
+
+1. **Home
+2. Immigrate
+3. Provincial Nominee Program (PNP)
+4. Prince Edward Island PNP
+5. Prince Edward Island Business Impact Category
+
+# Prince Edward Island Business Impact Category - Work Permit Stream
+
+Last updated: 25 July 2023 ---
+
+## Prince Edward Island's Business Impact Category has a dedicated entrepreneur immigration pathway known as the Work Permit Stream.
+
+The Prince Edward Island Provincial Nominee Program (PEI PNP) Work Permit Stream is for individuals interested in owning and operating a business on the island. Approved business applicants obtain a temporary work permit with Immigration, Refugees and Citizenship Canada (IRCC) to establish their business and if the conditions of the Performance Agreement signed with the Government of Prince Edward Island are met, business applicants may apply for Canadian permanent residence.
+
+The Work Permit Stream operates on an Expression of Interest (EOI) system, which is a points-based system used to assess potential candidates prior to the issuance of an invitation to apply to the PEI PNP Work Permit Stream.
+
+This page will provide the following details on the Prince Edward Island Business Impact Category — Work Permit Stream:
+
+- Minimum Applicant Eligibility Requirements
+- Minimum Business Eligibility Requirements
+- Application Process
+- Expression of Interest System
+- PEI Work Permit Stream - Expression of Interest Draws
+
+## Applicant Eligibility Requirements
+
+
+
+In order to be considered eligible under the Work Permit Stream, individuals must:
+
+- Have a minimum verifiable personal net worth of $600,000 CAD acquired through legal and legitimate sources;
+- Have at least a secondary education level, or equivalent;
+- Have transferable management skills and past employment or business ownership experience;
+- Be within 21-59 years of age at the time of applying;
+- Meet the minimum language requirements equivalent to a Canadian Language Benchmark (CLB) level 4;
+- Intend to reside and work in PEI; and
+- Provide active and ongoing management of the proposed business from within PEI.
+
+## Business Eligibility Requirements
+
+
+
+The Business Impact Category considers applications only involving businesses that generate revenue through the sale of goods or services at arm's length to third parties. This excludes businesses with the primary purpose of deriving investment income, real estate operations, loan investment companies, and other non-active investment. Entrepreneur applicants looking to purchase an existing business must first obtain approval from the PEI Office of Immigration to ensure that the business meets program criteria.
+
+Minimum Requirements for Business Eligibility
+
+In order to be considered an eligible business under the Business Impact Category, the business must:
+
+- Be a for-profit corporation incorporated under the Companies Act of PEI or the Canada Business Corporations Act;
+- Operate for the primary purpose of earning profits from active income through the provision of products/services;
+- Be in good standing with the province on all debts and obligations;
+- Have been an established commercial operation for 12 months prior to the intended business start date with validation provided to as part of the Purchase and Sale Agreement;
+- Maintain corporate headquarters in PEI;
+- Maintain a ‘permanent establishment’ in PEI as defined under the Income Tax Act by regulation 400 (2);
+- Be liable to pay income tax on taxable income;
+- Have good potential for sustained commercial viability;
+- Agree to participate in the evaluation process of the PEI PNP, which requires the business to report to the Office of Immigration on an annual basis for up to five years;
+- Have the potential to create significant economic benefits to PEI; and
+- Meet all terms listed in the Business Performance Agreement.
+
+### Ineligible Businesses
+
+Applications from the following types of businesses will not be considered under the Business Impact Category:
+
+- Any business or member of an associated/related group of companies that has received investment through the Provincial Nominee Program within the past 48 months.
+- Bed and breakfasts, hobby farms, and home-based businesses.
+- If the business is an Inn or Boutique Hotel, it must satisfy the following conditions: - Have at least 5 rental units, each having at least a three-piece bath;
+ - Have revenues of at least $100,000 in the last operating year, supported by financial statements or a tax return; and
+ - Have Eligible operating expenses of at least $75,000 in the last operating year, supported by financial statements or a tax return.
+
+
+
+- Pay day loans, cheque cashing, money changing, and cash machines
+- Pawnbrokers
+- Sale of used goods (excluding collectibles, or where the business provides value-added services such as repairs, refurbishing, or recycling).
+- Construction/Renovation businesses must meet the following: - Have at least 3 arms-length staff employed full-time for at least 6 months of the year that meet the terms and conditions of the Business Performance Agreement;
+ - Rent or construct a space that is outside of their residence to conduct business from; and
+ - Demonstrate relevant education or a minimum of 5 years experience in the proposed business.
+
+
+- Real estate development, unless deemed to be a significant economic benefit to the PEI economy.
+- Insurance or business brokerage.
+- Franchise operations, unless pre-authorized by the PEI PNP office.
+- Start-ups where the applicant will own less than 100% of business unless deemed to be significant economic benefit to the PEI economy.
+- Businesses started for the sole purpose of gaining access to permanent residency through immigration.
+- Professional practices
+- Financial services
+- Consulting services
+- Any entity that cannot issue shares.
+- An entity as described in IRPA Regulations 87(6)(a).
+- Any business that will bring the program or the Government of PEI into disrepute.
+
+## Work Permit Stream Application Process
+
+
+
+- **STEP 1:**Before submitting an Expression of Interest (EOI) profile, the PEI PNP encourages potential business applicants to review the eligibility criteria of the Work Permit Stream to know whether or not they meet program requirements.
+
+- **STEP 2:**Create an EOI profile and provide a valid email address and verifiable identification information. Profiles remain active for six (6) months. It is important to note that an EOI is not application for the Work Permit Stream, but an expression of interest in being considered as a potential applicant for the Business Impact Category — Work Permit Stream.
+
+- **STEP 3:**Candidates who are invited to apply for the Work Permit Stream will be removed from the EOI selection pool. Invited candidates have up to 60 days from the date of invitation receipt to submit a complete application package to the PEI PNP.
+
+- **STEP 4:**In preparing an application, invited candidates must complete all the relevant forms and gather the required supporting documentation. The PEI Office of Immigration may request additional supporting documents at any time during the processing of the application.
+
+- **STEP 5:**The complete application package and the application fee must be submitted to the PEI Office of Immigration within 60 days of receiving the invitation to apply. The application package may be submitted either in person, by courier or by mail within 60 days of receiving the invitation to apply.
+
+- **STEP 6:**If an application is approved, the PEI Office of Immigration will invite the applicant to attend an in-person interview. At the interview, applicants must be prepared to discuss their business proposal in detail and demonstrate a thorough understanding of the business plan . It is important to consult the PEI application guide for a list of forms and documents that must be completed and presented at the interview.
+
+- **STEP 7:**Submit a signed Performance Agreement that outlines the conditions of establishing the business.
+
+- **STEP 8:**If a letter of support is received from the Government of PEI, the applicant can apply for a work permit with IRCC.
+
+- **STEP 9:**If a work permit application is approved, the applicant must report to the PEI Office of Immigration in-person within 30 days of arriving in Canada in order to remain in compliance with the signed agreement.
+
+- **STEP 10:**After arriving in PEI, the business applicant will be assigned a Settlement Officer who will provide support throughout the process of establishing and operating the business. The Settlement Officer will be touch with the business applicant on a regular basis for progress reports on business operations. Business applicants who meet the conditions of the Performance Agreement and the nomination requirements will be issued a nomination from the Government of PEI. They may then apply for Canadian permanent residence with IRCC.
+
+### Performance Agreement and Nomination Requirements
+
+
+
+The Performance Agreement outlines the terms that the Work Permit Stream applicant must meet in order to receive a provincial nomination for Canadian permanent residence from the Government of PEI.
+
+In order to obtain a PEI nomination under the Work Permit Stream and meet the requirements of the Performance Agreement, the applicant must:
+
+- Maintain residence on the island while operating the business and be physically present in PEI for a minimum of 274 days of the year; - Note : If a dependent child is attending a post-secondary institution outside of PEI, the PEI PNP does not require the child to be physically present in PEI for that time period.
+
+
+- Invest a minimum of $150,000 into the business within 12 months of landing in PEI;
+- Operate the business for a minimum of twelve consecutive months;
+- Provide active and ongoing management of the business from within PEI;
+- Provide prepared financial statements noting a minimum of $75,000 in eligible operating expenses; and
+- Meet all other terms and conditions of the signed Performance Agreement.
+
+### The Business Plan
+
+
+
+Business applicants must be prepared to discuss their business proposal and plan during the in-person interview at the PEI Office of Immigration. The PEI business plan must include the following:
+
+- Company overview;
+- Products/services offered, industry analysis, and competitive landscape;
+- Marketing plan;
+- Management team and staffing;
+- Description of your role in the business;
+- How your experience ties into the business;
+- How the business will provide a significant economic impact to the Province;
+- Historical financial statements (if purchasing a business); and
+- Financial projections prepared by a qualified accountant (CPA) (if not purchasing a business).
+
+## Expression of Interest System
+
+
+
+There are six selection factors in the Business Impact Category EOI system for which candidates are awarded up to a maximum of 200. They are Age, Language, Education, Business Ownership or Senior Management Experience, Community Endorsement and Adaptability.
+
+If a prospective applicant shows language proficiency in both official languages, an additional 10 bonus points will be awarded.
+
+| Selection factor | Points |
+| --- | --- |
+| Age | 20 |
+| Language | 40 |
+| Education | 20 |
+| Business Ownership or Senior Management
+Experience | 50 |
+| Community Endorsement | 35 |
+| Adaptability | 35 |
+| Total maximum points: 200 |
+
+### Age
+
+| Age | Points |
+| --- | --- |
+| 21-24 | 7 |
+| 25-29 | 20 |
+| 30-44 | 20 |
+| 45-49 | 15 |
+| 50-54 | 7 |
+| Over 54 | 0 |
+| Maximum 20 points |
+
+### Language
+
+Points for Language are awarded based on valid language test results or proof of a post-secondary academic degree (Bachelor or higher) awarded by a college or university for completion of an English or French post-secondary program. The program must have lasted for at least three years. If evidence of proficiency in both official languages is provided to the PEI Office of Immigration, an additional 10 bonus points will be awarded toward a candidate's EOI score.
+
+When calculating language points, the PEI PNP will consider the lowest score achieved in all four language abilities (reading, writing, speaking, listening) to determine the score. For example, if a candidate has a CLB 7 in Reading, Writing and Speaking, but a 5 in Listening, the CLB will be 5.
+
+| Language ability | Points |
+| --- | --- |
+| CLB 10 | 40 |
+| CLB 9 | 40 |
+| CLB 8 | 35 |
+| CLB 7 | 30 |
+| CLB 6 | 20 |
+| CLB 5 | 10 |
+| CLB 4 OR proof of post-secondary studies in English or French | 0 |
+| Maximum 40 points |
+
+### Education
+
+| Education level | Points |
+| --- | --- |
+| Master’s level or PhD from a graduate school of a college or university, after completion of a Bachelor’s or Master’s degree | 20 |
+| Post-secondary academic degree (Bachelor) from a college or that required at least three years of full-time study | 17 |
+| Post-secondary diploma in a specific trade that required at least two years of full-time study after secondary school | 12 |
+| Completion of secondary school | 0 |
+| Maximum 20 points |
+
+### Business Ownership or Senior Management Experience
+
+| Business Ownership Experience | Years of Experience | Points |
+| --- | --- | --- |
+| Owner (greater than 50%) and manager involved in the day-to-day operations and have direct involvement in decision-making | At least 5 out of last 7 years | 50 |
+| At least 3 out of last 5 years | 40 |
+| Owner (20%-50%) and manager involved in the day-to-day operations and have direct involvement in decision-making | At least 5 out of last 7 years | 35 |
+| At least 3 out of last 5 years | 25 |
+| Senior Management Experience | Years of Experience | Points |
+| Senior Manager involved in the day-to-day operations as the primary decision maker, supervising at least 3 staff and own less than 20% of the company | At least 5 out of last 7 years | 30 |
+| At least 3 out of last 5 years | 20 |
+| Maximum 50 points |
+
+### Community Endorsement
+
+Points for this selection factor will be awarded based on a signed endorsement from a participating PEI community.
+
+| Community endorsement | Points |
+| --- | --- |
+| Written endorsement from rural community | 35 |
+| Written endorsement from a community within capital region | 10 |
+| Maximum 35 points |
+
+### Adaptability
+
+Entrepreneur candidates can be awarded points based on evidence provided of any of the following adaptability factors.
+
+| Adaptability | Points |
+| --- | --- |
+| Dependent child(ren) have been enrolled in a PEI educational institution for at least 6 continuous months | 10 |
+| Spouse/common-Law Partner successfully graduated from a post-secondary institution in PEI | 5 |
+| Spouse/common-law partner and/or accompanying dependent child(ren) have a language ability of CLB 6 or higher in English or French | 10 |
+| Spouse/common-law partner has at least 3 years of work experience in the last 5 years | 5 |
+| Currently have close family member(s) living in PEI for at least 12 consecutive months who are permanent residents or Canadian citizens | 10 |
+| Experience in farming, transferable farming skills and plan to operate a farm in PEI (operation of a registered business where income was derived for a minimum of 3 out of the last 5 years or 5 out of 7 years. The PA must have ownership and be actively involved in the day-to-day operations of the company) | 10 |
+| Maximum 35 points |
+
+#### Discover your options for Canada business immigration
+
+### Immigrate
+
+Immigrate to Canada - Overview
+- USA to Canada Options
+- Immigrate from Nigeria
+- Immigrate from India
+- Immigrate from Pakistan
+- Immigrate from the Philippines
+- Immigrate from Kenya
+- Immigrate from Saudi Arabia
+- Immigrate from the UAE
+- Immigrate from Qatar
+- Hong Kong Options
+- Ukraine Measures
+- Study Pathways to PR
+
+Express Entry - Overview
+- Federal Skilled Worker Program
+- Canadian Experience Class
+- Federal Skilled Trades Program
+- Comprehensive Ranking System
+- Improve Your CRS Score
+- Invitations to Apply
+- Express Entry Draw Results
+
+Provincial Nominee Programs - Overview
+- Alberta
+- British Columbia
+- Manitoba
+- New Brunswick
+- Newfoundland and Labrador
+- Northwest Territories
+- Nova Scotia
+- Ontario
+- Prince Edward Island
+- Saskatchewan
+- Yukon
+
+Quebec Immigration - Overview
+- Quebec Skilled Worker Program
+- Quebec Experience Program
+- Expression of Interest System
+- Arrima Portal
+- Quebec Immigration Pilot Programs
+- Quebec Immigration Levels Plan
+
+Other Federal Economic Programs - Overview
+- Atlantic Immigration Program
+- Caregivers
+- Agri-Food Immigration Pilot
+- Rural and Northern Pilot
+- Start-Up Visa Program
+- Self-Employed Persons Program
+
+National Occupational Classification Language Test Requirements Education Credential Assessment Immigration Levels Plan About the Immigration Department About the Immigration Minister ### Latest News
+
+#### Canada's Express Entry Draw Results from August 14, 2024
+
+Immigration, Refugees and Citizenship Canada (IRCC) has conducted a second Express Entry draw this week, issuing 3,200 more Invitations to Apply (ITAs) to Canadian immigration candidates. Here are the results from IRCC's August 14 Express Entry draw.
+
+Read more... #### Canada's Express Entry Draw Results from July 31, 2024
+
+Immigration, Refugees and Citizenship Canada (IRCC) has conducted a second Express Entry draw this week. Read on for the results from the department's July 31st Express Entry draw.
+
+Read more... ### Explore your options
+
+- **I want to IMMIGRATE
+- **I want a WORK PERMIT
+- **I want to SPONSOR
+- **I want to STUDY
+- **I want to INVEST
+- **I'm new to CANADA
+- **I am an EMPLOYER
+- **I want LEGAL HELP
+- **I want to overcome INADMISSIBILITY
+
+### Canada Immigration Network
+
+- **CanadaVisa.com
+- **CICNews.com
+- **Canadian Immigration Forum
+- **Canadian Immigration News
+- **CanadaVisa News Team
+
+### Connect with us
+
+- **
+- **
+- **
+- **
+- **
+- **
+
+### Call us
+
+**+1 (514) 937-9445 ### Toll-free in U.S. and Canada
+
+**+1 (888) 947-9445 #### Subscribe to our Newsletter
+
+Subscribe CanadaVisa.com | 1303 Greene Ave., Suite 200|Westmount, Montreal, QC, Canada|H3Z 2A7
+
+© Copyright 2024 CanadaVisa.com. All Rights Reserved
+
+- Sitemap
+- Unsubscribe
+- Privacy Policy
+- Disclaimer
+- Copyright
+- Contact Us
+
+
+****Immigrate to Canada**USA to Canada Options Immigrate from Nigeria Immigrate from India Immigrate from Pakistan Immigrate from the Philippines Immigrate from Kenya Immigrate from Saudi Arabia Immigrate from the UAE Immigrate from Qatar Hong Kong Options Ukraine Measures Study Pathways to PR **Express Entry**Federal Skilled Worker Program Canadian Experience Class Federal Skilled Trades Program Comprehensive Ranking System Improve Your CRS Score Invitations to Apply Category-Based Draws Express Entry Draw Results **Provincial Nominee Programs**Alberta British Columbia Manitoba New Brunswick Newfoundland and Labrador Northwest Territories Nova Scotia Ontario Prince Edward Island Saskatchewan Yukon **Quebec Immigration**Quebec Skilled Worker Program Quebec Experience Program Expression of Interest System Arrima Portal Quebec Immigration Pilot Programs Quebec Immigration Levels Plan **Other Federal Economic Programs**Atlantic Immigration Program Caregivers Agri-Food Immigration Pilot Rural and Northern Pilot Start-Up Visa Program Self-Employed Persons Program **National Occupational Classification****Language Test Requirements****Education Credential Assessment****Immigration Levels Plan****About the Immigration Department****About the Immigration Minister**Free Assessment Express Entry CRS Calculator Category-Based Express Entry Draws PNP Finder **Working in Canada****TFWP & IMP****Work Permit Process****Work without a Work Permit****Get Maintained Status****Business Visitors**After Sales Service / Warranty Entertainment Business Visitors Tour Guides Operating in Canada IT Workers as Business Visitors Guest Speakers in Canada **Options for H-1B Visa Holders****Tech Talent Options****LMIA-Exempt Work Permits (IMP)**Canada's Free Trade Agreements Post-Graduation Work Permits PGWP Open Work Permit Extension Spousal Open Work Permit Temporary Work Permits In Quebec International Mobility Program Plus Significant Benefit Intra-Company Transfers TV and Film Production Workers Bridging Open Work Permit Open Work Permits Vulnerable Workers International Experience Canada Athletes and Staff Charitable or Religious Work **LMIA-Based Work Permits (TFWP)**Advertising Requirements LMIA Advertising Exemptions Global Talent Stream Recognized Employer Pilot Quebec Facilitated LMIA Processing Quebec Acceptance Certificate **Employer Compliance**Employer Compliance (IMP) Employer Compliance (TFWP) **About ESDC**Contact Our Work Permit Team **Family Class Sponsorship****Spouse or Common-Law Partner**Outland Sponsorship Inland Sponsorship Spousal Open Work Permit **Child or Other Dependent****Parents and Grandparents**PGP Invitation to Apply Super Visa **Requirements for Each Program**Minimum Necessary Income **Get Maintained Status**Family Assessment Form **Study in Canada**Canada Study Assessment Form Getting Admitted Designated Learning Institutions Letter of Acceptance Programs and Areas of Study Levels of Study Transfer Programs Pathway Programs Accommodation Financial Aid Student Health Insurance Compliance **Get a Study Permit**Student Direct Stream TD International Student GIC Program Study without a Study Permit Study Permit Refusals Renewing or Changing a Study Permit **Study Pathways to PR****Bringing your Family to Canada****Working While Studying****Post-Graduation Work Permits**Get a Free Study Consultation **About Canadian Citizenship**Citizenship Eligibility Calculate Your Citizenship Eligibility How to Apply for Citizenship **Benefits of Canadian Passport****Apply for Proof of Citizenship****Dual Citizenship****Citizenship Ceremony**Get a Free Citizenship Consultation Calculate Your Citizenship Eligibility **Overcome Inadmissibility****Temporary Resident Permit**What is a TRP? **Criminal Rehabilitation**Individual Rehabilitation Deemed Rehabilitation **Inadmissible Legal Opinion Letter**Pre-Sentence Legal Opinion Letter **Visiting with a Criminal Record****DUI****Marijuana****Common Offences**Entering with a Felony Entering with a Misdemeanor Denied Entry to Canada Deported from USA Serious Criminality Airlines and Staff Performing Artists Travel to and from Alaska Cross-Border Trade Hunting and Fishing Trips Transit Through Canada **Charges Within Canada****Authorization to Return to Canada****Refusals and Appeals****Canada Security Clearances****Overcome Medical Inadmissibility****Inadmissibility to Canada FAQs****eTA FAQ****Canada Border Services Agency**Free Consultation **About Cohen Immigration Law**Our Legal Advice Our Professional Credentials **How to Avoid Fraud****Workers' Rights in Canada****Biometrics****Temporary Resident Visas**Electronic Travel Authorization eTA FAQ **GCMS Notes****Tools and Resources**Job Search Tool CLB Language Converter Immigration Processing Times Skilled Occupations by NOC Immigration Processing Fees Free Assessment Contact Us **Business Immigration Overview****Investors****Entrepreneurs**Federal Start-Up Visa Quebec Entrepreneur **Self-Employed**Federal Self-Employed Quebec Self-Employed **Business Visitors**Contact Us **Getting Settled in Canada**Pre-arrival Guide COPR When you Arrive What to do in your First Month Phone and Internet Soft Landing as a PR PR Card PR Obligations **Opening a Bank Account**Bank with TD Credit Cards Saving and Investing About Insurance in Canada Filing your Taxes **How to Find Work**Where to Find Jobs Networking Writing a Canadian Resume Preparing for Job Interviews Bridging Programs Workers' Rights in Canada Canada Job Search Tool **Renting a Home****Buying a Home****Free Settlement Services****Healthcare****Education****Public Transportation****Driving****Buying a Car****Food and Grocery Options****Buying Furniture****How to Dress for the Weather****TV and Home Entertainment****Get to Know Canada**Alberta British Columbia Manitoba New Brunswick Newfoundland and Labrador Northwest Territories Nova Scotia Nunavut Ontario Prince Edward Island Quebec Saskatchewan Yukon Bank with TD How to Find Work Contact our Law Firm Google Tag Manager (noscript) End Google Tag Manager (noscript)
+
+Document 5:
+html [if lt IE 9]>
+
+
+
+
+
+Log in
+
+
+ 1. Government
+2. Agencies, Boards and Commissions
+3. Office of Immigration
+
+# Immigrate to PEI as an Entrepreneur
+
+Share this page: Email this page to a friend Feedback ## Work Permit Stream
+
+Effective Aug 18, 2022 all applicants invited to apply under the BIC-Work Permit Stream must have their net worth verified by one of our designated net worth verifiers. For further instruction, please see Step 4 in the Business Impact Category Guide... ## General Inquiries
+
+Contact Government
+ or use the Feedback tab to share your comments and feedback
+
+## About this site
+
+Learn about public transit service in Prince Edward Island.
+
+**Contact Us**
+Access PEI Locations
+Employee Directory
+
+- Calendar of Events
+- News
+- Publications
+
+- Facebook
+-
+- Subscribe
+-
+- Flickr
+- Youtube
+- Linkedin
+
+© 2025 Government of Prince Edward Island
+
+- Privacy
+- Disclaimer
+- Accessibility
+
+[if gte IE 9]>
+
+
+
+
+
+
+
+Log in
+
+
+ 1. About PEI
+
+# Immigrate
+
+Share this page: Email this page to a friend Feedback Welcome to Prince Edward Island (PEI), Canada's smallest province located on the east coast of North America. This is the ideal place to study, live, work and raise a family.
+
+PEI offers rewarding career opportunities and a business community that is supportive of entrepreneurs. Students come to PEI from more than 60 countries to experience first-rate education. Our higher education programs are meeting the demands for a skilled workforce with industry-specific programs and degrees in diverse fields.
+
+PEI's population is growing. New people are coming to the province, bringing new ideas and possibilities and contributing to our social and economic fabric.
+
+For information about the Provincial Nominee Program, visit Office of Immigration - ## Submit Your Expression of Interest Profile
+
+
+- ## Diversity Events and Facts for PEI
+
+
+- ## Coming to Canada
+
+
+- ## Language Training
+
+
+
+### Popular Content
+
+International Recruitment Events Provincial Nominee Program Skilled Workers Outside Canada Public Schools Language Training ## Immigration Supports
+
+- Skilled Workers Outside Canada
+- Submit Your Expression of Interest Profile
+- Diversity Employment Program
+- Diversity Events and Facts for PEI
+- Language Training
+
+## Newcomer Success
+
+- Riverdale Orchard and Cidery: Immigration at Work
+- Instant Imprints: Immigration at Work
+- This lady's got soul - blues singer makes life on PEI
+- Express Entry Immigration at Work
+- Miller's Esso: Immigration at Work
+
+## PEI for Ukraine
+
+- Prince Edward Island pledges support to Ukraine
+- Dental and prescription benefits extended to Ukrainian evacuees and Government-Assisted Refugees
+- Driver’s license process made easier for Ukrainians
+- Supporting Displaced Ukrainians Destined to PEI
+
+## PEI's International Recruitment
+
+- International Recruitment Events
+- Temporary Work Permit for Physicians
+- Provincial Nominee Program
+
+## Prepare to Come to PEI
+
+- Foreign Credential Recognition
+- Information for Internationally Educated Teachers
+- Be Ready to Work in PEI
+- Adjusting to Life in PEI
+- Coming to Canada
+
+### Immigrate news
+
+### Dental and prescription benefits extended to Ukrainian evacuees and Government-Assisted Refugees
+
+Tuesday, August 23, 2022 ### Driver’s license process made easier for Ukrainians
+
+Thursday, August 11, 2022 ### Prince Edward Island pledges support to Ukraine
+
+Tuesday, March 1, 2022 ## General Inquiries
+
+Contact Government
+ or use the Feedback tab to share your comments and feedback
+
+## About this site
+
+Learn about public transit service in Prince Edward Island.
+
+**Contact Us**
+Access PEI Locations
+Employee Directory
+
+- Calendar of Events
+- News
+- Publications
+
+- Facebook
+-
+- Subscribe
+-
+- Flickr
+- Youtube
+- Linkedin
+
+© 2025 Government of Prince Edward Island
+
+- Privacy
+- Disclaimer
+- Accessibility
+
+[if gte IE 9]>
+
+ END Preload scrips from tracking section Meta Pixel Code End Meta Pixel Code Quebec's Entrepreneur Immigration Programs | Canadavisa.com **1. **Home
+2. Quebec Entrepreneur
+
+# Quebec's Entrepreneur Immigration Programs
+
+Last updated: 27 December 2023 ---
+
+
+
+## The Quebec Entrepreneur Program grants qualified business owners and managers the opportunity to obtain permanent residence in Quebec provided that they can effectively create or acquire a business in the province.
+
+Entrepreneurs must start or take-over a business that corresponds to one of three business profiles, to be eligible for this program (in addition to meeting basic eligibility criteria). Read on to learn more.
+
+Note: The following changes to the Quebec Entrepreneur Program will come into effect on January 1st, 2024.
+
+## Get a Free Telephone Consultation with the Cohen Immigration Law Firm
+
+Name* Email* Location* Phone Please describe your enquiry* Yes, please send me the free Canadian Immigration Newsletter by email. Submit ---
+
+## Table of Contents
+
+- About the Quebec Entrepreneur Program and general requirements
+- Innovative companies
+- Business start-ups
+- Takeovers
+- About the Cohen Immigration Law Firm
+
+---
+
+## About the Quebec Entrepreneur Program
+
+The Quebec entrepreneur program is an immigration program for entrepreneurs to either set-up new/innovative businesses or take over existing businesses in the province. The program received a complete overhaul in November 2023, with current changes set to come into effect on January 1st, 2024.
+
+Note for the purposes of this program an entrepreneur is defined as: a foreign national aged at least 18 years old who comes to settle in Quebec to operate a business that is not in an ineligible sector and [who] exercises a significant part of the power to do so. The individual in question must manage the businesses’ affairs, as part of one of the following projects:
+
+1. An innovative company;
+2. A business start-up; or
+3. A business Takeover.
+
+These three initiatives make up the new streams of the entrepreneur program. In addition to meeting the specific eligibility criteria for each stream, all entrepreneurs will also have to meet the following general conditions: Talk to a lawyer
+
+
+
+
+
+
+
+
+- Stories - - - #### Success Stories and Useful Resources
+
+Success Stories and Useful Resources
+ - #### Success Stories
+
+
+
+Success Stories
+
+See how we've helped our clients.
+
+
+
+
+ - #### Immigration Business Plan Guide
+
+
+
+Immigration Business Plan Guide
+
+Learn all about the immigration business plans for Canada.
+
+
+
+
+
+
+ - - #### Country Guides
+
+
+
+Country Guides
+
+Explore our tailor-made business immigration country guides.
+
+
+
+
+ - #### Video Library
+
+
+
+Video Library
+
+View our past live streams and videos.
+
+
+
+
+ - #### Testimonials
+
+
+
+Testimonials
+
+Read words directly from our clients.
+
+
+
+
+
+
+ - - ####
+
+### Hassle-Free Immigration For Companies, Business Owners, Foreign Entrepreneurs & Investors
+
+Schedule a meeting with a licensed Canadian immigration lawyer right now.
+
+Talk to a lawyer
+
+
+
+
+
+
+ - - - Australia
+China
+Hong Kong
+India US
+Mexico
+Nigeria
+Russia Singapore
+South Africa
+Indonesia South Korea
+UAE
+Vietnam
+
+
+ -
+
+
+
+
+- Contact
+
+Search END of header # Start-Up Visa Program Canada: A Complete SUV Guide for 2024.
+
+Your definitive guide to launching your start-up in Canada in 2024.
+
+Talk to a Lawyer Home » Canada For Start-Ups » Start-Up Visa Program Canada: A Complete SUV Guide for 2024
+
+BEGIN of page content Foreign entrepreneurs can gain permanent residence in Canada by starting innovative businesses through Canada’s start-up visa. The program offers a pathway for entrepreneurs and their families to relocate to Canada, emphasizing the eligibility requirements, application process, and potential for securing permanent residence.
+
+If you’re exploring business immigration options in Canada and have access to capital between CAD $200,000 and CAD $500,000, the Canada Start-Up Visa program could be the right opportunity to consider. It offers the chance to start your business in Canada, providing a pathway to live and work in Canada with your family. This guide will help you understand how to seize this opportunity and cover program eligibility, the application process, and other essential aspects of navigating the Start-Up Visa Program.
+
+## What is a Start-Up Visa in Canada?
+
+The Canada Start-Up Visa Program is a business immigration program that allows foreign entrepreneurs to obtain permanent residence in Canada by starting innovative businesses. Successful applicants and their families can relocate to Canada within 3 to 6 months and obtain permanent residency within 2.5 to 3 years. The program targets entrepreneurs supported by Canadian designated organizations (incubators, angel investor groups or venture capital funds). Up to five business partners can participate in the same start-up, provided they meet certain requirements.
+
+## Start-Up Visa Canada Requirements
+
+To be eligible for the Canada Start-up Visa Program, applicants must:
+
+- Obtain a Letter of Support from a **Designated Organization in Canada**;
+- Incorporate the business within Canada;
+- Individually hold a minimum of 10% voting rights in the company alongside a Designated Organization;
+- Collectively, the applicants and the Designated Organization must possess over 50% of voting rights;
+- Actively manage the business, with core operations in Canada during and after the application process;
+- Fulfill language proficiency at CLB 5 in English or French;
+- Have adequate settlement funds and operational capital, ideally over $200,000.
+
+
+
+## Changes to Canada’s Start-Up Visa Program
+
+On April 29, 2024, Canada’s Minister of Immigration, Refugees and Citizenship, Marc Miller, announced significant changes to the Start-Up Visa program aimed at reducing application backlogs and improving processing times. These changes, effective from April 30, 2024, are part of a broader effort to modernize Canada’s immigration system. Here’s a breakdown of what’s new and what it means for entrepreneurs looking to move to Canada.
+
+Key Changes:
+
+1. **Cap on Permanent Residence Applications**: The program will now limit the number of permanent residence applications linked to the SUV program. Each designated organization (such as venture capital firms, angel investor groups, or business incubators) can submit no more than 10 start-up applications annually. This restriction will remain in place until the end of 2026.
+2. **Priority Processing for Select Start-ups**: Applications for start-ups backed by Canadian capital or supported by incubators that are members of Canada’s Tech Network will now receive priority processing. This applies to both new and existing applications in the queue.
+
+Implications for Entrepreneurs:
+
+- **Limited Application Slots**: With the cap, fewer entrepreneurs will be able to apply through the SUV program each year. This change may create competition for the limited slots, particularly for those who have already secured initial backing from a designated organization.
+- **Faster Processing for Priority Applications**: Start-ups with Canadian financial backing or linked to key incubators will benefit from faster processing, offering a clear advantage over others.
+- **Quality Over Quantity**: The changes are designed to encourage designated organizations to focus on supporting only the most promising ventures, improving the overall quality of applications.
+
+Tips for Entrepreneurs:
+
+1. **Secure Canadian Support**: If possible, aim to secure investment from a Canadian venture capital firm or incubator, as this will enhance your chances of receiving priority processing.
+2. **Explore Other Pathways**: If the SUV program is not a viable option due to the new caps, consider alternative routes such as provincial entrepreneur nominee programs , the C11 visa, or intra-company transfers .
+3. **Be Prepared**: Given the competition, make sure your business plan is robust and aligns with Canada’s entrepreneurial goals to improve your chances of success.
+
+## Processing Time for Start-Up Visa Program
+
+As of September 2024, it takes about 40 months, or just over three years, for most Start-Up Visa applications to be processed. However, this is just an estimate and the actual time can vary based on how busy the immigration office is. The backlog of applications is quite large. As of February 29, 2024, there are 29,128 people waiting across 9,125 cases. Of these, 14,508 people are waiting to move forward in the process, and 10,458 people are waiting to have their eligibility checked. Only 4,030 people are close to receiving a final decision. With such a large number of pending applications, the recent changes to the program aim to speed up processing by limiting the number of applications each year and giving priority to those backed by Canadian investors or incubators. Entrepreneurs should be aware of these long wait times when planning their immigration journey.
+
+## Canada Start-Up Visa Success Rate
+
+According to the most recent statistics, the approval rate for permanent residence applications under the Start-Up Visa program is 77.2%, based on IRCC data from January 2023 to November 2023. During this period, IRCC processed 3,334 applications for permanent residence and approved 2,577 of them. There were 267 applications withdrawn and 490 that were refused. Thus, based on these figures, the SUV program has a general success rate above 77%. However, our team achieved an SUV success rate of 100% in 2023.
+
+## Start-Up Visa vs Other Business Immigration Programs
+
+In addition to the start-up visa program, there are various business immigration programs in Canada that entrepreneurs can use to relocate to Canada. Specifically, you can explore the C11 Entrepreneur Work Permit, Intra-Company Transfer Program, Self-Employed Category, Provincial Nominee Programs, or Quebec Immigrant Investor Program. See our table below to compare these programs and understand the pros and cons of each.
+
+| Criteria | Start-Up Visa | Business Work Permits to Permanent Residency Pathways (C11, ICT, C10) | Self-Employed Category | PNPs |
+| --- | --- | --- | --- | --- |
+| Applicants | Business owners or professionals with experience or specialized knowledge | Business owners, entrepreneurs, investors, professionals | Self-employed professionals in cultural or artistic fields, including athletics, with unique skills. | Individuals willing to start a business or invest in a particular province |
+| Type of Business | Innovative, scalable, can create jobs for Canadians, and are capable of competing globally. Must attract support or investment from Canadian designated organizations. | Business that will contribute bring significant economic, social or cultural benefits to Canada (such as create jobs, stimulate economy or transfer knowledge or skills to Canadians) | Self-employed businesses that make a significant contribution to the cultural or athletic life of Canada. | New or existing business that aligns with the target province's economic development and diversification priorities and contributes to the local economy. |
+| Partnership Limitations | Up to 5 partners can apply as owners of a single business | Usually, up to 2 partners can apply as owners of a single business | Not applicable | Vary by province, but each partner must meet investment and eligibility requirements |
+| Capital Required | $10,000-$50,000 Designated Organization’s admin fees;
+
+Business operational costs: $200,000 | Depends on business, but entrepreneurs should have access to min. $200,000 | Applicants should have access to min. $50,000 | Vary by province, but starting investment amount is $100,000 (Alberta) |
+| Language Skills | CLB 5 | Not required for work permit.
+
+CLB 6 for permanent residency. | Not required, but strongly recommended CLB 5 | Min. CLB 4 |
+| Processing Time: Work Permit | Country specific, usually 2-6 months | Country specific, usually 2-6 months | Country specific, usually 2-6 months | Program specific, usually 4-6 months |
+| Processing Time: Permanent Residence | As of March 2024: 2.5-3+ years. | Using Express Entry pathway after 1 year of work in Canada: 4-6 months | As of March 2024: 2.5-3+ years | As of March 2024: 18 months -3 years |
+| Approval Rate | In 2023: 72% | Depends on business. In our experience between 75%-88% | No available data | No available data |
+
+#tablepress-3 from cache ## How to Get Canada Startup Visa
+
+Applying for a Canada Start-Up Visa involves a series of steps divided into three phases: 1) ensuring the viability of your business idea and your potential as an entrepreneur; 2) submitting an immigration application; and 3) actively working to build your start-up in Canada while your permanent residence application is processed. Once you confirm that you meet the basic eligibility criteria for the Start-Up Visa Program—which includes language proficiency and sufficient settlement funds—you can follow the steps outlined below to increase your chances of success in this program.
+
+- **Step 1: Business Concept Development:**Developing your business concept is a foundational step in turning your innovative idea into a business model with global scalability potential. It’s crucial to start with a clear vision of your start-up project, an understanding of your competitors, a strategy to compete with established players, and a detailed operational plan, including what parts of the project will be carried out in Canada. Many entrepreneurs encounter challenges in creating a robust business concept capable of attracting support from designated organizations. Our business team can assist you in brainstorming ideas, researching your target market, evaluating the competition, and defining your unique value proposition. Our in-house team is equipped to help our clients craft comprehensive business plans, outlining vision, objectives, strategies, financial projections, and the anticipated contribution to the Canadian economy. Our clients have achieved a 100% success rate in securing support from designated organizations.
+- **Step 2: Select the Right Designated Organization:**Choosing the right designated organization is a critical step in this process. As of 2024, there are 84 Designated Organizations—comprising angel investor groups, venture capital funds, and business incubators—authorized by the Canadian government to invest in or support potential start-ups for the Start-Up Visa Program. Each has distinct criteria and interests, so selecting one that aligns with your business idea involves researching their investment history, examining the types of start-ups they have previously supported, and assessing their mentoring capabilities. Moreover, most organizations charge administrative fees that range from $10,000 to $50,000. While some organizations do not charge fees, they may have limited intake capacities or be highly competitive. We have cultivated relationships with numerous designated organizations and can guide you in choosing the organization that best fits your project.
+- **Step 3: Obtain Support from the Designated Organization:**Once you have selected several designated organizations, follow the instructions on their websites to apply for the Start-Up Visa (SUV) program. The process typically involves pitching your business concept to them with a compelling presentation and demonstrating the potential of your idea. If they are convinced of your start-up’s viability, they will issue a Letter of Support, a critical document for your SUV application. If you feel intimidated by this process and need support, our team can assist you throughout the application process and can accompany you during the pitch to provide support.
+- **Step 4: Prepare Your Documents**: Gather all necessary documents, including the Letter of Support from a Designated Organization, proof of language proficiency at CLB 5, proof of settlement funds, business plan, and other required documents per the application guide.
+- **Step 5: Submit Your SUV Immigration Application**: Complete the application forms for the Start-Up Visa Program and submit them along with the required documents and the application fee. Along with your personal documents, submit a Pitch Deck that clearly communicates your business vision, Articles of Incorporation to prove legal business formation, and a Capitalization Table detailing the start-up ownership structure. Include your start-up’s logo, comprehensive customer or supplier lists, documentation of any intellectual property, and financial statements for financial transparency. Also include forward-looking financial forecasts, which are essential for assessing the potential success of your enterprise. Before submission, review your application for completeness to prevent any unnecessary delays.
+- **Step 6: Start Your Business in Canada:**After you’ve submitted your application for permanent residence, you can turn your attention to launching and nurturing your business in Canada according to your business plan and the commitments you’ve made to the Designated Organization. If you’re an essential member of your start-up and need to be in Canada sooner, you may apply for and obtain a work permit. This will allow you to move to Canada while the Canadian immigration authorities process your PR application.
+- **Step 7: Update IRCC about Your Progress with Business**: While awaiting your permanent residence status, it is crucial to keep IRCC updated on the progress of your start-up project. Updating IRCC has become increasingly important, especially after a notable decline in approval rates in early 2023 (January to April 2023), which fell to 51% from the historical average of about 75% from 2016 to 2022. IRCC officers have been known to routinely refuse SUV applications if they are not satisfied with the business progress thus far. Many rejections occur because the applicant has made minimal progress, presented a poor business model, or appeared to lack serious intent. To mitigate IRCC’s concerns, it’s advisable to proactively provide updates on your business’s progress every 6 months. This regular reporting can demonstrate your commitment to the venture and may help alleviate any potential issues regarding the seriousness of your intentions or the quality of your business model.
+- **Step 8: Receive a Decision:**After evaluating your application, IRCC will notify you of their decision. The communication will come via the contact details in your application, so it’s important to ensure they are current and accurate. If your application is successful, you will be granted PR status, a significant milestone on your entrepreneurial journey in Canada. Should the decision be negative, you will be given reasons and, if applicable, instructions on how to address any deficiencies or appeal the decision.
+
+## List of Designated Organizations
+
+Depending on the type of designated organization you partner with, you will need to either complete a startup development program or receive funding from them in exchange for equity in your company to receive your letter of support. It is one of the most critical requirements of the SUV. You must obtain a Commitment Certificate and Letter of Support from one or more Venture Capital Funds, Angel Investor Groups, and/or Business Incubators. Here is a complete list of the designated organizations.
+
+## Advantages and Disadvantages of Start-Up Visa
+
+It would be best to consider the benefits and drawbacks of this program before taking any further steps. It is crucial to fully understand what this program offers and whether it is right for you.
+
+#### Advantages of the Program
+
+Below are some of the pros of the SUV program:
+
+- A direct pathway for permanent residence in Canada.
+- Open to all nationalities.
+- No limitations on business activities in Canada.
+- No net worth requirement or verification.
+- Allows for a partnership of 5 individuals in the same start-up (min. 10% of ownership for each partner is required); and
+- Opportunity to relocate to Canada by obtaining a work permit while the permanent residence application is processed.
+
+#### Disadvantages of the Program
+
+Below are some of the cons of the SUV program:
+
+- High competition to obtain support from designated organizations in Canada; thus, it can be challenging to get such support.
+- Lengthy processing times (3+ years) to obtain permanent residence.
+- High capital investments by the founding partners are often required to secure support from a designated organization.
+- An extremely well-developed, viable and scalable business model is needed with a proven track of success and
+- There is a moderate risk of refusals at the permanent residence stage and/or delays due to peer reviews.
+
+## Start-Up Visa Canada Costs: Full Review
+
+The costs of the Start-Up Visa program in Canada range between CAD $150,000 to $250,000+, depending on various factors. Please refer to the sample cost structure below to understand how much money you must set aside to fund your Start-Up Visa program application. All fees below are approximate estimates in Canadian dollars, including the fees that are charged by service providers and various companies providing the SUV Program support:
+
+
+
+Inner panel Start #### Pitch Deck Preparation
+
+- **$3,000 - $5,000**(if you have your own start-up that is innovative, scalable and generating $500K+ in revenues per year)
+- **$100,000+**if your start-up does not meet the requirements above (this fee usually includes market research and validating your assumptions in the Canadian market, plus generating initial traction with customers to achieve the market-product fit that Designated Organizations would require)
+
+Inner panel End Inner panel Start #### Fees Charged by Designated Organizations
+
+- Incubators: **$40,000+**per company. Learn more about business incubators in our **interview with Spark Centre**and in our **interview with Synergy Labs**.
+- Angel Investors: **$25,000-****$45,000+**per founder.
+- Venture Capital Funds: **$50,000+**per company. Find out more about VC companies in our **interview with WhiteHaven Securities**.
+
+Inner panel End Inner panel Start #### Legal Costs
+
+- Professional Fees (lawyers): approx. **$30,000+**per applicant
+
+Inner panel End Inner panel Start #### Government Fees
+
+The **SUV application fees**are as follows: - PR: Main Applicant – **$2,140**
+- PR: Spouse – **$1,365**
+- PR: Dependent Child – **$230**
+
+Inner panel End Inner panel Start #### Business Execution Costs
+
+- These costs will depend on the nature of the business and industry. However, be prepared to set aside at least **$100,000+**per applicant to fund the operational costs of your start-up venture while waiting for your permanent residence.
+
+Inner panel End ## Our Experience with Startup Visas
+
+In our experience with Start-Up Visas in Canada this past year, we’ve noted that IRCC frequently sends follow-up letters requesting additional information.
+
+Examples of the types of questions included in these inquiries are as follows:
+
+- What actions have you undertaken to establish your business in Canada?
+- Could you detail the contributions from the Designated Organization up to the present?
+- Do you have a concrete plan to ensure your business’s success, and has such a plan been successful previously?
+- We require further details on your product development roadmap, the percentage of progress made, and the planned timeline and budget for completion.
+- Can you outline the advancements your business has made since its incorporation?
+- Why was Canada chosen as the location for your business, and were other countries considered?
+- Could you explain how critical parts of your business operations will be conducted in Canada?
+- Can you provide information on how you met the other founding partners?
+- Explain why your presence in Canada is urgently needed.
+
+> “These inquiries by IRCC suggest a more rigorous examination of the authenticity and intent of SUV applicants’ business activities in Canada. The agency is shifting towards a more independent assessment of the business venture’s viability and the applicants’ true intentions beyond the support evidenced by the Letter of Support. Therefore, it’s essential to demonstrate intent that aligns with the program’s objectives—to establish and grow an innovative business in Canada and to relocate permanently to oversee its development rather than using the program solely as a means for immigration.” Feruza Djamalova, Senior Business Immigration Lawyer
+
+## Start-Up Visa Application Delays and Rejections
+
+Sometimes, the Immigration Officer may initiate a peer review if the Officer doubts the genuineness or feasibility of the enterprise. The peer review panel will verify if the designated entity has conducted the proper checks and investigations according to industry standards.
+
+Recently, a series of cases at the Federal Court level highlighted common issues that IRCC officers have been questioning in Start-Up Visa applications. These cases shed light on several key areas of concern for IRCC, such as:
+
+- applicant’s direct experience
+- substantive proof of the business’s past and projected performance
+- essential operations that are to be based in Canada
+- applicant’s engagement with the Designated Organization during the application’s waiting period,
+- overall viability of the business, including its growth orientation and the size of the target market.
+
+Applicants are now often asked to detail their efforts in establishing their business within Canada, the nature and extent of the contributions made by the Designated Organization thus far, and to substantiate the presence of a solid, actionable business plan that is likely to lead to a prosperous outcome based on previous successes. These inquiries are designed to ensure that the Start-Up Visa program fosters genuine, growth-oriented business endeavours with a tangible presence and future in the Canadian economy.
+
+In general, make sure that your business performance is well-documented and that there is significant evidence available to demonstrate the genuineness and viability of your undertaking. Most importantly, make sure to follow our top tips to ensure the success of your application.
+
+## How We Can Help With Your Canada’s Start-Up Visa Applications
+
+At our firm, we approach Start-Up Visa (SUV) applications with a distinctive methodology that sets us apart from the industry standard. Our initial step is personal—we take the time to get to know you. Understanding your background, experience, budget limitations, aspirations, and business goals is crucial for us to evaluate your startup idea’s viability and potential effectively. We believe in honesty; if we find that your idea is unfeasible or too vague, we’ll tell you straight.
+
+Once we establish the groundwork, our in-house business team collaborates closely with you to refine your idea into a viable startup project. We delve into understanding the capital and human resources required, ensuring you have a solid foundation. Unlike many in our field, we don’t outsource business plan writing. Our legal experts, trained in business, work alongside our specialized business team to craft pitch decks and business plans. This synergy ensures perfect coherence and alignment with your entire application, reflecting your experience and documentary evidence. Each element is tailor-made for you, underlining our commitment to your success both in business and immigration.
+
+But our support doesn’t end there. We assist you in selecting the right Designated Organization, leveraging our status as intake partners for many to negotiate discounts on your behalf—passing any commission we receive directly to you. We’re there for you during the pitch interview, offering robust support as you navigate the due diligence process. With us, you’ll be well-prepared to answer questions and showcase your thoroughly researched and viable business plan.
+
+After securing the Letter of Support, we meticulously prepare and submit your immigration application, ensuring no document is overlooked and preemptively addressing potential issues. Our dedication continues as we partner with you in Canada, staying on course with your business plan and providing regular updates to IRCC to expedite the processing your PR application.
+
+We are more than transactional lawyers; we are your partners on this journey. We take the trust you place in us seriously when you entrust your future to our care. We believe every newcomer deserves an honest, competent, and caring immigration professional by their side. Your trust is something we value deeply and are always grateful for.
+
+
+
+## Frequently Asked Questions
+
+Below you will find answers to the most frequently asked questions that are based on our experience with Start-Up visas:
+
+Inner panel Start #### How much money is required for a Startup Visa in Canada?
+
+While the Canadian Startup Visa program does not require a set investment amount, applicants should be financially prepared for significant expenses associated with launching and sustaining a business. Typically, the total cost ranges from CAD 120,000 to CAD 300,000, depending on the complexity of the business concept, family size, and various necessary expenditures, including: - Business concept development: CAD 20,000 - CAD 100,000
+- Designated incubator fees: CAD 25,000 - CAD 50,000
+- Legal fees: CAD 10,000 - CAD 30,000
+- Company formation fees: CAD 3,000 - CAD 5,000
+- IRCC government fees per family: CAD 3,500 - CAD 5,000
+- Operational costs over three years (includes hiring, taxes, and expenses): CAD 50,000 - CAD 150,000
+
+These figures are estimates and vary based on the specifics of your Startup and personal circumstances. Inner panel End Inner panel Start #### Can I get a Startup visa without investment in Canada?
+
+While it is theoretically possible to secure a Startup Visa (SUV) without initial investment in Canada, the reality is that it's extremely challenging. Success in the SUV program hinges on an entrepreneur's ability to establish a business that is not only innovative but also scalable on a global level. This typically requires significant capital investment. Entrepreneurs must either possess personal funds to drive their business ventures or possess exceptional skills in securing funding.
+
+Additionally, a well-developed product with an existing customer base or substantial market traction is crucial to gaining the interest of designated investors such as angel investor groups or venture capital funds. These investors tend to favour businesses that have either secured prior capital or have a stream of revenue from customers. Thus, while the program does not explicitly mandate capital investment, the landscape of institutional investment makes it a de facto requirement, with only a handful of entrepreneurs navigating the SUV pathway without it. Inner panel End Inner panel Start #### What are the disadvantages of a Startup visa in Canada?
+
+The top 3 disadvantages of the SUV program, in our view, can be narrowed down to the following: 1. **Lengthy processing time for permanent residency applications**. It's not uncommon for entrepreneurs to wait for about 3 years for a decision from Immigration Canada. This prolonged period of uncertainty can be a significant barrier, complicating business planning and operations due to restricted access to Canadian capital and business opportunities. While waiting for permanent resident status, start-up visa applicants often find themselves in a temporary status limbo that can affect their ability to execute their business plan fully.
+2. **There's no assurance of a successful outcome**. Despite the long wait, around 30% of Startup Visa applications are denied. Common reasons for refusal include questions about the business's potential for success, insufficient progress, or other errors in the application. The Federal Court has recently upheld that IRCC officers are not obligated to follow the recommendations from designated organizations that support these start-ups. They are permitted to conduct their own evaluations of the applications, which can lead to unexpected reasons for rejection, especially as IRCC gains more expertise in scrutinizing these complex applications.
+3. **Financial self-reliance is another significant concern**. Applicants must demonstrate they have adequate financial resources to support themselves and their families while their permanent residency is being processed. They also need to ensure they have the funds available to maintain their business and continue developing their project. This requirement becomes even more challenging because, during this waiting period, if the applicants are in Canada, they are not allowed to take on employment outside their Startup business, putting additional financial pressure on them.
+
+Inner panel End Inner panel Start #### I have a pitch deck and a business plan, but I do not have a product yet. Am I able to get a startup visa in Canada?
+
+While no explicit requirement prohibits you from applying without a launched product, securing from a designated organization without a minimum viable product (MVP) and some customer traction can be challenging. A critical component of the application is obtaining a Letter of Support from a designated organization. These organizations typically look for proof of your concept, which often includes a demonstration of your product and evidence of initial user engagement. In our experience, the presence of an MVP and customer validation were frequently cited as preliminary requirements by different designated organizations.
+
+To strengthen your application, I recommend finalizing your MVP and acquiring a customer base before applying. This approach not only demonstrates the real-world potential of your business idea but also signals to potential incubators and investors that your project has begun to gain market traction. Remember that designated organizations will also evaluate other aspects of your proposal, such as the uniqueness of your business idea, the quality of your pitch deck and business plan, your experience as a founder, your ability to execute the proposed project, and the availability of sufficient funds to support your business endeavour. Inner panel End Inner panel Start #### Can my work permit for a Startup visa be rejected?
+
+A work permit application under the Startup Visa program can be rejected. The top three reasons for such rejections include: 1. **Unclear Business Intent**: When applying for an SUV Work Permit, you must convince the officer that there is an **urgent**need for your presence in Canada. Therefore, if your work purpose is unclear and not described in your application precisely, the Immigration Officer can reject your application. Also, do not forget to include your comprehensive business plan and description of all activities planned in Canada.
+2. **Lack of Demonstrated Significant Benefit**: Your application must be accompanied by evidence that your business activities will significantly benefit Canada. If no documentation supports this claim, the likelihood of the permit being granted is reduced.
+3. **No Evidence on Dual Intent**: Even if you are applying for permanent residence, you must still convince the immigration authorities that you will leave Canada if your PR application is rejected. If you fail to include evidence of your ties to your home country, it is open for an Officer to conclude that you only have a singular intent, and you may not adhere to the conditions of your temporary stay in Canada.
+
+To avoid these pitfalls, provide ample evidence on critical areas of your Work Permit application. Inner panel End Inner panel Start #### How long does the processing of an SUV PR application take?
+
+As of March 2024, the IRCC estimates the processing time for a Start-Up Visa application to be about 37 months, which is just over 3 years. These estimates are based on historical data and are a general guide. Actual times may vary as they depend on the volume of applications received and how quickly they can be processed.
+
+Another way to look at it is by current application backlogs and planned processing rates. With about 8,000 applications in the queue (as of April 2023) and an annual processing goal of 5,000 in 2024, increasing to 6,000 in the following years, it would take over two years to work through the existing applications, assuming no new ones are added.
+
+Both methods indicate a processing time of around 2.5- 3 years, but these are estimates and the actual time may be different. Inner panel End Inner panel Start #### Can my SUV PR application be rejected?
+
+Yes, your Start-Up Visa (SUV) application can be rejected. According to Federal Court data from the past three years, the reasons for rejection include: - **Lack of Progress and Accomplishments**: Applicants often failed to show significant progress or achievements in developing their business venture since it started. They also struggled to prove their active involvement in the business or to give detailed information about their contributions and roles.
+- **Inadequate Experience**: Applicants lacked relevant experience, especially in critical areas like technology, which is vital for the proposed business.
+- **Questionable Business Necessity in Canada**: There were doubts about the need for the business venture to be in Canada or the applicant's dedication to operating within the Canadian market.
+- **Faulty Business Model**: The business model raised concerns due to its feasibility and the research behind it. This includes unclear business plans, unrealistic financial projections, or insufficient market research. Often, the issue was a lack of focus on the Canadian market, with the business primarily targeting customers outside Canada and showing little evidence of benefiting the Canadian market.
+- **Absence of Seriousness**: There was an overall impression of a lack of seriousness towards the business venture, shown through poor planning, inadequate preparation, and neglecting essential operational details. This lack of seriousness suggested that the main goal of the application was to gain immigration status rather than to genuinely engage in the proposed business activity.
+
+To improve the chances of approval, applicants should ensure their business plan is thoroughly researched, clearly presented, and shows a real intention to contribute to the Canadian economy. Providing detailed evidence of progress, personal involvement, and a solid plan for operating within Canada can help address these issues. Inner panel End Inner panel Start #### Is there an age limit for a Startup Visa in Canada?
+
+No, there is no age limit for applying to the Start-Up Visa Program in Canada. The program focuses on the viability of the business idea, the entrepreneur's ability to meet the program's requirements, and the potential for the business to compete globally.
+
+However, it's important to note that relevant experience and skills are crucial for participation. Applying with limited experience could raise questions about your ability to contribute significantly to the SUV project. The program is designed with a preference for mature applicants who have accumulated work experience and possess the skills necessary to establish and grow a successful company in Canada. Therefore, regardless of age, demonstrating a solid background in your field and a clear vision for your business is essential. Inner panel End Inner panel Start #### How easy is it to get a Startup Visa in Canada?
+
+Securing a Start-Up Visa (SUV) in Canada is a process that demands careful planning, a compelling business idea, and adherence to specific criteria. It's not necessarily about the ease of the process but about meeting the program's rigorous requirements. A successful Start-Up Visa (SUV) application hinges on the viability of the business idea and the **tangible steps**taken towards establishing and advancing the business in Canada. Therefore, the applicants must be prepared to take steps to strengthen their application, including: - **Detail Your Business Establishment Efforts**: Clearly outline the actions you've taken to set up your business in Canada. This includes registering your business, securing office space, hiring staff, or any initial marketing efforts.
+- **Highlight Contributions from Designated Organizations (DO)**: Explain the support, whether financial, mentorship, or resources, provided by the DO from the start until now. This showcases the credibility and potential of your business idea.
+- **Showcase Your Business Plan's Viability**: Demonstrate that you have a detailed, actionable plan for making your business successful. If you've implemented a similar plan in the past, highlight its success and how it's being adapted for the Canadian market.
+- **Provide Details on App Development or Product Progress**: If your business involves app development or a specific product, outline the development roadmap, including what percentage of the project is complete, along with the timeline and budget for completion. This shows commitment and progress.
+- **Document Business Advancements**: Discuss significant milestones or advancements your business has achieved since incorporation. This could include product launches, customer growth, or strategic partnerships.
+- **Explain Your Choice of Canada**: Articulate why Canada is the ideal location for your business, considering its ecosystem, market potential, or regulatory environment. If you considered other countries, explain why Canada was the preferred choice.
+- **Demonstrate Operational Plans in Canada**: Clarify how critical operations of your business will be conducted within Canada, emphasizing job creation, use of Canadian resources, or contributions to the Canadian economy.
+
+In summary, while the process is structured and transparent, its complexity and the need for a viable, innovative business idea mean that success in the SUV program requires significant effort, preparation, and, sometimes, patience. Inner panel End Inner panel Start #### How do you get a letter of support from a designated organization?
+
+To get a letter from a Designated Organization in Canada for your Start-Up visa, expect to go through the following process: - **Step 1: Develop a Solid Business Idea/Concept**: Your first step is to have a clear, innovative, and viable business idea that has the potential to compete in the global market and create jobs in Canada.
+- **Step 2: Research Designated Organizations**: Look into each designated organization to understand their preferences, investment focus, and what they look for in a start-up. This information is usually available on their websites.
+- **Step 3: Prepare Your Pitch**: Tailor your business plan and pitch to align with the interests and goals of the designated organization you are targeting. Be ready to clearly articulate your business idea, market potential, competitive advantage, and how it benefits the Canadian economy.
+- **Step 4: Contact Designated Organizations**: Reach out to the designated organizations you’ve identified as a good fit for your start-up. This can often be done through their website, via email, or at pitch events specifically designed for entrepreneurs to meet potential investors.
+- **Step 5: Pitch Your Business**: You may be invited to present your business idea to the designated organization. This could involve meetings, presentations, and extensive discussions about your business model, team, and financial projections.
+- **Step 6: Due Diligence Process**: If a designated organization is interested in your proposal, they will conduct a due diligence review of your business plan, background, and proposals. This is to assess the viability and potential of your start-up.
+- **Step 7: Receive a Letter of Support**: If the designated organization decides to support your start-up, they will issue a letter of support. This letter is a key document you need to include in your SUV application, as it indicates that a reputable Canadian business entity endorses your venture.
+
+Remember, each designated organization has its own criteria and process for evaluating start-ups. It’s important to be thorough in your preparation and professional in your interactions. Securing a letter of support is a competitive process, and success depends on the strength of your business idea and your ability to convince the organization of its potential. Inner panel End Inner panel Start #### What is the letter of support for a Startup visa in Canada?
+
+A letter of support is a crucial document for the Startup Visa (SUV) program in Canada. It is issued by a designated organization (venture capital fund, angel investor group, or business incubator) that has agreed to support your start-up or business idea. This letter indicates that the designated organization is committed to your business project and believes in its potential for success.
+
+To obtain a letter of support, you must pitch your business idea to one or more of these designated organizations and convince them of the viability and potential of your business. If they decide to support your start-up, they will provide you with a letter of support, which you must include in your application for the Startup Visa program. Inner panel End Inner panel Start #### If I get a letter of support from the DOs and meet the language and financial requirements of the program, does it mean that my application for PR will be approved?
+
+While obtaining a letter of support from a designated organization and meeting the language and financial requirements are significant steps toward applying for permanent residency (PR) under the Startup Visa program, they do not guarantee approval. The final decision on PR applications involves a comprehensive assessment, including security, criminality, and health checks. Each application is evaluated on its merits, and meeting the initial requirements does not automatically ensure approval. The IRCC conducts a thorough review to ensure that all criteria are met and that the applicant does not pose a risk to Canadian society. Inner panel End Inner panel Start #### What are the top reasons for SUV refusal?
+
+The top reasons for Startup Visa (SUV) refusal often include: - **Insufficient Documentation:**Failing to provide all required documents or providing incomplete or unclear documentation.
+- **Business Viability:**Doubts about the business plan's viability or the business's potential to create jobs in Canada or contribute to the Canadian economy.
+- **Language Proficiency:**Not meeting the minimum language requirements in English or French.
+- **Financial Insufficiency:**Lack of sufficient funds to support the applicant and their family members during their initial time in Canada.
+- **Due Diligence Concerns:**Issues raised during the due diligence process by the designated organization or IRCC, including concerns about the business or the applicant's background.
+
+Inner panel End Inner panel Start #### My SUV work permit was refused. What do I do now?
+
+If your SUV work permit was refused, you have a few options: - **Review the Refusal Letter:**Understand the reasons for refusal. The letter from IRCC will detail why your application was denied.
+- **Address the Issues:**If the refusal is due to missing or insufficient documentation or if there were misunderstandings about your application, gather the necessary information or clarifications needed to address these issues.
+- **Reapply:**Once you have addressed the reasons for refusal, you can submit a new application, ensuring to include any additional information or documentation that supports your case.
+- **Legal Advice:**Consider consulting with an immigration lawyer who specializes in business immigration to review your case and provide advice on the best course of action. They can help you understand the refusal reasons and guide you in strengthening your reapplication.
+
+Inner panel End Inner panel Start #### Can I get a Canadian Startup visa by investing my money rather than getting approved and funded by any designated entity?
+
+The Canadian Startup Visa program is specifically designed to attract innovative entrepreneurs who have the support of a designated Canadian organization (venture capital fund, angel investor group, or business incubator).
+
+The program does not have a pathway that allows for obtaining a visa solely through personal investment without the involvement of a designated organization. The key component of the SUV program is the support of these organizations, which is demonstrated through the letter of support.
+
+If you are interested in immigrating to Canada based on investment without going through the Startup Visa program, you might want to explore other business immigration streams that are more focused on personal investment, such as the Provincial Nominee Programs (PNPs) that have business immigration categories. Inner panel End Inner panel Start #### I am a high-net-worth individual, and I want to get permanent residence in Canada by investing in a start-up project. Is it possible?
+
+Yes, it is feasible to secure permanent residence in Canada through investment in a startup, but there are important considerations. Canada's business immigration programs mandate active involvement in the business. Simply providing capital is not sufficient; you must actively engage in the startup’s development, applying your expertise and resources to advance the business. The criteria include contributing to Canada’s economy, generating employment, and leading an innovative venture. The sincerity of your commitment to manage and grow your business is crucial and will be scrutinized by immigration officials. Inner panel End Inner panel Start #### Can I apply for a Startup Visa if I want to open a traditional business like a coffee shop without an innovative idea?
+
+To qualify for the Startup Visa program with a conventional business like a coffee shop, you need to bring a fresh approach to the table. Think about ways to make your coffee shop stand out in terms of efficiency, customer experience, and growth potential.
+
+Consider this: innovation isn't just about new ideas; it’s about improving how things are done. Take inspiration from stories like "The Founder," which showcases how McDonald's revolutionized fast food by reimagining service speed. Apply this thinking to your business—improve the design, adopt new technologies, or create a unique product.
+
+What matters is doing things differently and better. If you’re ready to think creatively about your coffee shop, we’re here to help. Inner panel End Inner panel Start #### Which program should I choose to start a business in Canada: the Start-up Visa or the C11 Work Permit Program?
+
+Choosing between the Start-up Visa and the C11 Work Permit depends on your business goals and how quickly you want to move to Canada.
+
+The Start-up Visa is for launching innovative businesses and is best for those who can handle high risk, including possible investment losses. If you're not in a hurry for permanent residence and have moderate language skills, this could be for you. Keep in mind, permanent residence might take around 3 years to obtain.
+
+On the other hand, the C11 Work Permit is for those starting or buying a traditional business and is generally a lower-risk option. If you're looking for a quicker path to permanent residence, usually within 18-24 months, consider this program.
+
+Both require you to actively manage your business and involve significant investment. Approval rates are similar for both programs.
+
+Interested in more details? **Schedule a consultation**through the link provided. Inner panel End Inner panel Start #### What is the rejection rate for the SUV program and what are common reasons for rejection?
+
+The rejection rate for the Start-Up Visa (SUV) program and common reasons for rejection can vary, but key factors include the business's viability, the innovativeness of the proposal, and the applicant's ability to carry out the business plan. Common reasons for rejection may include insufficient evidence of a scalable business model, lack of a clear competitive advantage, or inadequate support from a designated Canadian organization, such as a venture capital fund, angel investor group, or business incubator. To improve the chances of approval, applicants should focus on thoroughly demonstrating the uniqueness and market potential of their business idea, as well as their capacity for successful implementation. Inner panel End Inner panel Start #### If I lack business ownership experience, are business immigration pathways still open to me?
+
+If you lack business ownership experience, business immigration pathways can still be open to you, provided you can demonstrate the necessary skills, knowledge, and a viable business plan to succeed in your proposed venture. Certain programs may place a greater emphasis on the business plan and potential economic contribution rather than strictly on past business ownership experience. For example, the Start-Up Visa program might be a suitable pathway if you have an innovative business idea and can secure support from a designated Canadian organization. Engaging with mentors, industry experts, and potential partners can also help compensate for a lack of direct ownership experience. Inner panel End ### Make Your First Step Towards Canada
+
+- Name *
+- Email *
+- Phone *
+- How did you hear about us? * How did you hear about us? Google Search Facebook YouTube LinkedIn Online Article Email Newsletter Friend's Referral Event Another Website Other
+- Your Citizenship * Your Citizenship Afghanistan Albania Algeria American Samoa Andorra Angola Anguilla Antarctica Antigua and Barbuda Argentina Armenia Aruba Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bermuda Bhutan Bolivia Bonaire, Sint Eustatius and Saba Bosnia and Herzegovina Botswana Bouvet Island Brazil British Indian Ocean Territory Brunei Darussalam Bulgaria Burkina Faso Burundi Cambodia Cameroon Canada Cape Verde Cayman Islands Central African Republic Chad Chile China Christmas Island Cocos Islands Colombia Comoros Congo, Democratic Republic of the Congo, Republic of the Cook Islands Costa Rica Croatia Cuba Curaçao Cyprus Czech Republic Côte d'Ivoire Denmark Djibouti Dominica Dominican Republic Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Eswatini (Swaziland) Ethiopia Falkland Islands Faroe Islands Fiji Finland France French Guiana French Polynesia French Southern Territories Gabon Gambia Georgia Germany Ghana Gibraltar Greece Greenland Grenada Guadeloupe Guam Guatemala Guernsey Guinea Guinea-Bissau Guyana Haiti Heard and McDonald Islands Holy See Honduras Hong Kong Hungary Iceland India Indonesia Iran, Islamic Republic of Iraq Ireland Isle of Man Israel Italy Jamaica Japan Jersey Jordan Kazakhstan Kenya Kiribati Kuwait Kyrgyzstan Lao People's Democratic Republic Latvia Lebanon Lesotho Liberia Libya Liechtenstein Lithuania Luxembourg Macau Macedonia Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands Martinique Mauritania Mauritius Mayotte Mexico Micronesia Moldova Monaco Mongolia Montenegro Montserrat Morocco Mozambique Myanmar Namibia Nauru Nepal Netherlands New Caledonia New Zealand Nicaragua Niger Nigeria Niue Norfolk Island North Korea Northern Mariana Islands Norway Oman Pakistan Palau Palestine, State of Panama Papua New Guinea Paraguay Peru Philippines Pitcairn Poland Portugal Puerto Rico Qatar Romania Russia Rwanda Réunion Saint Barthélemy Saint Helena Saint Kitts and Nevis Saint Lucia Saint Martin Saint Pierre and Miquelon Saint Vincent and the Grenadines Samoa San Marino Sao Tome and Principe Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Sint Maarten Slovakia Slovenia Solomon Islands Somalia South Africa South Georgia South Korea South Sudan Spain Sri Lanka Sudan Suriname Svalbard and Jan Mayen Islands Sweden Switzerland Syria Taiwan Tajikistan Tanzania, United Republic of Thailand Timor-Leste Togo Tokelau Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan Turks and Caicos Islands Tuvalu US Minor Outlying Islands Uganda Ukraine United Arab Emirates United Kingdom United States Uruguay Uzbekistan Vanuatu Venezuela Viet Nam Virgin Islands, British Virgin Islands, U.S. Wallis and Futuna Western Sahara Yemen Zambia Zimbabwe Åland Islands
+- Please identify which of the following best describes you? * Service you need I want to move my company to Canada I want to buy a business in Canada I want to start my own company in Canada I want to apply for Start-up Visa We are a tech company and need guidance We want to move our team to Canada I want to hire foreign workers I want to work in Canada None of the above
+- Please describe your situation below. *
+-
+- CAPTCHA
+-
+- Name This field is for validation purposes and should be left unchanged.
+
+Submit Δ
+
+#### WE ARE MEMBERS OF
+
+form ### Bringing You, Your Talent &
+Your Business To Canada
+
+Get started and make your first step towards Canada. Book your 1-hour strategy meeting with a licensed Canadian immigration lawyer.
+
+Immigration to Canada can be very complicated for businesses, business owners, and foreign employees. Hiring business immigration lawyers with the skill, experience, and patience is often crucial to successfully navigating this complex process. The experienced professionals at Sobirovs Law Firm offer tailored legal services in all business and corporate immigration matters. Contact us for more information on how we can help you meet your immigration needs.
+
+We have worked with & represented clients from all walks of life. Always just one call – or click – away, weʼre happy to help you begin your & your familyʼs journey to Canada.
+
+Talk to a Lawyer End form Slider ### Our Clients Say…
+
+```
+
+```
+
+see all reviews End SLider Insight ### Our Lastest Insights
+
+We publish helpful tips about Canadian immigration programs and are happy to share our knowledge with you. January 10, 2025 - Helpful Tips
+
+#### Emerging Opportunities for Entrepreneurs in Canada in 2025
+
+Canada continues to establish itself as a global leader in fostering innovation and entrepreneurship. With its stable economy, forward-thinking policies, and a strong commitment to... Read More December 19, 2024 - Immigration News
+
+#### New Changes Explained: Express Entry and LMIA-based job offer points
+
+On December 17, 2024 Immigration Minister Marc Miller announced that additional Comprehensive Ranking System (CRS) points for LMIA-based job offers will soon be eliminated.... Read More December 18, 2024 - Other News
+
+#### A Year of Transformation: The Top Canadian Immigration Changes of 2024
+
+[embed]https://www.youtube.com/live/wDNOVMk9UZs?si=ovDiW7sVJ99WKJ8m[/embed] 2024 has brought significant and transformative changes to Canada’s immigration policies. From managing international student intake to introducing stricter measures for work... Read More December 10, 2024 - Helpful Tips
+
+#### Canada’s Express Entry System Changes: Shifting Priorities to Retain In-Canada Talent
+
+Canada's Express Entry system, a cornerstone of the country's immigration policy, has been undergoing a series of adjustments in 2024 to maximize invitations to apply... Read More December 2, 2024 - Success Story
+
+#### Software Engineer Immigration to Canada – Alex’s Success Story
+
+When transforming a vision into reality, Alex's story (not his real name) is an inspiring testament to determination, innovation, and strategic planning. A seasoned software... Read More November 25, 2024 - Helpful Tips
+
+#### Visitor Visa Changes Canada: What You Need to Know
+
+Many visitors planning to explore Canada are impacted by the recent changes to visitor visa Canada policies. These changes aim to address challenges such as... Read More End Insight Subscribe Sign Up To Be
+
+### The First in Canadian Business Immigration News
+
+Email Get Our Weekly Newsletter Comments This field is for validation purposes and should be left unchanged. Δ
+
+End Subscribe BEGIN of footer Monday / Friday 8:00-5:00
+
++1 416 895 3026
+
+wecare@sobirovs.com
+
+333 Bering Ave, Unit 800, Toronto, Ontario, M8Z 3A8, Canada
+
+Terms of Use | Privacy Policy | Disclaimer
+
+- Contact Us
+- Fee Calculator
+- Talk to a Lawyer
+
+#### Services
+
+- What We Do
+- Start-Ups
+- Business Immigration
+- Employers
+- TechImmigration
+
+#### About Us
+
+- Who We Are
+- Our Team
+- Service Standards
+- Our Results
+- Testimonials
+- News & Insights
+- Careers
+
+#### Contact Us
+
+- Contact Us
+- Talk to a Lawyer
+- Fee Calculator
+
+@ 2025 All rights reserved by Sobirovs Law Firm. Copying or repurposing content from this website is strictly forbidden.
+
+#### Connect with us via these apps
+
+-
+-
+-
+-
+-
+
+END of footer Google Tag Manager (noscript) End Google Tag Manager (noscript) Rocket no webp This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me
+
+Document 4:
+html Settle in Canada with Your Family | Canada’s Start-Up Visa - 7670 800 000
+- +91 880 221 9999
+- ###### Y-Jobs
+
+###### Y-Opp
+
+###### Y-Store
+
+
+- Signup
+- Login
+- Contact Us
+
+- Free Assessment
+- Migrate
+- Work
+- Study
+- Visa
+- Coaching
+- Admissions
+- H1B Jobs
+- Jobs Abroad
+-
+
+1. Home
+
+###
+
+I am looking for visa Visa for Canada ; Connect me at IND +91 Use this as Whatsapp number and email. I accept the Terms & Conditions
+
+Submit ###### Don't know what to do ?
+
+Get Free Counseling
+
+# Settle in Canada with Your Family
+
+Canada’s Start Up Visa Program, also commonly referred to as the SUV program of Canada, is a Canada immigration pathway for qualified entrepreneurs.
+
+Linking innovative entrepreneurs with private sector investors in Canada, the SUV program specifically targets immigrants that have the potential of successfully establishing their business in Canada.
+
+Initially coming to the country on a Canada work permit – supported by their designated Canadian investor – such candidates will be qualifying for acquiring Canada PR once their business in Canada is fully operational.
+
+During the processing of their Canadian permanent residence application, the SUV candidate will be able to apply for a temporary work permit for entering Canada and begin building-up their business in the country.
+
+## Am I Eligible?
+
+To be able to immigrate to Canada through the Start Up Visa program, a candidate will be required to fulfil 4 eligibility requirements.
+
+These are – having a qualifying business, meeting the specific language requirements for the SUV program, securing a Letter of Support from any of the designated organizations, and possessing sufficient funds for settling in Canada with family.
+
+By a “qualifying business” is implied a business that fulfils certain specific requirements laid down by Immigration, Refugees and Citizenship Canada [IRCC].
+
+Do note that at the time of receiving their permanent resident visa for Canada, the individual must be providing “active and ongoing” management of that particular business from within Canada. Additionally, an essential part of the business operations must be conducted within Canada.
+
+For the language requirements, the individual will be required to have secured at least a Canadian Language Benchmark [CLB] Level 5, in either English or French, in each of the 4 abilities assessed [speaking, reading, listening, writing].
+
+Language tests accepted by IRCC-
+
+| Language | IRCC designated tests | Level required for SUV program |
+| --- | --- | --- |
+| For English | International English Language Testing System [IELTS]
+Canadian English language Proficiency Index Program [CELPIP] | CLB 5 |
+| For French | Test de connaissance du français [TCF Canada]
+Test d’évaluation de français [TEF Canada] | CLB 5 |
+
+Now, for acquiring a Letter of Support as part of the SUV program eligibility process, an individual will have to get any of the IRCC designated organizations to support their business idea.
+
+A Letter of Support will be issued by the organization supporting the individual for the SUV program.
+
+A designated organization for the Start Up Visa program for Canada can be either a business incubator, an angel investor group, or a venture capital fund.
+
+The support of 1 or more designated organizations can be taken.
+
+The process of pitching a business idea differs from organization to organization. The specific designated organization must be contacted directly for finding out the way to getting its support for the SUV program.
+
+The Letter of Support will have to be included at the time of application submission to IRCC.
+
+Lastly, proof of funds – for supporting yourself as well as your dependents after arriving in Canada – will be needed. The amount required will be as per the total number of members planning to relocate to Canada along with the principal applicant.
+
+## Processing Time
+
+Generally, if an entrepreneur has a viable start up business plan, the processing timeline is as follows –
+
+- 4 to 6 months for securing a Letter of Support, and
+- 18 months for finalizing the visa application.
+
+### Quick Facts
+
+- Access to seed funding of up to CAD 200,000.
+- Canada PR under this program can be obtained by up to 5 co-founders and their family members. A collective application will have to be filed by them.
+- Pathway to Canadian citizenship.
+- Reside and work in the U.S. The holder of a Canadian passport has many options available before them for living and working in the U.S.
+- No obligation to stay within a specific province in Canada.
+- The investor, as well as their family members, have the freedom to move freely anywhere in Canada.
+- Gain unconditional Canada PR. Permanent residence acquired through this pathway will not be subject to any attached condition as to the success of the start-up program in Canada.
+- 12 to 18 months to get your Canada PR visa.
+- Eligible for an interim **Canada work**permit while the PR application is under processing.
+- No age limit for being eligible.
+
+#### How Y-Axis Can Help You?
+
+- Qualified advice
+- Advise on investments
+- Dedicated support
+
+### Sign up for a free expert consultation
+
+I am looking for visa Visa for Canada ; Connect me at IND +91 Use this as Whatsapp number and email. I accept the Terms & Conditions
+
+Submit ###### Don't know what to do ?
+
+Get Free Counseling
+
+### Frequently Asked Questions
+
+
+
+###### If I get my Canada PR through the Canada Start Up Visa program, what happens if my business fails?
+
+###### Do I have to invest my own money for applying for the Start Up Visa Program of Canada?
+
+###### What is the minimum investment required for applying through Canada’s SUV program?
+
+###### Who will review my SUV program application?
+
+##### ABOUT US
+
+About Y Axis Careers CSR Office Network Press and News ##### TESTIMONIALS
+
+Success Videos Customer Reviews Social Reviews Visa Success ##### BLOGS
+
+Immigration News Immigration Blog Overseas Jobs Newsletter Visa Stories ##### Indian Languages
+
+Hindi Tamil Gujarati Telugu Marathi Kannada ##### Foreign Languages
+
+Arabic French Chinese German Korean Ukranian Italian ##### CONTACT US
+
+INDIA
+
++91 7670800001 info@y-axis.com www.y-axis.com ##### CONTACT US
+
+AUSTRALIA
+
++ 61 399394818 australia@y-axis.com.au www.y-axis.com.au ##### CONTACT US
+
+UAE
+
++971 (0)42483900 dubai@y-axis.com www.y-axis.ae ##### CONTACT US
+
+UK
+
++44 1253226009 info@y-axis.co.uk www.y-axis.co.uk ##### CONTACT US
+
+Canada
+
++1 226 243 2213 info@y-axis.ca www.y-axis.ca ##### FOLLOW US
+
+##### SUBSCRIBE NEWSLETTER
+
+Submit Visit Visas : Australia | Austria | Bangladesh | Belgium | Brazil | Canada | China | Columbia | Cyprus | Czech Republic | Denmark | Dubai | Egypt | Estonia | Finland | France | Georgia | Germany | Greece | Hong Kong | Hungary | Iceland | Indonesia | Ireland | Italy | Japan | Latvia | Liechtenstein | Lithuania | Luxembourg | Malaysia | Malta | Morocco | Netherlands | Nigeria | Norway | Peru | Philippines | Poland | Portugal | Russia | Schengen | Singapore | Slovakia | Slovenia | South Africa | South Korea | Spain | Sri Lanka | Switzerland | Sweden | Taiwan | Thailand | Turkey | Ukraine | UK | USA | Vietnam Dependant Visas : Australia | Australia Parent Migration | Belgium | Canada | Canada Parent Migration | Germany | UK | USA Business Visas : Australia | Austria | Belgium | Canada | Czech Republic | Denmark | Finland | Germany | Greece | Hungary | Ireland | Italy | Netherlands | Norway | Nova Scotia | Poland | Portugal | Spain | Sweden | Switzerland | UK | USA Migrate : Australia | Austria | Canada | Denmark | Germany | Hongkong | Portugal | Quebec | Singapore | UAE | UK | Ukraine | USA Work : Australia | Austria | Belgium | Canada | Denmark | Dubai | Finland | France | Germany | Germany Trade Fair and Exhibitions Visa | Germany EU Blue Card | Hong Kong QMAS | Ireland | Italy | Japan | Luxembourg | Malta | Malaysia | Netherlands | New Zealand | Norway | Portugal | Singapore | South Korea | South Africa Critical Skills | Spain | Switzerland | Sweden | Sweden EU Blue Card | UK | USA Digital Nomad : Argentina | Abu Dhabi | Canada | Costa Rica | Estonia | Hungary | Iceland | Indonesia | Italy | Japan | Malaysia | Malta | Mexico | Norway | Portugal | Seychelles | South Korea | Spain | Thailand Job Seeker Visas : Austria | Germany | Norway | Portugal | Sweden | UAE | Germany EU Blue Card | UAE Green Visa Jobs in Demand : Australia | Austria | Belgium | Canada | Denmark | Dubai | Estonia | Europe | Finland | France | Germany | Ireland | Italy | Luxembourg | Japan | Malaysia | Malta | Netherlands | New Zealand | Norway | Portugal | Singapore | South Africa | South Korea | Sweden | Switzerland | UAE | UK | USA Study : Australia | Canada | Denmark | Dubai | Europe | Finland | France | Germany | German Language Short Course Visa | Germany Recognition of Professional Qualification Visa | Ireland | Italy | Japan | Korea | Luxembourg | Newzealand | Norway | Poland | Singapore | Spain | Sweden | Switzerland | UK | USA | Career Ready | F1 Student Visa | Education Loan | SOP | LOR | Admission | Course | Document | Y-Path Invest : Australia | British Columbia | Canada | Denmark | Estonia | Germany | Ireland | Malta | Manitoba | UK | Australia Business Innovation Stream | Canada Intra Company Transfer | Canada Startup | Canada Ontario Entrepreneur Stream | UK Innovator Visa | UK - Expansion Work Visa Coaching : IELTS | IELTS-SPRINT | PTE | PTE-Core | GMAT | GRE | TOEFL | CELPIP | SAT | OET | German Language | Demo Videos | Free Demo Classes Concierge : University | Attestation | Banking | Forex Assistance | Travel Insurance | International Remittance | International SIM Card | IELTS Slot Booking | CELPIP Slot Booking | TOEFL Slot Booking | GRE Slot Booking Professionals : Engineering | IT | Marketing & Sales | HR | Healthcare | Teachers | Accountants | Hospitality | Nursing Jobs Outlook : Australia | Austria | Canada | Denmark | Estonia | Finland | France | Germany | Italy | Ireland | Japan | Luxembourg | Malta | Norway | Poland | Portugal | Singapore | Sweden | UAE | UK | USA Eligibility Points Calculator : Australia | Canada | Germany | UK Job Search Services : Anzsco | Resume Writing | LinkedIn Marketing | Roles and Responsibilities | Salaries Abroad | Job Outlook News : Australia Immigrations News | Canada Immigration News | Schengen News | US Immigration News | UK Immigration News Visa Resources : Australia | Canada | Germany Provincial Nominee Program : British Columbia | Manitoba | Prince Edward Island | Ontario | Saskatchewan | Alberta | Canada Newbrunswick | Novascotia | Newfoundland and Labrador | Northwest Territories | Yukon | Saskatchewan PNP Excluded Occupations PR Visa : Australia | Canada | Canada FSWP | Canada Express Entry | USA Form i-130 Flipbooks : USA H1b | Migrate to Australia | Migrate to Canada | Migrate to Germany | Migrate to UK | Coaching | IELTS Coaching | PTE Coaching | GRE Coaching | CELPIP Coaching | TOEFL Coaching Branch Locations : Hyderabad | Hyderabad - Hi-Tech City | Hyderabad - Banjara Hills | Hyderabad - ANR Center | Hyderabad - Jubilee Hills | Hyderabad - Jubilee Hills 2 | Hyderabad - Somajiguda | Hyderabad - Kukatpally | Secunderabad | Chennai | Chennai - Tenyampet | Coimbatore | Delhi | Ahmedabad | Paldi | Bangalore | Bangalore - Koramangala | Bangalore - Hebbal | Bangalore - Whitefield | Bangalore - MG Road | Kolkata | Kolkata - Camac Street | Gurgaon | Noida | Delhi - Connaught Place | Delhi - Nehru Place | Pune | Pune - Bund Garden | Pune - Baner | Mumbai - Vashi | Mumbai - Bandra | Mumbai - Thane | Mumbai - Goregaon | Mumbai - Andheri | Dubai | UAE - Sharjah | Dubai - JLT | Dubai - JLT Cluster D | Dubai - JLT Cluster E | Dubai - JLT Cluster H | Australia - Melbourne | Australia - Sydney | Canada - Toronto Other Languages : Arabic | Chinese | Czech | Croatian | Danish | Dutch | Finnish | French | German | Italian | Japanese | Korean | Polish | Norwegian | Portuguese | Russian | Romanian | Spanish | Swedish | Thai | Turkish | Ukrainian | Bengali | Gujarati | Hindi | Kannada | Malayalam | Marathi | Nepali | Punjabi | Tamil | Telugu - Refund Policy
+- Terms & condition
+- Anti Fraud Policy
+- Privacy Policy
+- Sitemap
+
+© 2025 Y-Axis, All rights reserved
+
+##### ABOUT US
+
+##### TESTIMONIALS
+
+##### BLOGS
+
+##### Indian Languages
+
+##### Foreign Languages
+
+##### CONTACT US
+
+##### FOLLOW US
+
+##### SUBSCRIBE NEWSLETTER
+
+Submit Refund Policy | Terms & condition | Anti Fraud Policy | Privacy Policy | Sitemap © 2025 Y-Axis, All rights reserved Visit Visas : Australia | Austria | Bangladesh | Belgium | Brazil | Canada | China | Columbia | Cyprus | Czech Republic | Denmark | Dubai | Egypt | Estonia | Finland | France | Georgia | Germany | Greece | Hong Kong | Hungary | Iceland | Indonesia | Ireland | Italy | Japan | Latvia | Liechtenstein | Lithuania | Luxembourg | Malaysia | Malta | Morocco | Netherlands | Nigeria | Norway | Peru | Philippines | Poland | Portugal | Russia | Schengen | Singapore | Slovakia | Slovenia | South Africa | South Korea | Spain | Sri Lanka | Switzerland | Sweden | Taiwan | Thailand | Turkey | Ukraine | UK | USA | Vietnam Dependant Visas : Australia | Australia Parent Migration | Belgium | Canada | Canada Parent Migration | Germany | UK | USA Business Visas : Australia | Austria | Belgium | Canada | Czech Republic | Denmark | Finland | Germany | Greece | Hungary | Ireland | Italy | Netherlands | Norway | Nova Scotia | Poland | Portugal | Spain | Sweden | Switzerland | UK | USA Migrate : Australia | Austria | Canada | Denmark | Germany | Hongkong | Portugal | Quebec | Singapore | UAE | UK | Ukraine | USA Work : Australia | Austria | Belgium | Canada | Denmark | Dubai | Finland | France | Germany | Germany Trade Fair and Exhibitions Visa | Germany EU Blue Card | Hong Kong QMAS | Ireland | Italy | Japan | Luxembourg | Malta | Malaysia | Netherlands | New Zealand | Norway | Portugal | Singapore | South Korea | South Africa Critical Skills | Spain | Switzerland | Sweden | Sweden EU Blue Card | UK | USA Digital Nomad : Argentina | Abu Dhabi | Canada | Costa Rica | Estonia | Hungary | Iceland | Indonesia | Italy | Japan | Malaysia | Malta | Mexico | Norway | Portugal | Seychelles | South Korea | Spain | Thailand Job Seeker Visas : Austria | Germany | Norway | Portugal | Sweden | UAE | Germany EU Blue Card | UAE Green Visa Jobs in Demand : Australia | Austria | Belgium | Canada | Denmark | Dubai | Estonia | Europe | Finland | France | Germany | Ireland | Italy | Luxembourg | Japan | Malaysia | Malta | Netherlands | New Zealand | Norway | Portugal | Singapore | South Africa | South Korea | Sweden | Switzerland | UAE | UK | USA Study : Australia | Canada | Denmark | Dubai | Europe | Finland | France | Germany | German Language Short Course Visa | Germany Recognition of Professional Qualification Visa | Ireland | Italy | Japan | Korea | Luxembourg | Newzealand | Norway | Poland | Singapore | Spain | Sweden | Switzerland | UK | USA | Career Ready | F1 Student Visa | Education Loan | SOP | LOR | Admission | Course | Document | Y-Path Invest : Australia | British Columbia | Canada | Denmark | Estonia | Germany | Ireland | Malta | Manitoba | UK | Australia Business Innovation Stream | Canada Intra Company Transfer | Canada Startup | Canada Ontario Entrepreneur Stream | UK Innovator Visa | UK - Expansion Work Visa Coaching : IELTS | IELTS-SPRINT | PTE | PTE-Core | GMAT | GRE | TOEFL | CELPIP | SAT | OET | German Language | Demo Videos | Free Demo Classes Concierge : University | Attestation | Banking | Forex Assistance | Travel Insurance | International Remittance | International SIM Card | IELTS Slot Booking | CELPIP Slot Booking | TOEFL Slot Booking | GRE Slot Booking Professionals : Engineering | IT | Marketing & Sales | HR | Healthcare | Teachers | Accountants | Hospitality | Nursing Jobs Outlook : Australia | Austria | Canada | Denmark | Estonia | Finland | France | Germany | Italy | Ireland | Japan | Luxembourg | Malta | Norway | Poland | Portugal | Singapore | Sweden | UAE | UK | USA Eligibility Points Calculator : Australia | Canada | Germany | UK Job Search Services : Anzsco | Resume Writing | LinkedIn Marketing | Roles and Responsibilities | Salaries Abroad | Job Outlook News : Australia Immigrations News | Canada Immigration News | Schengen News | US Immigration News | UK Immigration News Visa Resources : Australia | Canada | Germany Provincial Nominee Program : British Columbia | Manitoba | Prince Edward Island | Ontario | Saskatchewan | Alberta | Canada Newbrunswick | Novascotia | Newfoundland and Labrador | Northwest Territories | Yukon | Saskatchewan PNP Excluded Occupations PR Visa : Australia | Canada | Canada FSWP | Canada Express Entry | USA Form i-130 Flipbooks : USA H1b | Migrate to Australia | Migrate to Canada | Migrate to Germany | Migrate to UK | Coaching | IELTS Coaching | PTE Coaching | GRE Coaching | CELPIP Coaching | TOEFL Coaching Branch Locations : Hyderabad | Hyderabad - Hi-Tech City | Hyderabad - Banjara Hills | Hyderabad - ANR Center | Hyderabad - Jubilee Hills | Hyderabad - Jubilee Hills 2 | Hyderabad - Somajiguda | Hyderabad - Kukatpally | Secunderabad | Chennai | Chennai - Tenyampet | Coimbatore | Delhi | Ahmedabad | Paldi | Bangalore | Bangalore - Koramangala | Bangalore - Hebbal | Bangalore - Whitefield | Bangalore - MG Road | Kolkata | Kolkata - Camac Street | Gurgaon | Noida | Delhi - Connaught Place | Delhi - Nehru Place | Pune | Pune - Bund Garden | Pune - Baner | Mumbai - Vashi | Mumbai - Bandra | Mumbai - Thane | Mumbai - Goregaon | Mumbai - Andheri | Dubai | UAE - Sharjah | Dubai - JLT | Dubai - JLT Cluster D | Dubai - JLT Cluster E | Dubai - JLT Cluster H | Australia - Melbourne | Australia - Sydney | Canada - Toronto Other Languages : Arabic | Chinese | Czech | Croatian | Danish | Dutch | Finnish | French | German | Italian | Japanese | Korean | Polish | Norwegian | Portuguese | Russian | Romanian | Spanish | Swedish | Thai | Turkish | Ukrainian | Bengali | Gujarati | Hindi | Kannada | Malayalam | Marathi | Nepali | Punjabi | Tamil | Telugu - Refund Policy
+- Terms & condition
+- Anti Fraud Policy
+- Privacy Policy
+- Sitemap
+
+© 2025 Y-Axis, All rights reserved
+
+Document 5:
+html [if lte IE 9]> End cookieyes banner Start-Up Visa Canada - Canadim Google Tag Manager for WordPress by gtm4wp.com End Google Tag Manager for WordPress by gtm4wp.com This site is optimized with the Yoast SEO Premium plugin v22.7 (Yoast SEO v24.1) - https://yoast.com/wordpress/plugins/seo/ / Yoast SEO Premium plugin. Google Tag Manager for WordPress by gtm4wp.com GTM Container placement set to automatic End Google Tag Manager for WordPress by gtm4wp.com If no sidebar menu, add class "wide" to o-page and c-header - - English
+
+
+
+- About us
+- Contact us
+- Free Phone Consultation +1 (514) 989-9700
+
+- Immigrate ### Immigrate
+
+ - Immigrate to Canada
+ - Express Entry - Comprehensive Ranking System - CRS Score Calculator
+
+
+ - Express Entry Pool of Candidates
+ - Canadian Experience Class
+ - Federal Skilled Worker (FSW) Program
+ - Federal Skilled Trades
+ - Express Entry Draw
+ - When is the Next Express Entry Draw?
+ - Invitation to Apply (ITA)
+ - Electronic Application for Permanent Residence (eAPR)
+ - Proof of Funds for Express Entry
+
+
+ - Canada Provincial Nominee Programs (PNPs) - Latest PNP Draws in Canada
+ - Alberta – Provincial Nominee Programs - Farm Stream
+ - Alberta Express Entry
+ - Alberta Accelerated Tech Pathway
+ - Alberta Opportunity Stream
+ - Graduate Entrepreneur Stream
+ - Foreign Graduate Entrepreneur Stream
+
+
+ - British Columbia – Provincial Nominee Programs - Skills Immigration Stream
+ - BC PNP Tech
+ - Entrepreneur Immigration Stream
+
+
+ - Manitoba - Farm Investor Pathway
+ - Skilled Workers in Manitoba
+ - Skilled Workers Overseas
+ - International Education Stream
+ - Business Investor Stream
+
+
+ - New Brunswick - Express Entry Labour Market Stream
+ - Entrepreneurial Stream
+ - Post-Graduate Entrepreneurial Stream
+ - Skilled Worker Applicants with Employer Support
+ - New Brunswick Critical Worker Pilot
+ - New Brunswick Strategic Initiative Stream
+ - New Brunswick PNP – Information Sessions
+
+
+ - Newfoundland and Labrador - Express Entry Skilled Worker Category
+ - Skilled Worker Category
+ - International Graduate Category
+ - International Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Priority Skills NL: In-Demand Academic Path
+ - Priority Skills NL: In-Demand Work Path
+
+
+ - Northwest Territories - Express Entry
+ - Employer Driven
+ - Critical Impact Worker
+ - Skilled Worker
+ - Business Driven
+ - Entrepreneur
+
+
+ - Nova Scotia - Nova Scotia Demand: Express Entry (Closed)
+ - Nova Scotia Experience: Express Entry
+ - Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Skilled Worker Category
+ - Physician Stream
+ - Nova Scotia Labour Market Priorities
+ - Nova Scotia Labour Market Priorities for Physicians
+ - Occupations In Demand
+
+
+ - Ontario - Ontario’s Express Entry Streams
+ - Employer Job Offer
+ - Masters Graduates
+ - PhD Graduates
+ - Entrepreneur
+ - Regional Immigration Pilot
+
+
+ - Prince Edward Island - PEI PNP Express Entry
+ - Business Impact
+ - Work Permit
+ - Labour Impact
+ - Skilled Worker in PEI
+ - Skilled Worker Outside Canada
+ - Critical Worker
+ - International Graduate
+
+
+ - Saskatchewan - International Skilled Worker
+ - Saskatchewan Experience
+ - Saskatchewan Entrepreneur and Farm
+
+
+ - Yukon - Yukon Express Entry
+ - Skilled Worker
+ - Critical Impact Worker
+ - Business Nominee
+ - Yukon Community Pilot
+
+
+
+
+ - Quebec Immigration - Immigrate to Quebec
+ - Regular Skilled Worker Program (RSWP)
+ - Quebec Experience Program (PEQ)
+ - Quebec Entrepreneur Program
+ - Quebec Self-Employed Worker Program
+ - Quebec Investor Program – QIIP
+ - Certificat de Selection du Quebec (CSQ)
+ - Quebec Immigration FAQ
+
+
+ - Canada Permanent Resident (PR) - Confirmation of Permanent Residence (COPR)
+ - Permanent Resident Card (PR card)
+ - Permanent Resident Card Renewal
+ - Permanent Resident Travel Document
+ - Residency Obligations
+
+
+ - Professional & Skilled Workers - Canadian Experience Class (CEC)
+ - Federal Skilled Worker (FSW) Program
+ - Regular Skilled Worker Program (RSWP)
+
+
+ - Atlantic Immigration Program
+ - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+ - Caregiver Program Canada - Home Child Care Provider Pilot
+ - Home Support Worker Pilot
+ - Past Caregiver Programs
+
+
+ - Canada Immigration FAQ
+ - Moving to Canada From Another Country - Moving to Canada from the USA
+
+
+
+
+- Work ### Work
+
+ - Work in Canada
+ - Work without a Work Permit - Business Visitors
+
+
+ - Temporary Foreign Worker Program - Labour Market Impact Assessment (LMIA)
+ - Facilitated LMIA (Quebec) List of Occupations
+ - Canada Global Talent Stream (GTS)
+
+
+ - International Mobility Program - Intra-Company Transfers
+ - CUSMA (formerly called NAFTA) Work Permit
+ - Working with CSQ
+ - CETA Work Permits
+ - Open Work Permits - Post-Graduate Work Permit
+ - International Experience Canada
+ - Spouse Open Work Permit (SOWP) Canada
+ - Bridging Open Work Permit (BOWP) Canada
+
+
+
+
+ - Tools & Resources - Job Search Tool
+ - Social Media Presence Guide
+ - Canadian Resume Guide
+
+
+ - For Employers
+
+
+- Study ### Study
+
+ - Study & Immigrate in Canada - Study in Canada: Changes for 2024 -2026
+ - Our International Student Program
+
+
+ - Canadian Designated Learning Institutions (DLI)
+ - Levels of Study
+ - Study Permit in Canada - Student Direct Stream (SDS) Canada
+ - Provincial Attestation Letter (PAL)
+
+
+ - Certificat d’acceptation du Quebec (CAQ)
+ - Refusals and Appeals
+ - Live as a student in Canada - International Students in Canada
+ - Extend a Study Permit
+ - International Student Health Insurance in Canada - Quebec Health Insurance Plan for International Students
+
+
+ - Student Accommodation
+ - Work While Studying
+ - International Students: Spouse and Family Dependent Visa
+
+
+ - Post-Graduate Work Permit
+ - Permanent Residence (PR) for international students
+
+
+- Sponsorship ### Sponsorship
+
+ - Canada Sponsorship
+ - Spousal Sponsorship: Sponsor your Spouse or Partner for Canadian Immigration - Inland Sponsorship
+ - Outland Sponsorship
+ - Spousal Sponsorship Quebec
+ - Spouse Open Work Permit (SOWP) Canada
+
+
+ - Child or Other Dependant Sponsorship
+ - Parents and Grandparents Sponsorship - Super Visa Canada
+
+
+ - Minimum Necessary Income (MNI) Requirements for 2024
+ - Canada Sponsorship FAQ
+
+
+- Business ### Business
+
+ - Business Immigration
+ - Investor Programs in Canada - Federal Investor Program (Terminated)
+ - Federal Venture Capital (Closed)
+ - Quebec Investor Program – QIIP
+
+
+ - Entrepreneur Programs - Federal Entrepreneur Program (Terminated)
+ - Start-Up Visa Canada
+ - Quebec Entrepreneur Program
+
+
+ - Self Employed Programs - Federal Self-Employed
+ - Quebec Self-Employed
+
+
+ - About our Business Immigration Team
+
+
+- Resources ### Resources
+
+ - Our Canadian Immigration Services
+ - Inadmissible to Canada - Criminal Inadmissibility
+ - Temporary Resident Permit (TRP)
+ - Medical Inadmissibility
+ - Legal Opinion Letters
+ - Entering Canada with a DUI
+ - Criminal Rehabilitation
+
+
+ - How to Get Canadian Citizenship - Citizenship Requirements
+ - Citizenship Application
+ - Citizenship FAQ
+
+
+ - Life in Canada - Canadian Economy
+ - Taxation in Canada
+ - Newcomers Services
+ - How to Find Accommodation in Canada
+
+
+ - Visitor Visa - Visitor Visa
+ - Super Visa Canada
+ - Business Visitor Visas
+ - electronic Travel Authorization (eTA)
+
+
+ - Canadian Immigration News & Updates
+ - Canadian Immigration Blog & Resources
+ - Tools - CRS Score Calculator
+ - CLB Language Converter
+ - Job Search
+ - Visiting Canada Tool
+
+
+ - Guides - What is a NOC Code in Canada?
+ - How to Write a Reference Letter
+ - Educational Credentials Assessment (ECA) Guide
+ - Canadian Resume Guide
+ - Canadian Cover Letter Guide
+ - Social Media Presence Guide
+ - Canadim’s Employment Services
+ - Canadian Language Benchmark Guide
+ - Canadian Immigration Glossary
+ - See all guides & FAQs
+
+
+ - Refugees & Humanitarian
+ - Canadian Immigration Processing Fees
+
+
+- Search...
+
+- - English
+
+
+
+- About us
+- Contact us
+
+-
+-
+-
+-
+-
+
+Business
+### Business
+
+- Business Immigration
+- Investor Programs in Canada - Federal Investor Program (Terminated)
+ - Federal Venture Capital (Closed)
+ - Quebec Investor Program – QIIP
+
+
+- Entrepreneur Programs - Federal Entrepreneur Program (Terminated)
+ - Start-Up Visa Canada
+ - Quebec Entrepreneur Program
+
+
+- Self Employed Programs - Federal Self-Employed
+ - Quebec Self-Employed
+
+
+- About our Business Immigration Team
+
+Back to top - Home
+- Business
+- Entrepreneur Programs
+- Start-Up Visa Canada
+
+# Start-Up Visa Canada
+
+Canada is looking for talented entrepreneurs that are interested in starting businesses that will stimulate the Canadian economy while creating employment opportunities for its residents. If you are an entrepreneur, you may be eligible to immigrate to Canada through the start-up visa program.
+
+- What is the start-up visa program?
+- What are the requirements for Canada's start-up visa?
+- Designated organizations for start-up visa
+- List of designated organizations
+- How to apply for a start-up visa
+- What is the processing time for Canada's start-up visa?
+
+Do you qualify for a start-up visa? ##
+
+Read on for everything you need to know about Canada’s start-up visa program, including a step-by-step guide to the application process and see how Canadim can help you immigrate to Canada through the start-up program.
+
+## What is the Start-Up Visa Program?
+
+Canada’s start-up visa program gives entrepreneurs the opportunity to immigrate to Canada in order to establish a new business. Immigrant entrepreneurs must demonstrate that their business is original, will create new jobs for Canadians, and can compete on a global scale.
+
+## What are the requirements for Canada's start-up visa?
+
+#### There are four requirements you need to meet in order to be eligible for a Canadian start-up visa:
+
+1. Have a qualifying business:
+
+ - You must hold at least 10% of the voting rights attached to all shares of the company
+ - Together with the designated organization, you must hold at least 50% of the voting rights attached to all shares of the company
+
+
+2. Have a letter of support from a designated organization:
+
+ - Canadim will help support you in demonstrating that you have the support of a venture capital fund, angel investor group, or business incubator
+ - In order to do this, you must pitch your business idea and convince the organization that it is worth supporting
+ - The process of pitching your business idea will be different for each organization
+ - If your pitch is successful, you will receive a letter of support from the organization which must be included in your start-up visa application
+
+
+3. Meet the language requirements:
+
+ - You must take a language test from an approved agency and show that you meet the minimum level of the Canadian Language Benchmark (CLB) 5 in either English or French in speaking, reading, listening, and writing.
+
+
+4. Proof of funds:
+
+ - Canadim can help guide you in how to show proof of funds. You will need to demonstrate that you have enough money to support yourself and any dependents once you arrive in Canada. The amount you need depends on the size of your family.
+
+
+
+##
+
+| Number of
+family members | Funds required
+(in Canadian dollars) |
+| --- | --- |
+| 1 | $12,960 |
+| 2 | $16,135 |
+| 3 | $19,836 |
+| 4 | $24,083 |
+| 5 | $27,315 |
+| 6 | $30,806 |
+| 7 | $34,299 |
+| For each additional family member | $3,492 |
+
+#tablepress-488 from cache ## Designated organizations for start-up visa
+
+As part of the eligibility requirements, you will need to provide proof (Commitment Certificate and Letter of Support) that your business is in fact supported by a designated organization. These documents will cover the relevant details of your arrangement with one or multiple designated organizations, and are paramount to your startup visa application. Unlike federal and provincial investor programs, where applicants must invest their own capital, no investment of their own funds will be required.
+
+Instead, those who meet the eligibility requirements must secure a minimum of $75,000 from a Canadian angel investor, or a minimum of $200,000 from a Canadian venture capital fund recognized by the government of Canada. If the applicant is accepted into a recognized Canadian business incubator, no investment capital is required.
+
+## List of designated organizations
+
+## Venture capital funds
+
+- 7 Gate Ventures
+- BCF Ventures
+- BDC Venture Capital
+- Celtic House Venture Partners
+- Extreme Venture Partners LLP
+- Golden Venture Partners Fund, LP
+- Impression Ventures
+- Innovation Platform Capital International LP
+- iNovia Capital Inc.
+- Lumira Ventures
+- Nova Scotia Innovation Corporation (o/a Innovacorp)
+- Pangaea Ventures Ltd.
+- PRIVEQ Capital Funds
+- Real Ventures
+- Relay Ventures
+- ScaleUp Venture Partners, Inc.
+- Top Renergy Inc.
+- Vanedge Capital Limited Partnership
+- Version One Ventures
+- Westcap Management Ltd.
+- Yaletown Venture Partners Inc.
+- York Entrepreneurship Development Institute (YEDI) VC Fund
+
+## Angel investor groups
+
+- Canadian International Angel Investors
+- Ekagrata Inc.
+- Golden Triangle Angel Network
+- Keiretsu Forum Canada
+- Oak Mason Investments Inc.
+- Southeastern Ontario Angel Network
+- TenX Angel Investors Inc.
+- VANTEC Angel Network Inc.
+- York Angel Investors Inc.
+
+## Business incubators
+
+- Alacrity Foundation
+- Alberta Agriculture and Forestry - Agrivalue Processing Business Incubator
+ - Food Processing Development Centre
+
+
+- Biomedical Commercialization Canada Inc. (operating as Manitoba Technology Accelerator)
+- Creative Destruction Lab
+- Empowered Startups Ltd.
+- Extreme Innovations
+- Genesis Centre
+- Highline BETA Inc.
+- Innovacorp
+- Interactive Niagara Media Cluster o/a Innovate Niagara
+- Invest Ottawa
+- Knowledge Park o/a Planet Hatch
+- LatAm Startups
+- Launch Academy – Vancouver
+- LaunchPad PEI Inc.
+- Millworks Centre for Entrepreneurship
+- NEXT Canada
+- North Forge Technology Exchange
+- Platform Calgary
+- Real Investment Fund III L.P. o/a FounderFuel
+- Ryerson Futures Inc.
+- Spark Commercialization and Innovation Centre
+- Spring Activator
+- The DMZ at Ryerson University
+- Toronto Business Development Centre (TBDC)
+- TSRV Canada Inc. (operating as Techstars Canada)
+- VIATEC
+- Waterloo Accelerator Centre
+- York Entrepreneurship Development Institute
+
+Free Business Immigration Assessment ## How to apply for a start-up visa
+
+1. Fill out the application form:
+
+ - Fill out the Generic Application Form for Canada
+ - Click the “Validate” button on the form, and make sure that you have completed all required fields
+ - Print the validated application form, making sure to include the barcode page
+ - Sign and date the form
+
+
+2. Complete the document checklist
+
+ - Gather all documents listed in the order specified in the document checklist
+ - Place all necessary documents in a sealed envelope
+ - Print out the document checklist and sign it
+ - Include the document checklist as the cover page of your application
+
+
+3. Pay your application fees
+
+ - Application fees include processing fees for you and anyone included in your application
+ - Right of permanent residence fee
+ - Third-party fees including fees for medical exams, police certificates, and language testing
+ - Biometrics fees: | Type of Applicant | Cost |
+| --- | --- |
+| Individual applicants | $85 CAD |
+| Families applying together | Maximum total fee of $170 CAD |
+| Groups of 3 or more performing artists and their staff | Maximum total fee of $255 CAD |
+
+#tablepress-407 from cache
+
+
+4. Submit your application
+
+ - Before submitting your application, ensure that it is complete
+ - Make sure you have signed all forms
+ - Pay your processing fees and include receipts in your application
+ - Include all supporting documents
+
+Put all documents in a 9” x 12” envelope, write ‘start-up visa’ on the outside of the envelope, and mail to the appropriate address
+
+
+
+## How long is the processing time for Canadas start-up visa
+
+The current processing time for the start-up visa is around 31 months.
+
+## Ready tostart?
+
+#### Business Immigration Assessment
+
+If you are an entrepreneur or an investor, we can help you immigrate to Canada! Simply complete our free assessment for business immigration and a business associate of Attorney Dery will review your eligibility and contact you to discuss your options.
+
+Free Asessment ## Related Links
+
+- ## Quebec Entrepreneur Program
+
+
+- ## Federal Self-Employed
+
+
+- ## Work in Canada
+
+
+
+## Canadian Immigration Options
+
+- I want to immigrate
+- I want to study
+- I want a work permit
+- I want to invest
+- I want to sponsor
+
+Follow us
+
+-
+-
+-
+-
+-
+
+## Newsletter
+
+Sign up to our Newsletter to keep you up-to-date on the
+ newest programs & development in the Canadian
+ Immigration world.
+
+## Contact
+
+1455 Saint Mathieu Street
+ Suite #100
+ Montréal (QC) H3H 2M4
+
+Email attorney@canadim.com
+Phone +1 514-989-9700
+Fax +1 514-989-9290
+
+Free Phone Consultation
+ +1 (514) 989-9700
+
+© Canadim 2025 -all rights reserved - Privacy Policy - Sitemap
+
+
+
+
+ Free assessment Free assessment Popup start Discover your Canadian immigration options. Get your free assessment now!
+
+Find out if you qualify Popup end Free assessment Express Entry Canadim Services Immigration news Our Blog ## Free assessment
+
+### Canada immigration form
+
+Discover your Canadian permanent residency options.
+
+Start now ### Student Immigration Form
+
+Discover your options to study in Canada.
+
+Start now Start of LiveChat (www.livechatinc.com) code Chat with us ,
+powered by LiveChat End of LiveChat code
+
+Document 6:
+html Eight Things to Know About Canada’s Start-Up Visa Program - Canada Immigration and Visa Information. Canadian Immigration Services and Free Online Evaluation. Skip to content **Clear **Search **Free Evaluation Form **Book a Consultation **Free Evaluation Form Search ****Book a Consultation - About ** - About Us
+ - Advertising Disclosure
+ - Editorial Code of Conduct
+
+
+- Immigration ** - Canada Immigration Overview
+ - Express Entry Overview - Express Entry for Skilled Immigration
+ - Canada Express Entry Draws 2024
+ - Comprehensive Ranking System (CRS)
+ - Express Entry Invitations to Apply (ITAs)
+
+
+ - Federal Skilled Worker - Federal Skilled Worker Program Eligible Occupations
+
+
+ - Federal Skilled Trades Program
+ - Canadian Experience Class
+ - Provincial Immigration - Overview
+ - Alberta
+ - British Columbia
+ - Manitoba
+ - New Brunswick
+ - Newfoundland
+ - Northwest Territories and Nunavut
+ - Nova Scotia
+ - Ontario
+ - Prince Edward Island
+ - Quebec
+ - Saskatchewan
+ - Yukon
+ - Atlantic Immigration Program
+
+
+ - Quebec Immigration - Quebec Skilled Worker Immigration
+ - Quebec Experience Class (PEQ)
+ - Quebec Business Immigration
+
+
+ - Pilot Immigration Programs - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+
+
+ - Sponsorship Immigration - Overview
+ - Sponsor Your Spouse or Common-Law Partner
+ - Sponsor Your Parents & Grandparents
+ - Parents and Grandparents Super Visa
+ - Sponsor your children
+ - Sponsorship of Adopted Children
+
+
+ - Refugee Immigration
+
+
+- Business ** - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work ** - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study ** - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Post Graduation Work Permit
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit ** - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship ** - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements - Citizenship ** - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources ** - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+****- About - About Us
+ - Advertising Disclosure
+ - Editorial Code of Conduct
+
+
+- Immigration - Canada Immigration Overview
+ - Express Entry Overview - Express Entry for Skilled Immigration
+ - Canada Express Entry Draws 2024
+ - Comprehensive Ranking System (CRS)
+ - Express Entry Invitations to Apply (ITAs)
+
+
+ - Federal Skilled Worker - Federal Skilled Worker Program Eligible Occupations
+
+
+ - Federal Skilled Trades Program
+ - Canadian Experience Class
+ - Provincial Immigration - Overview
+ - Alberta
+ - British Columbia
+ - Manitoba
+ - New Brunswick
+ - Newfoundland
+ - Northwest Territories and Nunavut
+ - Nova Scotia
+ - Ontario
+ - Prince Edward Island
+ - Quebec
+ - Saskatchewan
+ - Yukon
+ - Atlantic Immigration Program
+
+
+ - Quebec Immigration - Quebec Skilled Worker Immigration
+ - Quebec Experience Class (PEQ)
+ - Quebec Business Immigration
+
+
+ - Pilot Immigration Programs - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+
+
+ - Sponsorship Immigration - Overview
+ - Sponsor Your Spouse or Common-Law Partner
+ - Sponsor Your Parents & Grandparents
+ - Parents and Grandparents Super Visa
+ - Sponsor your children
+ - Sponsorship of Adopted Children
+
+
+ - Refugee Immigration
+
+
+- Business - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Post Graduation Work Permit
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+- Business Immigration
+- Canada Immigration
+- Canada Immigration News Articles
+- Start-Up Visa
+
+# Eight Things to Know About Canada’s Start-Up Visa Program
+
+- Colin R. Singer
+- **October 13, 2023
+
+
+### 1) What Is Canada’s Start-Up Visa Program?
+
+Canada’s Start-Up Visa Program offers Canadian permanent residence to qualified immigrant entrepreneurs. It is officially known as the Canada Start Up Class. But it is largely referred to as the Start-Up Visa program (SUV).
+
+The program targets innovative entrepreneurs and links them with private sector investors in Canada who will help establish their start-up business.
+
+Candidates can initially come to Canada on a work permit supported by their designated Canada-based investor, before qualifying for permanent residence once their business is up and running.
+
+There are three types of private-sector investor:
+
+1. Angel investor.
+2. Venture capital fund.
+3. Business incubator.
+
+Initially a three-year pilot, the program was made permanent on March 31, 2018.
+
+### 2) What Are the Candidate Eligibility Requirements?
+
+The basic candidate eligibility requirements for the Start-Up Visa are: 1. Qualifying business.
+2. Commitment Certificate and Letter of Support from a designated entity.
+3. Sufficient unencumbered, available and transferable settlement funds .
+4. Proficiency in English or French at minimum Canadian Language Benchmark level 5.
+
+Sample business Concepts ### 3) What Is A Start-Up Visa Program Designated Entity?
+
+A designated entity is a Canadian private sector angel investor, venture capital fund or business incubator.
+The required commitment must meet the following criteria:
+1. A designated **angel investor**group must invest at least $75,000 into the qualifying business. Candidates can also qualify with two or more investments from angel investor groups totalling $75,000.
+2. A designated **venture capital fund**must confirm that it is investing at least $200,000 into the qualifying business. Candidates can also qualify with two or more commitments from designated venture capital funds totalling $200,000.
+3. A designated **business incubator**must accept the applicant into its business incubator program.
+
+### 4) What Are the Start-Up Visa Program Business Ownership Requirements?
+
+For the candidate to qualify for permanent residence: 1. The intended business must be incorporated and carrying on business in Canada.
+2. The candidate must own at least 10 percent of the voting rights in the corporation.
+3. No other person can hold 50 percent or more of the voting rights in the corporation.
+
+NOTE: Up to five candidates may have their permanent residence application supported by the same business investment. However, certain candidates may be designated essential to the business. If any essential candidate withdraws their application, or are refused, all other candidates under the same business investment will see their applications terminated.
+
+### 5) How Do Candidates Qualify for A Work Permit/Permanent Residence?
+
+**To qualify for a work permit:**Candidates with a Commitment Certificate from a designated entity can apply for a short-term work permit to begin working in the business. The designated entity must support the request.
+**To qualify for permanent residence:**
+1. Candidates must be actively involved in the management of the business in Canada.
+2. The operations of the business, or an essential part, must take place in Canada.
+3. The business must be incorporated in Canada.
+
+### 6) How does an intending Immigrant Entrepreneur obtain support from a designated entity?
+
+An intending immigrant entrepreneur to Canada must have or must develop a viable business project that will meet due diligence requirements of government approved designated entities. Typically, business consultants in Canada start up ecosystem along with experienced corporate business immigration lawyers will ensure start-up business plans meet all industry required terms and conditions. ### 7) How long does it take for an intending immigrant entrepreneur to go through the process?
+
+If an entrepreneur has a viable start up business project, it will take about 4-6 months to secure a commitment certificate/letter of support from a designated entity. Once a letter of support is received, the application for permanent residence can be submitted. It will take approximately 18-months to finalize the application to visa issuance. ### 8) How Can Immigration.ca help intending immigrant entrepreneurs under the Start Up (SUV) Class?
+
+Our firm works extensively with industry acclaimed designated entities in the Canadian start-up ecosystem. We provide a range of hands-on business advisory services to help intending entrepreneur immigrants and their start-up business concept meet all industry requirements.
+
+Get more details ### Watch the Start-Up Visa Program Videos
+
+
+Advertisement #### Colin R. Singer
+
+Colin R. Singer, Managing Partner of immigration.ca, is a licensed immigration lawyer in Canada with Barreau du Quebec, for the past 30+ years. **Share on facebook **Share on twitter **Share on linkedin **Share on whatsapp **Share on pinterest **Share on reddit **Share on email ### Related articles
+
+##### What to Expect From Canada’s Start-Up Visa Program in 2025
+
+Read More » Colin R. Singer December 23, 2024 ##### Canadian CV checklist: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+
+Read More » Melissa Gosselin December 23, 2024 Startup Visa Program - Business Start-Up Free Evaluation
+- Eight Things to Know About Canada’s Start-Up Visa Program
+- Start Up Visa Sample Business Concepts
+- How to Apply for Canada’s Start-Up Visa from India
+
+Latest News - Canadian CV guide – dos and don’ts for 2025: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+November 28, 2024
+- What to Expect From Canada’s Start-Up Visa Program in 2025
+December 23, 2024
+- Canadian CV checklist: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+December 23, 2024
+- Manitoba Issues 399 Canada Immigration Invitations In New PNP Draw
+December 23, 2024
+- Celebrate the holidays in Canadian style: Check out Oh Canada, immigration.ca’s weekly culture and lifestyle newsletter for newcomers
+December 20, 2024
+- Canada The Top Destination for International Job Seekers, Report Says
+December 20, 2024
+- Prince Edward Island PNP Draw: Province Issues 33 Skilled Worker And Business Invitations
+December 20, 2024
+
+Podcasts ## Useful Links
+
+- **Free Immigration to Canada Evaluation
+- **Sign-up for Canadian Immigration Newsletters
+- **Canadian Citizenship Requirements
+- **Canada Work Visa – Work in Canada
+- **Canada Visitor Visa Guide
+- **12 Ways You Can Immigrate To Canada
+
+## Help
+
+- **Book an Immigration Consultation
+- **Contact Us
+- **Disclaimer
+- **Privacy Policy
+- **Fraud alert
+
+Linkedin **Facebook **Instagram **Youtube **Twitter **Podcast **Go to Top
+
+
+
+Document 1:
+html Start Preload scrips from tracking section Google Tag Manager End Google Tag Manager END Preload scrips from tracking section Meta Pixel Code End Meta Pixel Code Canada's Entrepreneur Immigration Programs | Canadavisa.com +1 (514) 937-9445 or Toll-free (Canada & US) +1 (888) 947-9445 | Home About Forum News Client Portal Contact Advertise - **English - **Français
+
+
+
+**Canada Immigration Lawyers - FREE ASSESSMENT
+- Immigrate
+
+- Work
+
+- Sponsor
+
+- Study
+
+- Citizenship
+
+- Inadmissibility
+
+- Legal Help
+
+- Business
+
+- Life in Canada
+
+
+1. **Home
+2. Business
+3. Entrepreneur Immigration
+
+# Canada's Entrepreneur Immigration Programs
+
+Last updated: 25 May 2023 ---
+
+## Canada, with one of the most business-friendly economies in the world, is a hugely attractive country in which to develop and build a new business idea.
+
+If you're looking to immigrate to Canada as an entrepreneur in the Canadian economy, the government of Canada, as well as certain Canadian provinces, present a variety of options
+
+#### Get a Free Canadian Immigration Assessment
+
+---
+
+### Federal Start-up Visa Program
+
+The federal government's Start-Up Visa Program encourages immigrant entrepreneurs to grow their companies in Canada. Successful applicants link with private sector organizations in Canada, where they can receive funding, guidance and expertise in opening and operating their enterprise in Canada. With the Start-Up Visa, Canada is targeting entrepreneurs who have the potential to build innovative companies that can compete on a global scale and create jobs.
+
+### Quebec Entrepreneur Program
+
+The Quebec Entrepreneur category of Canadian immigration was designed to allow qualified business owners and managers the opportunity to obtain Canadian permanent residence, provided that they can effectively create or acquire an agricultural, commercial or industrial business in the province of Quebec.
+
+### Provincial Entrepreneur Programs
+
+Canada's provinces offer a range of entrepreneur categories within their Provincial Nominee Programs. Through one of these categories, immigrant entrepreneurs can settle in a specific province.
+
+---
+
+## Contact CanadaVisa and Cohen Immigration Law for Business Immigration Assistance
+
+Cohen Immigration Law is a leading Canadian immigration law firm with over 45 years of experience. Cohen Immigration Law features over 60 immigration lawyers, paralegals, and professionals who are dedicated to helping you immigrate to Canada.
+
+CanadaVisa.com was founded as the online presence of Cohen Immigration Law. Since its launch in 1994, CanadaVisa has grown into one of the globe's most trusted resources on Canadian immigration.
+
+Get a Free Canadian Immigration Assessment
+
+
+
+### Business
+
+Business Immigration Overview Investors Entrepreneurs - Overview
+- Federal Start-Up Visa
+- Quebec Entrepreneur
+
+Self-Employed - Overview
+- Federal Self-Employed
+- Quebec Self-Employed
+
+Business Visitors Contact Us ### Latest News
+
+#### Canada's Express Entry Draw Results from August 14, 2024
+
+Immigration, Refugees and Citizenship Canada (IRCC) has conducted a second Express Entry draw this week, issuing 3,200 more Invitations to Apply (ITAs) to Canadian immigration candidates. Here are the results from IRCC's August 14 Express Entry draw.
+
+Read more... #### Canada's Express Entry Draw Results from July 31, 2024
+
+Immigration, Refugees and Citizenship Canada (IRCC) has conducted a second Express Entry draw this week. Read on for the results from the department's July 31st Express Entry draw.
+
+Read more... ### Explore your options
+
+- **I want to IMMIGRATE
+- **I want a WORK PERMIT
+- **I want to SPONSOR
+- **I want to STUDY
+- **I want to INVEST
+- **I'm new to CANADA
+- **I am an EMPLOYER
+- **I want LEGAL HELP
+- **I want to overcome INADMISSIBILITY
+
+### Canada Immigration Network
+
+- **CanadaVisa.com
+- **CICNews.com
+- **Canadian Immigration Forum
+- **Canadian Immigration News
+- **CanadaVisa News Team
+
+### Connect with us
+
+- **
+- **
+- **
+- **
+- **
+- **
+
+### Call us
+
+**+1 (514) 937-9445 ### Toll-free in U.S. and Canada
+
+**+1 (888) 947-9445 #### Subscribe to our Newsletter
+
+Subscribe CanadaVisa.com | 1303 Greene Ave., Suite 200|Westmount, Montreal, QC, Canada|H3Z 2A7
+
+© Copyright 2024 CanadaVisa.com. All Rights Reserved
+
+- Sitemap
+- Unsubscribe
+- Privacy Policy
+- Disclaimer
+- Copyright
+- Contact Us
+
+
+****Immigrate to Canada**USA to Canada Options Immigrate from Nigeria Immigrate from India Immigrate from Pakistan Immigrate from the Philippines Immigrate from Kenya Immigrate from Saudi Arabia Immigrate from the UAE Immigrate from Qatar Hong Kong Options Ukraine Measures Study Pathways to PR **Express Entry**Federal Skilled Worker Program Canadian Experience Class Federal Skilled Trades Program Comprehensive Ranking System Improve Your CRS Score Invitations to Apply Category-Based Draws Express Entry Draw Results **Provincial Nominee Programs**Alberta British Columbia Manitoba New Brunswick Newfoundland and Labrador Northwest Territories Nova Scotia Ontario Prince Edward Island Saskatchewan Yukon **Quebec Immigration**Quebec Skilled Worker Program Quebec Experience Program Expression of Interest System Arrima Portal Quebec Immigration Pilot Programs Quebec Immigration Levels Plan **Other Federal Economic Programs**Atlantic Immigration Program Caregivers Agri-Food Immigration Pilot Rural and Northern Pilot Start-Up Visa Program Self-Employed Persons Program **National Occupational Classification****Language Test Requirements****Education Credential Assessment****Immigration Levels Plan****About the Immigration Department****About the Immigration Minister**Free Assessment Express Entry CRS Calculator Category-Based Express Entry Draws PNP Finder **Working in Canada****TFWP & IMP****Work Permit Process****Work without a Work Permit****Get Maintained Status****Business Visitors**After Sales Service / Warranty Entertainment Business Visitors Tour Guides Operating in Canada IT Workers as Business Visitors Guest Speakers in Canada **Options for H-1B Visa Holders****Tech Talent Options****LMIA-Exempt Work Permits (IMP)**Canada's Free Trade Agreements Post-Graduation Work Permits PGWP Open Work Permit Extension Spousal Open Work Permit Temporary Work Permits In Quebec International Mobility Program Plus Significant Benefit Intra-Company Transfers TV and Film Production Workers Bridging Open Work Permit Open Work Permits Vulnerable Workers International Experience Canada Athletes and Staff Charitable or Religious Work **LMIA-Based Work Permits (TFWP)**Advertising Requirements LMIA Advertising Exemptions Global Talent Stream Recognized Employer Pilot Quebec Facilitated LMIA Processing Quebec Acceptance Certificate **Employer Compliance**Employer Compliance (IMP) Employer Compliance (TFWP) **About ESDC**Contact Our Work Permit Team **Family Class Sponsorship****Spouse or Common-Law Partner**Outland Sponsorship Inland Sponsorship Spousal Open Work Permit **Child or Other Dependent****Parents and Grandparents**PGP Invitation to Apply Super Visa **Requirements for Each Program**Minimum Necessary Income **Get Maintained Status**Family Assessment Form **Study in Canada**Canada Study Assessment Form Getting Admitted Designated Learning Institutions Letter of Acceptance Programs and Areas of Study Levels of Study Transfer Programs Pathway Programs Accommodation Financial Aid Student Health Insurance Compliance **Get a Study Permit**Student Direct Stream TD International Student GIC Program Study without a Study Permit Study Permit Refusals Renewing or Changing a Study Permit **Study Pathways to PR****Bringing your Family to Canada****Working While Studying****Post-Graduation Work Permits**Get a Free Study Consultation **About Canadian Citizenship**Citizenship Eligibility Calculate Your Citizenship Eligibility How to Apply for Citizenship **Benefits of Canadian Passport****Apply for Proof of Citizenship****Dual Citizenship****Citizenship Ceremony**Get a Free Citizenship Consultation Calculate Your Citizenship Eligibility **Overcome Inadmissibility****Temporary Resident Permit**What is a TRP? **Criminal Rehabilitation**Individual Rehabilitation Deemed Rehabilitation **Inadmissible Legal Opinion Letter**Pre-Sentence Legal Opinion Letter **Visiting with a Criminal Record****DUI****Marijuana****Common Offences**Entering with a Felony Entering with a Misdemeanor Denied Entry to Canada Deported from USA Serious Criminality Airlines and Staff Performing Artists Travel to and from Alaska Cross-Border Trade Hunting and Fishing Trips Transit Through Canada **Charges Within Canada****Authorization to Return to Canada****Refusals and Appeals****Canada Security Clearances****Overcome Medical Inadmissibility****Inadmissibility to Canada FAQs****eTA FAQ****Canada Border Services Agency**Free Consultation **About Cohen Immigration Law**Our Legal Advice Our Professional Credentials **How to Avoid Fraud****Workers' Rights in Canada****Biometrics****Temporary Resident Visas**Electronic Travel Authorization eTA FAQ **GCMS Notes****Tools and Resources**Job Search Tool CLB Language Converter Immigration Processing Times Skilled Occupations by NOC Immigration Processing Fees Free Assessment Contact Us **Business Immigration Overview****Investors****Entrepreneurs**Federal Start-Up Visa Quebec Entrepreneur **Self-Employed**Federal Self-Employed Quebec Self-Employed **Business Visitors**Contact Us **Getting Settled in Canada**Pre-arrival Guide COPR When you Arrive What to do in your First Month Phone and Internet Soft Landing as a PR PR Card PR Obligations **Opening a Bank Account**Bank with TD Credit Cards Saving and Investing About Insurance in Canada Filing your Taxes **How to Find Work**Where to Find Jobs Networking Writing a Canadian Resume Preparing for Job Interviews Bridging Programs Workers' Rights in Canada Canada Job Search Tool **Renting a Home****Buying a Home****Free Settlement Services****Healthcare****Education****Public Transportation****Driving****Buying a Car****Food and Grocery Options****Buying Furniture****How to Dress for the Weather****TV and Home Entertainment****Get to Know Canada**Alberta British Columbia Manitoba New Brunswick Newfoundland and Labrador Northwest Territories Nova Scotia Nunavut Ontario Prince Edward Island Quebec Saskatchewan Yukon Bank with TD How to Find Work Contact our Law Firm Google Tag Manager (noscript) End Google Tag Manager (noscript)
+
+Document 2:
+html Set up Meta Set the viewport width to device width for mobile Remove Microsoft Edge's & Safari phone-email styling Add external fonts below (GoogleFonts / Typekit) Google Tag Manager by PYS End Google Tag Manager by PYS This site is optimized with the Yoast SEO Premium plugin v24.2 (Yoast SEO v24.2) - https://yoast.com/wordpress/plugins/seo/ Entrepreneur Immigration to Canada: What Are Your Options? / Yoast SEO Premium plugin. Google Tag Manager End Google Tag Manager Google Tag Manager End Google Tag Manager Google Tag Manager (noscript) End Google Tag Manager (noscript) BEGIN of header **22 Combined Years**of Canadian Business Immigration Experience | +1 416 895 3026 Search - Fee Calculator
+- Free Assessment
+
+Talk to a Lawyer Sobirovs Law Firm - About Us - - - About Us
+
+Service Standards
+
+Results in 2023
+
+Team
+
+Careers
+
+
+
+
+
+
+
+
+- Services - - - Residency by Investment
+
+Establishing Foreign Companies
+
+Staff Transfers
+
+Bringing Foreign Start-Ups
+
+Employing Foreign Workers
+
+
+
+
+
+
+
+
+- Start-Ups - - - 2024 Start-Up Visa Canada Guide
+
+Start-Up Immigration Options
+
+Canada’s Self-Employed Residency Path
+
+C11 Work Permit Overview
+
+Starting a Business in Canada: Guide for Foreigners
+
+
+
+
+
+
+
+
+- Business Immigration - - - Buying a Business in Canada
+
+Business Immigration in Provinces
+
+Intra-Company Transfer Program
+
+Canadian Citizenship for Business Owners
+
+Buying a Franchise in Canada
+
+
+
+
+
+
+ - - - Alberta
+Nova Scotia
+PEI (Prince Edward Island)
+Quebec
+Saskatchewan
+
+
+
+
+
+
+- Employers - - - Global Talent Stream in Canada
+
+Hiring Foreign Workers
+
+Business Travel to Canada
+
+Work Permits for Executives
+
+Labour Market Impact Assessment (LMIA)
+
+High-Wage Labour Market Impact Assessment
+
+Tech Immigration for Employers
+
+International Mobility Program Canada
+
+
+
+
+
+
+
+
+- Stories - - - Success Stories
+
+Immigration Business Plan Guide
+
+Country Guides
+
+Video Library
+
+Testimonials
+
+
+
+
+
+
+ - - - Australia China Hong Kong India US Mexico Nigeria Russia Singapore South Africa Indonesia South Korea UAE Vietnam
+
+
+
+
+
+
+- Contact
+
+- About Us - - - #### Who We Are
+
+Who We Are
+ - #### About Us
+
+
+
+About Us
+
+We help our clients navigate Canada’s immigration system with ease and provide hassle-free immigration services.
+
+
+
+
+ - #### Service Standards
+
+
+
+Service Standards
+
+View the five principles on which our service delivery standards are based.
+
+
+
+
+
+
+ - - #### Results in 2023
+
+
+
+Results in 2023
+
+83.2% rate of positive results achieved.
+
+
+
+
+ - #### Team
+
+
+
+Team
+
+We put our 20+ years of combined legal experience to work to achieve your business & immigration goals in Canada.
+
+
+
+
+ - #### Careers
+
+
+
+Careers
+
+View our current job openings and learn more about starting a career at our firm.
+
+
+
+
+
+
+ - - ####
+
+### Hassle-Free Immigration For Companies, Business Owners, Foreign Entrepreneurs & Investors
+
+Schedule a meeting with a licensed Canadian immigration lawyer right now.
+
+Talk to a lawyer
+
+
+
+
+
+
+
+
+- Services - - - #### We Help With
+
+We Help With
+ - #### Residency by Investment
+
+
+
+Residency by Investment
+
+Acquire Canadian residency by investing in the country's economy.
+
+
+
+
+ - #### Establishing Foreign Companies
+
+
+
+Establishing Foreign Companies
+
+Expand globally by establishing your company in Canada, tapping into new markets.
+
+
+
+
+
+
+ - - #### Staff Transfers
+
+
+
+Staff Transfers
+
+Facilitate global mobility with seamless staff transfers to Canada for business operations.
+
+
+
+
+ - #### Bringing Foreign Start-Ups
+
+
+
+Bringing Foreign Start-Ups
+
+Bring your start-ups to Canada, and work toward permanent residency.
+
+
+
+
+ - #### Employing Foreign Workers
+
+
+
+Employing Foreign Workers
+
+Address talent needs by hiring foreign workers in Canada, close skill gaps and boost productivity.
+
+
+
+
+
+
+ - - ####
+
+### Hassle-Free Immigration For Companies, Business Owners, Foreign Entrepreneurs & Investors
+
+Schedule a meeting with a licensed Canadian immigration lawyer right now.
+
+Talk to a lawyer
+
+
+
+
+
+
+
+
+- Start-Ups - - - #### Starting Your Business In Canada
+
+Starting Your Business
+
+ - #### 2024 Start-Up Visa Canada Guide
+
+
+
+2024 Start-Up Visa Canada Guide
+
+Learn how entrepreneurs can gain Canadian permanent residency through the Start-Up Visa program.
+
+
+
+
+ - #### Start-Up Immigration Options
+
+
+
+Start-Up Immigration Options
+
+Explore the top immigration programs for entrepreneurs looking to start and operate a business in Canada.
+
+
+
+
+
+
+ - - #### Canada’s Self-Employed Residency Path
+
+
+
+Canada’s Self-Employed Residency Path
+
+This program welcomes creative professionals and athletes to become permanent residents, enhancing Canada’s cultural and athletic sector.
+
+
+
+
+ - #### C11 Work Permit Overview
+
+
+
+C11 Work Permit Overview
+
+Uncover the unique opportunities provided by the C11 Work Permit for entrepreneurs to enter and do business in Canada.
+
+
+
+
+ - #### Starting a Business in Canada: Guide for Foreigners
+
+
+
+Starting a Business in Canada: Guide for Foreigners
+
+Discover five effective strategies for entrepreneurs to establish a business in Canada.
+
+
+
+
+
+
+ - - ####
+
+### Hassle-Free Immigration For Companies, Business Owners, Foreign Entrepreneurs & Investors
+
+Schedule a meeting with a licensed Canadian immigration lawyer right now.
+
+Talk to a lawyer
+
+
+
+
+
+
+
+
+- Business Immigration - - - #### Federal and Provincial Business Immigration
+
+Federal and Provincial
+Business Immigration
+ - #### Buying a Business in Canada
+
+
+
+Buying a Business in Canada
+
+Essential insights for foreign investors looking to acquire Canadian businesses.
+
+
+
+
+ - #### Business Immigration in Provinces
+
+
+
+Business Immigration in Provinces
+
+Explore the Provincial Nominee Programs available in Canada for 2024.
+
+
+
+
+
+
+ - - #### Intra-Company Transfer Program
+
+
+
+Intra-Company Transfer Program
+
+Master the ICT program with a complete overview of its features and benefits.
+
+
+
+
+ - #### Canadian Citizenship for Business Owners
+
+
+
+Canadian Citizenship for Business Owners
+
+Understand the process to obtain Canadian citizenship through business ownership.
+
+
+
+
+ - #### Buying a Franchise in Canada
+
+
+
+Buying a Franchise in Canada
+
+Strategies for foreign investors to purchase franchises and leverage them for business and immigration objectives.
+
+
+
+
+
+
+ - - ####
+
+### Hassle-Free Immigration For Companies, Business Owners, Foreign Entrepreneurs & Investors
+
+Schedule a meeting with a licensed Canadian immigration lawyer right now.
+
+Talk to a lawyer
+
+
+
+
+
+
+ - - - Alberta
+British Columbia
+Manitoba New Brunswick
+Newfoundland and
+Labrador Nova Scotia
+PEI (Prince Edward
+Island) Quebec
+Saskatchewan
+
+
+ -
+
+
+
+
+- Employers - - - #### Bring Talent To Your Canadian Company
+
+Bring Talent To Your
+Canadian Company
+ - #### Global Talent Stream in Canada
+
+
+
+Global Talent Stream in Canada
+
+Bring your foreign talent to work in Canada fast.
+
+
+
+
+ - #### Hiring Foreign Workers
+
+
+
+Hiring Foreign Workers
+
+Navigate the process of recruiting and bringing foreign workers to your Canadian business.
+
+
+
+
+ - #### Business Travel to Canada
+
+
+
+Business Travel to Canada
+
+Compliant and confident travel to Canada for business purposes.
+
+
+
+
+ - #### International Mobility Program Canada
+
+
+
+International Mobility Program Canada
+
+A temporary immigration program for international talent looking to relocate to Canada.
+
+
+
+
+
+
+ - - #### Work Permits for Executives
+
+
+
+Work Permits for Executives
+
+Work permits and compliance for business executives, both in Canada and internationally.
+
+
+
+
+ - #### Labour Market Impact Assessment (LMIA)
+
+
+
+Labour Market Impact Assessment (LMIA)
+
+Master the LMIA process: processing times, requirements, and more.
+
+
+
+
+ - #### High-Wage Labour Market Impact Assessment
+
+
+
+High-Wage Labour Market Impact Assessment
+
+LMIA for foreign workers earning above the prevailing wage in Canada.
+
+
+
+
+ - #### Tech Immigration for Employers
+
+
+
+Tech Immigration for Employers
+
+Overview of Canadian tech immigration programs for employers.
+
+
+
+
+
+
+ - - ####
+
+### Hassle-Free Immigration For Companies, Business Owners, Foreign Entrepreneurs & Investors
+
+Schedule a meeting with a licensed Canadian immigration lawyer right now.
+
+Talk to a lawyer
+
+
+
+
+
+
+
+
+- Stories - - - #### Success Stories and Useful Resources
+
+Success Stories and Useful Resources
+ - #### Success Stories
+
+
+
+Success Stories
+
+See how we've helped our clients.
+
+
+
+
+ - #### Immigration Business Plan Guide
+
+
+
+Immigration Business Plan Guide
+
+Learn all about the immigration business plans for Canada.
+
+
+
+
+
+
+ - - #### Country Guides
+
+
+
+Country Guides
+
+Explore our tailor-made business immigration country guides.
+
+
+
+
+ - #### Video Library
+
+
+
+Video Library
+
+View our past live streams and videos.
+
+
+
+
+ - #### Testimonials
+
+
+
+Testimonials
+
+Read words directly from our clients.
+
+
+
+
+
+
+ - - ####
+
+### Hassle-Free Immigration For Companies, Business Owners, Foreign Entrepreneurs & Investors
+
+Schedule a meeting with a licensed Canadian immigration lawyer right now.
+
+Talk to a lawyer
+
+
+
+
+
+
+ - - - Australia
+China
+Hong Kong
+India US
+Mexico
+Nigeria
+Russia Singapore
+South Africa
+Indonesia South Korea
+UAE
+Vietnam
+
+
+ -
+
+
+
+
+- Contact
+
+Search END of header # Entrepreneur Immigration to Canada.
+
+Explore the best pathways for your start-up to thrive in Canada.
+
+Talk to a Lawyer Home » Canada For Start-Ups » Entrepreneur Immigration to Canada
+
+BEGIN of page content There are several Canadian entrepreneur immigration programs for foreign business owners: the Entrepreneur Work Permit program, Start-Up Visa Program, and various Provincial Nominee Programs. Each pathway is designed to facilitate the integration of innovative and economically beneficial enterprises by immigrant entrepreneurs into the Canadian economy.
+
+## What Immigration Options Are Available for Foreign Entrepreneurs in Canada?
+
+If you want to start and operate your business in Canada, several options may be available for a foreign entrepreneur. Here, we’ll discuss the top 3 most popular immigration programs for foreign entrepreneurs wishing to launch their businesses in Canada. After all, there are many reasons for foreign entrepreneurs to bring their businesses to Canada.
+
+### Option 1: Entrepreneur Work Permit Program
+
+The Entrepreneur Work Permit program is designed for self-employed individuals and entrepreneurs who want to come to Canada to start and operate their businesses. To apply for this program, entrepreneurs must own at least 50% of their business in Canada and present a business concept (or business plan) that explains how their businesses will contribute to the Canadian economy and generate employment opportunities for Canadian citizens and residents.
+
+Specifically, the applicants should focus on the following questions in their business plan:
+
+- Why is the business plan viable, and what benefits will it create for Canadians?
+- How many employment opportunities will the business create for Canadians?
+- Will the business improve/increase the export of Canadian products/services?
+- Will there be any technological or other advancements in the Canadian industry through the introduction of innovation, differentiation or improved skills?
+- Will the business contribute to the development of a regional or remote community?
+- Will the business provide a unique service or sell unique products?
+
+An initial work permit to operate a business in Canada will be issued for two years and may be renewed if the company continues to be actively engaged in doing business. Entrepreneurs will have a chance to apply for permanent residence after operating their business for at least one year in Canada, provided that they meet all the conditions for permanent residence application.
+
+### Read more about this subject below.
+
+- Top 7 Factors to Consider Before Deciding to Start Your Business In Canada
+- Success Story from Oman: C11 Work Permit for a businessman’s family
+- 3 Main Categories of Business Immigrants: Suitable Immigration Programs
+- Can You Buy a Business in Canada as a Non-Citizen or Foreigner?
+- Why Our Clients Want To Be Associated With Canada?
+
+
+
+### Option 2: Start-Up Visa Program
+
+The Start-Up Visa Program is a federal program designed to attract entrepreneurs with the skills and potential to build innovative businesses in Canada that compete on a global scale. This program offers permanent residence to the founding partners of a start-up.
+
+To apply for the Start-Up Visa Program, your business idea or venture must first get the support of one or more of the Designated Organizations in Canada. There are three types of designated entities:
+
+- Venture capital funds
+- Angel investor groups
+- Business incubators
+
+Each designated organization has its intake process for proposals and assessment criteria. Entrepreneurs working with a venture capital firm must secure a commitment of $200,000. Those working with designated angel investors in Canada must show proof of a $75,000 (or greater) financial commitment. Applicants do not need to get financial investment from a start-up incubator, but they need to be accepted into an accredited start-up incubator program in Canada.
+
+Please keep in mind that designated organizations receive thousands of applications for support, and it is not easy to obtain investment or support from a designated organization.
+
+Designated organizations tend to prefer investing in start-ups focusing on IT, clean technology, biotech, software, and high-growth scalable products or services rather than brick-and-mortar-type businesses. In short, there must be some novelty about your business.
+
+In addition, keep in mind that designated entities typically require more than an idea, and you would need to prove that you have a client base or customers. If you have nothing more than an idea, you may still try your chances with an incubator program. It may work assuming that your idea has been validated, sufficiently developed, and consistent with your qualifications and experience.
+
+### Read more on this subject and watch a specific video about the Start-Up Program.
+
+- FAQs and detailed answers about the Start-Up Visa Program: - Why My Application for the Start-Up Visa Program in Canada Might Be Denied?
+ - How Fast is the Canada Start-Up Visa Program?
+ - Why Do We Need a Start-Up Visa?
+ - How Does the Start-Up Visa Program Help Immigrant Entrepreneurs?
+
+
+
+### Option 3: Entrepreneur Programs of the Provinces
+
+If you are an experienced, high-net-worth entrepreneur who wishes to invest in and actively manage your businesses in Canada, PNP Entrepreneur Immigration streams can offer a path toward permanent residency in Canada.
+
+Each province in Canada has different sets of criteria for investing and assessment criteria, so you will need to verify your eligibility with the specific province. To apply, you need to develop a detailed business plan which explains the type of business you intend to purchase or establish and includes financial projections demonstrating how your purchase or creation of this business will benefit the local economy and the overall labour market.
+
+The application process, in general, is divided into six stages:
+
+1. **Expression of Interest –**register your interest with the province of your choice and describe your business concept and the intended investment;
+2. **Invitation to Apply –**if your score is sufficient, the province will invite you to submit your application, which includes your net worth verifications and the required documents;
+3. **Interview –**once you meet the eligibility criteria, you will have an interview with the local immigration authorities to discuss your business plan and your commitment;
+4. **Performance Agreement & Execution – y**ou will be required to sign a Performance Agreement with the provincial authorities that specifies the details of your required investment amount, your hiring plan, and the active management of your business. At that time, you will also receive a work permit to start executing your business plan, including investing the pledged amount into your business and creating employment opportunities for Canadians;
+5. **Nomination –**Once you comply with the terms of your performance agreement, you may apply for Nomination for Permanent Residence to the provincial authorities and
+6. **PR application –**Upon receiving your Nomination Letter from the province, you can submit your application for permanent residence to the Federal immigration authorities.
+
+### Read more on this subject and watch videos about the Provincial Nominee Programs for Entrepreneurs.
+
+- How Does the Canada Provincial Nominee Program Work?
+- How to Succeed in The Ontario Immigrant Nominee Program – Entrepreneur Stream
+- Which Provincial Nominee Program is Simplest in Canada and What is the Process?
+- Why Provincial Nominee Programs Should Not Be The Investors’ Top Choice
+
+## Sobirovs Law Firm Can Help
+
+We hope that we’ve given you an understanding of your options as a foreign entrepreneur. You can now decide whenever you are ready to take your business to the next level.
+
+Many foreign entrepreneurs took a step of courage to expand their companies to Canada and have seen boosting their profits. Similar to doing business anywhere, doing business in Canada has its challenges. Nonetheless, the advantages of expanding your business to Canada are way higher than the challenges themselves. We are here to help you overcome them!
+
+For more information on moving your company to Canada, speak to our senior business immigration lawyer. The business immigration experts at the Sobirovs Law Firm will not just help you move your existing company to Canada but will also help you choose the right type of business entity when moving your business to Canada.
+
+### Make Your First Step Towards Canada
+
+- Name *
+- Email *
+- Phone *
+- How did you hear about us? * How did you hear about us? Google Search Facebook YouTube LinkedIn Online Article Email Newsletter Friend's Referral Event Another Website Other
+- Your Citizenship * Your Citizenship Afghanistan Albania Algeria American Samoa Andorra Angola Anguilla Antarctica Antigua and Barbuda Argentina Armenia Aruba Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bermuda Bhutan Bolivia Bonaire, Sint Eustatius and Saba Bosnia and Herzegovina Botswana Bouvet Island Brazil British Indian Ocean Territory Brunei Darussalam Bulgaria Burkina Faso Burundi Cambodia Cameroon Canada Cape Verde Cayman Islands Central African Republic Chad Chile China Christmas Island Cocos Islands Colombia Comoros Congo, Democratic Republic of the Congo, Republic of the Cook Islands Costa Rica Croatia Cuba Curaçao Cyprus Czech Republic Côte d'Ivoire Denmark Djibouti Dominica Dominican Republic Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Eswatini (Swaziland) Ethiopia Falkland Islands Faroe Islands Fiji Finland France French Guiana French Polynesia French Southern Territories Gabon Gambia Georgia Germany Ghana Gibraltar Greece Greenland Grenada Guadeloupe Guam Guatemala Guernsey Guinea Guinea-Bissau Guyana Haiti Heard and McDonald Islands Holy See Honduras Hong Kong Hungary Iceland India Indonesia Iran, Islamic Republic of Iraq Ireland Isle of Man Israel Italy Jamaica Japan Jersey Jordan Kazakhstan Kenya Kiribati Kuwait Kyrgyzstan Lao People's Democratic Republic Latvia Lebanon Lesotho Liberia Libya Liechtenstein Lithuania Luxembourg Macau Macedonia Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands Martinique Mauritania Mauritius Mayotte Mexico Micronesia Moldova Monaco Mongolia Montenegro Montserrat Morocco Mozambique Myanmar Namibia Nauru Nepal Netherlands New Caledonia New Zealand Nicaragua Niger Nigeria Niue Norfolk Island North Korea Northern Mariana Islands Norway Oman Pakistan Palau Palestine, State of Panama Papua New Guinea Paraguay Peru Philippines Pitcairn Poland Portugal Puerto Rico Qatar Romania Russia Rwanda Réunion Saint Barthélemy Saint Helena Saint Kitts and Nevis Saint Lucia Saint Martin Saint Pierre and Miquelon Saint Vincent and the Grenadines Samoa San Marino Sao Tome and Principe Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Sint Maarten Slovakia Slovenia Solomon Islands Somalia South Africa South Georgia South Korea South Sudan Spain Sri Lanka Sudan Suriname Svalbard and Jan Mayen Islands Sweden Switzerland Syria Taiwan Tajikistan Tanzania, United Republic of Thailand Timor-Leste Togo Tokelau Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan Turks and Caicos Islands Tuvalu US Minor Outlying Islands Uganda Ukraine United Arab Emirates United Kingdom United States Uruguay Uzbekistan Vanuatu Venezuela Viet Nam Virgin Islands, British Virgin Islands, U.S. Wallis and Futuna Western Sahara Yemen Zambia Zimbabwe Åland Islands
+- Please identify which of the following best describes you? * Service you need I want to move my company to Canada I want to buy a business in Canada I want to start my own company in Canada I want to apply for Start-up Visa We are a tech company and need guidance We want to move our team to Canada I want to hire foreign workers I want to work in Canada None of the above
+- Please describe your situation below. *
+-
+- CAPTCHA
+-
+- Name This field is for validation purposes and should be left unchanged.
+
+Submit Δ
+
+#### WE ARE MEMBERS OF
+
+form ### Bringing You, Your Talent &
+Your Business To Canada
+
+Get started and make your first step towards Canada. Book your 1-hour strategy meeting with a licensed Canadian immigration lawyer.
+
+Immigration to Canada can be very complicated for businesses, business owners, and foreign employees. Hiring business immigration lawyers with the skill, experience, and patience is often crucial to successfully navigating this complex process. The experienced professionals at Sobirovs Law Firm offer tailored legal services in all business and corporate immigration matters. Contact us for more information on how we can help you meet your immigration needs.
+
+We have worked with & represented clients from all walks of life. Always just one call – or click – away, weʼre happy to help you begin your & your familyʼs journey to Canada.
+
+Talk to a Lawyer End form Slider ### Our Clients Say…
+
+```
+
+```
+
+see all reviews End SLider Insight ### Our Lastest Insights
+
+We publish helpful tips about Canadian immigration programs and are happy to share our knowledge with you. January 10, 2025 - Helpful Tips
+
+#### Emerging Opportunities for Entrepreneurs in Canada in 2025
+
+Canada continues to establish itself as a global leader in fostering innovation and entrepreneurship. With its stable economy, forward-thinking policies, and a strong commitment to... Read More December 19, 2024 - Immigration News
+
+#### New Changes Explained: Express Entry and LMIA-based job offer points
+
+On December 17, 2024 Immigration Minister Marc Miller announced that additional Comprehensive Ranking System (CRS) points for LMIA-based job offers will soon be eliminated.... Read More December 18, 2024 - Other News
+
+#### A Year of Transformation: The Top Canadian Immigration Changes of 2024
+
+[embed]https://www.youtube.com/live/wDNOVMk9UZs?si=ovDiW7sVJ99WKJ8m[/embed] 2024 has brought significant and transformative changes to Canada’s immigration policies. From managing international student intake to introducing stricter measures for work... Read More December 10, 2024 - Helpful Tips
+
+#### Canada’s Express Entry System Changes: Shifting Priorities to Retain In-Canada Talent
+
+Canada's Express Entry system, a cornerstone of the country's immigration policy, has been undergoing a series of adjustments in 2024 to maximize invitations to apply... Read More December 2, 2024 - Success Story
+
+#### Software Engineer Immigration to Canada – Alex’s Success Story
+
+When transforming a vision into reality, Alex's story (not his real name) is an inspiring testament to determination, innovation, and strategic planning. A seasoned software... Read More November 25, 2024 - Helpful Tips
+
+#### Visitor Visa Changes Canada: What You Need to Know
+
+Many visitors planning to explore Canada are impacted by the recent changes to visitor visa Canada policies. These changes aim to address challenges such as... Read More End Insight Subscribe Sign Up To Be
+
+### The First in Canadian Business Immigration News
+
+Email Get Our Weekly Newsletter Name This field is for validation purposes and should be left unchanged. Δ
+
+End Subscribe BEGIN of footer Monday / Friday 8:00-5:00
+
++1 416 895 3026
+
+wecare@sobirovs.com
+
+333 Bering Ave, Unit 800, Toronto, Ontario, M8Z 3A8, Canada
+
+Terms of Use | Privacy Policy | Disclaimer
+
+- Contact Us
+- Fee Calculator
+- Talk to a Lawyer
+
+#### Services
+
+- What We Do
+- Start-Ups
+- Business Immigration
+- Employers
+- TechImmigration
+
+#### About Us
+
+- Who We Are
+- Our Team
+- Service Standards
+- Our Results
+- Testimonials
+- News & Insights
+- Careers
+
+#### Contact Us
+
+- Contact Us
+- Talk to a Lawyer
+- Fee Calculator
+
+@ 2025 All rights reserved by Sobirovs Law Firm. Copying or repurposing content from this website is strictly forbidden.
+
+#### Connect with us via these apps
+
+-
+-
+-
+-
+-
+
+END of footer Google Tag Manager (noscript) End Google Tag Manager (noscript) Rocket no webp This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me
+
+Document 3:
+html Immigrant entrepreneurs - Canada.ca - Skip to main content
+- Skip to "About government"
+
+## Language selection
+
+- Français fr
+
+/ Gouvernement du Canada ## Search
+
+Search Canada.ca Search ---
+
+## Menu
+
+Main Menu - Jobs and the workplace
+- Immigration and citizenship
+- Travel and tourism
+- Business and industry
+- Benefits
+- Health
+- Taxes
+- Environment and natural resources
+- National security and defence
+- Culture, history and sport
+- Policing, justice and emergencies
+- Transport and infrastructure
+- Canada and the world
+- Money and finances
+- Science and innovation
+
+## You are here:
+
+1. Canada.ca
+2. Business and industry
+3. Starting a business
+4. Getting business support and financing
+
+# Immigrant entrepreneurs
+
+How to immigrate to Canada as an international investor or to start a business.
+
+## Follow:
+
+- Facebook
+- Twitter
+- YouTube
+
+## Services and information
+
+### Permanent residency for immigrant investors
+
+Eligibility and answers about the Immigrant Investor Venture Capital Pilot Program.
+
+### Immigrating to Canada to start a business
+
+Requirements for immigrants who want to build a business in Canada via the Start-up Visa program.
+
+### Immigrating to Canada as a self-employed person
+
+Opportunities for self-employed immigrants to contribute to the cultural or athletic life of Canada.
+
+### Frequently asked questions about business immigration
+
+Answers to your questions about coming to Canada to start a business.
+
+
+
+
+ Provincial and territorial programs to help you immigrate or invest in Canada to start a business.
+
+
### Expanding your business into Canada
+
+Establishing or expanding a foreign business in Canada.
+
+## Contributors
+
+- Immigration, Refugees and Citizenship Canada
+- Innovation, Science and Economic Development Canada
+
+## What we are doing
+
+### Publications
+
+- Canada wants entrepreneurs!
+- Step-by-step guide to starting a business
+- Welcome to Canada
+
+### Statistics
+
+- Key small business statistics
+- Compare your financial statements
+- Find statistics by industry
+
+## Page details
+
+Date modified: 2019-08-14 ## About this site
+
+### Government of Canada
+
+- All contacts
+- Departments and agencies
+- About government
+
+#### Themes and topics
+
+- Jobs
+- Immigration and citizenship
+- Travel and tourism
+- Business
+- Benefits
+- Health
+- Taxes
+- Environment and natural resources
+- National security and defence
+- Culture, history and sport
+- Policing, justice and emergencies
+- Transport and infrastructure
+- Canada and the world
+- Money and finances
+- Science and innovation
+- Indigenous Peoples
+- Veterans and military
+- Youth
+
+### Government of Canada Corporate
+
+- Social media
+- Mobile applications
+- About Canada.ca
+- Terms and conditions
+- Privacy
+
+Document 4:
+html [if lte IE 9]> End cookieyes banner Entrepreneur Programs | Canadim Google Tag Manager for WordPress by gtm4wp.com End Google Tag Manager for WordPress by gtm4wp.com This site is optimized with the Yoast SEO Premium plugin v22.7 (Yoast SEO v24.1) - https://yoast.com/wordpress/plugins/seo/ / Yoast SEO Premium plugin. Google Tag Manager for WordPress by gtm4wp.com GTM Container placement set to automatic End Google Tag Manager for WordPress by gtm4wp.com If no sidebar menu, add class "wide" to o-page and c-header - - English
+
+
+
+- About us
+- Contact us
+- Free Phone Consultation +1 (514) 989-9700
+
+- Immigrate ### Immigrate
+
+ - Immigrate to Canada
+ - Express Entry - Comprehensive Ranking System - CRS Score Calculator
+
+
+ - Express Entry Pool of Candidates
+ - Canadian Experience Class
+ - Federal Skilled Worker (FSW) Program
+ - Federal Skilled Trades
+ - Express Entry Draw
+ - When is the Next Express Entry Draw?
+ - Invitation to Apply (ITA)
+ - Electronic Application for Permanent Residence (eAPR)
+ - Proof of Funds for Express Entry
+
+
+ - Canada Provincial Nominee Programs (PNPs) - Latest PNP Draws in Canada
+ - Alberta – Provincial Nominee Programs - Farm Stream
+ - Alberta Express Entry
+ - Alberta Accelerated Tech Pathway
+ - Alberta Opportunity Stream
+ - Graduate Entrepreneur Stream
+ - Foreign Graduate Entrepreneur Stream
+
+
+ - British Columbia – Provincial Nominee Programs - Skills Immigration Stream
+ - BC PNP Tech
+ - Entrepreneur Immigration Stream
+
+
+ - Manitoba - Farm Investor Pathway
+ - Skilled Workers in Manitoba
+ - Skilled Workers Overseas
+ - International Education Stream
+ - Business Investor Stream
+
+
+ - New Brunswick - Express Entry Labour Market Stream
+ - Entrepreneurial Stream
+ - Post-Graduate Entrepreneurial Stream
+ - Skilled Worker Applicants with Employer Support
+ - New Brunswick Critical Worker Pilot
+ - New Brunswick Strategic Initiative Stream
+ - New Brunswick PNP – Information Sessions
+
+
+ - Newfoundland and Labrador - Express Entry Skilled Worker Category
+ - Skilled Worker Category
+ - International Graduate Category
+ - International Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Priority Skills NL: In-Demand Academic Path
+ - Priority Skills NL: In-Demand Work Path
+
+
+ - Northwest Territories - Express Entry
+ - Employer Driven
+ - Critical Impact Worker
+ - Skilled Worker
+ - Business Driven
+ - Entrepreneur
+
+
+ - Nova Scotia - Nova Scotia Demand: Express Entry (Closed)
+ - Nova Scotia Experience: Express Entry
+ - Entrepreneur Category
+ - International Graduate Entrepreneur Category
+ - Skilled Worker Category
+ - Physician Stream
+ - Nova Scotia Labour Market Priorities
+ - Nova Scotia Labour Market Priorities for Physicians
+ - Occupations In Demand
+
+
+ - Ontario - Ontario’s Express Entry Streams
+ - Employer Job Offer
+ - Masters Graduates
+ - PhD Graduates
+ - Entrepreneur
+ - Regional Immigration Pilot
+
+
+ - Prince Edward Island - PEI PNP Express Entry
+ - Business Impact
+ - Work Permit
+ - Labour Impact
+ - Skilled Worker in PEI
+ - Skilled Worker Outside Canada
+ - Critical Worker
+ - International Graduate
+
+
+ - Saskatchewan - International Skilled Worker
+ - Saskatchewan Experience
+ - Saskatchewan Entrepreneur and Farm
+
+
+ - Yukon - Yukon Express Entry
+ - Skilled Worker
+ - Critical Impact Worker
+ - Business Nominee
+ - Yukon Community Pilot
+
+
+
+
+ - Quebec Immigration - Immigrate to Quebec
+ - Regular Skilled Worker Program (RSWP)
+ - Quebec Experience Program (PEQ)
+ - Quebec Entrepreneur Program
+ - Quebec Self-Employed Worker Program
+ - Quebec Investor Program – QIIP
+ - Certificat de Selection du Quebec (CSQ)
+ - Quebec Immigration FAQ
+
+
+ - Canada Permanent Resident (PR) - Confirmation of Permanent Residence (COPR)
+ - Permanent Resident Card (PR card)
+ - Permanent Resident Card Renewal
+ - Permanent Resident Travel Document
+ - Residency Obligations
+
+
+ - Professional & Skilled Workers - Canadian Experience Class (CEC)
+ - Federal Skilled Worker (FSW) Program
+ - Regular Skilled Worker Program (RSWP)
+
+
+ - Atlantic Immigration Program
+ - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+ - Caregiver Program Canada - Home Child Care Provider Pilot
+ - Home Support Worker Pilot
+ - Past Caregiver Programs
+
+
+ - Canada Immigration FAQ
+ - Moving to Canada From Another Country - Moving to Canada from the USA
+
+
+
+
+- Work ### Work
+
+ - Work in Canada
+ - Work without a Work Permit - Business Visitors
+
+
+ - Temporary Foreign Worker Program - Labour Market Impact Assessment (LMIA)
+ - Facilitated LMIA (Quebec) List of Occupations
+ - Canada Global Talent Stream (GTS)
+
+
+ - International Mobility Program - Intra-Company Transfers
+ - CUSMA (formerly called NAFTA) Work Permit
+ - Working with CSQ
+ - CETA Work Permits
+ - Open Work Permits - Post-Graduate Work Permit
+ - International Experience Canada
+ - Spouse Open Work Permit (SOWP) Canada
+ - Bridging Open Work Permit (BOWP) Canada
+
+
+
+
+ - Tools & Resources - Job Search Tool
+ - Social Media Presence Guide
+ - Canadian Resume Guide
+
+
+ - For Employers
+
+
+- Study ### Study
+
+ - Study & Immigrate in Canada - Study in Canada: Changes for 2024 -2026
+ - Our International Student Program
+
+
+ - Canadian Designated Learning Institutions (DLI)
+ - Levels of Study
+ - Study Permit in Canada - Student Direct Stream (SDS) Canada
+ - Provincial Attestation Letter (PAL)
+
+
+ - Certificat d’acceptation du Quebec (CAQ)
+ - Refusals and Appeals
+ - Live as a student in Canada - International Students in Canada
+ - Extend a Study Permit
+ - International Student Health Insurance in Canada - Quebec Health Insurance Plan for International Students
+
+
+ - Student Accommodation
+ - Work While Studying
+ - International Students: Spouse and Family Dependent Visa
+
+
+ - Post-Graduate Work Permit
+ - Permanent Residence (PR) for international students
+
+
+- Sponsorship ### Sponsorship
+
+ - Canada Sponsorship
+ - Spousal Sponsorship: Sponsor your Spouse or Partner for Canadian Immigration - Inland Sponsorship
+ - Outland Sponsorship
+ - Spousal Sponsorship Quebec
+ - Spouse Open Work Permit (SOWP) Canada
+
+
+ - Child or Other Dependant Sponsorship
+ - Parents and Grandparents Sponsorship - Super Visa Canada
+
+
+ - Minimum Necessary Income (MNI) Requirements for 2024
+ - Canada Sponsorship FAQ
+
+
+- Business ### Business
+
+ - Business Immigration
+ - Investor Programs in Canada - Federal Investor Program (Terminated)
+ - Federal Venture Capital (Closed)
+ - Quebec Investor Program – QIIP
+
+
+ - Entrepreneur Programs - Federal Entrepreneur Program (Terminated)
+ - Start-Up Visa Canada
+ - Quebec Entrepreneur Program
+
+
+ - Self Employed Programs - Federal Self-Employed
+ - Quebec Self-Employed
+
+
+ - About our Business Immigration Team
+
+
+- Resources ### Resources
+
+ - Our Canadian Immigration Services
+ - Inadmissible to Canada - Criminal Inadmissibility
+ - Temporary Resident Permit (TRP)
+ - Medical Inadmissibility
+ - Legal Opinion Letters
+ - Entering Canada with a DUI
+ - Criminal Rehabilitation
+
+
+ - How to Get Canadian Citizenship - Citizenship Requirements
+ - Citizenship Application
+ - Citizenship FAQ
+
+
+ - Life in Canada - Canadian Economy
+ - Taxation in Canada
+ - Newcomers Services
+ - How to Find Accommodation in Canada
+
+
+ - Visitor Visa - Visitor Visa
+ - Super Visa Canada
+ - Business Visitor Visas
+ - electronic Travel Authorization (eTA)
+
+
+ - Canadian Immigration News & Updates
+ - Canadian Immigration Blog & Resources
+ - Tools - CRS Score Calculator
+ - CLB Language Converter
+ - Job Search
+ - Visiting Canada Tool
+
+
+ - Guides - What is a NOC Code in Canada?
+ - How to Write a Reference Letter
+ - Educational Credentials Assessment (ECA) Guide
+ - Canadian Resume Guide
+ - Canadian Cover Letter Guide
+ - Social Media Presence Guide
+ - Canadim’s Employment Services
+ - Canadian Language Benchmark Guide
+ - Canadian Immigration Glossary
+ - See all guides & FAQs
+
+
+ - Refugees & Humanitarian
+ - Canadian Immigration Processing Fees
+
+
+- Search...
+
+- - English
+
+
+
+- About us
+- Contact us
+
+-
+-
+-
+-
+-
+
+Business
+### Business
+
+- Business Immigration
+- Investor Programs in Canada - Federal Investor Program (Terminated)
+ - Federal Venture Capital (Closed)
+ - Quebec Investor Program – QIIP
+
+
+- Entrepreneur Programs - Federal Entrepreneur Program (Terminated)
+ - Start-Up Visa Canada
+ - Quebec Entrepreneur Program
+
+
+- Self Employed Programs - Federal Self-Employed
+ - Quebec Self-Employed
+
+
+- About our Business Immigration Team
+
+Back to top - Home
+- Business
+- Entrepreneur Programs
+
+# Entrepreneur Programs
+
+Welcoming eligible small businesses and startups alike, Canada will help your business reach new heights as you work together to bolster the economy and create jobs for its citizens and permanent residents like yourself.
+
+- Federal Entrepreneur Program
+- Federal Startup Visa
+- Quebec Entrepreneur Program
+- Provincial Nominee Programs for Entrepreneurs
+
+Get Started ## Federal Entrepreneur Program
+
+*This program was terminated and it is unlikely the program will be reopened in the future.
+
+Eligible applicants and their immediate families will be granted Canadian permanent residence for managing and establishing or acquiring at least 33.33% of equity within an eligible Canadian business that creates a minimum of one new job within the economy.
+
+## Federal Startup Visa
+
+Business entrepreneurs can grow their companies in Canada with the funding and expertise from approved Canadian private sector organizations, and receive a Canadian Startup Visa in return for growing the economy and creating employment opportunities for citizens and residents alike. Unlike Immigrant Investor programs, or the Federal Entrepreneur program, applicants are not required to invest any of their own capital to meet the program’s eligibility requirements. Instead, they must receive a minimum venture capital or angel investment from one or multiple designated organizations.
+
+Read more about Canada’s start-up visa here.
+
+## Quebec Entrepreneur Program
+
+If you are an experienced business person or manager with an intermediate knowledge of the French language, you may be eligible to obtain a Business Entrepreneur Visa by creating or acquiring a business in the province of Quebec. The Quebec Entrepreneur Program has two streams available for foreign entrepreneurs.
+
+## Provincial Nominee Programs for Entrepreneurs
+
+Certain provinces operate can nominate applicants through their own entrepreneur stream of the Provincial Nominee Program. If you are interested in settling and managing a business within a particular province, you may be nominated for Permanent Residence, provided you meet the eligibility requirements set forth by the province.
+
+## Ready tostart?
+
+#### Business Immigration Assessment
+
+If you are an entrepreneur or an investor, we can help you immigrate to Canada. Simply complete our free assessment for business immigration and a business associate of Attorney Dery will review your eligibility and contact you to discuss your options.
+
+Get Started ## Related Links
+
+- ## Investor Programs
+
+
+- ## Self-Employed Programs
+
+
+- ## Work in Canada
+
+
+
+## Canadian Immigration Options
+
+- I want to immigrate
+- I want to study
+- I want a work permit
+- I want to invest
+- I want to sponsor
+
+Follow us
+
+-
+-
+-
+-
+-
+
+## Newsletter
+
+Sign up to our Newsletter to keep you up-to-date on the
+ newest programs & development in the Canadian
+ Immigration world.
+
+## Contact
+
+1455 Saint Mathieu Street
+ Suite #100
+ Montréal (QC) H3H 2M4
+
+Email attorney@canadim.com
+Phone +1 514-989-9700
+Fax +1 514-989-9290
+
+Free Phone Consultation
+ +1 (514) 989-9700
+
+© Canadim 2025 -all rights reserved - Privacy Policy - Sitemap
+
+
+
+
+ Free assessment Free assessment Popup start Discover your Canadian immigration options. Get your free assessment now!
+
+Find out if you qualify Popup end Free assessment Express Entry Canadim Services Immigration news Our Blog ## Free assessment
+
+### Canada immigration form
+
+Discover your Canadian permanent residency options.
+
+Start now ### Student Immigration Form
+
+Discover your options to study in Canada.
+
+Start now Start of LiveChat (www.livechatinc.com) code Chat with us ,
+powered by LiveChat End of LiveChat code
+
+Document 5:
+html Provincial Entrepreneur Programs - Canada Immigration and Visa Information. Canadian Immigration Services and Free Online Evaluation. Skip to content **Clear **Search **Free Evaluation Form **Book a Consultation **Free Evaluation Form Search ****Book a Consultation - About - About Us
+ - Advertising Disclosure
+ - Editorial Code of Conduct
+
+
+- Immigration - Canada Immigration Overview
+ - Express Entry Overview - Express Entry for Skilled Immigration
+ - Canada Express Entry Draws 2024
+ - Comprehensive Ranking System (CRS)
+ - Express Entry Invitations to Apply (ITAs)
+
+
+ - Federal Skilled Worker - Federal Skilled Worker Program Eligible Occupations
+
+
+ - Federal Skilled Trades Program
+ - Canadian Experience Class
+ - Provincial Immigration - Overview
+ - Alberta
+ - British Columbia
+ - Manitoba
+ - New Brunswick
+ - Newfoundland
+ - Northwest Territories and Nunavut
+ - Nova Scotia
+ - Ontario
+ - Prince Edward Island
+ - Quebec
+ - Saskatchewan
+ - Yukon
+ - Atlantic Immigration Program
+
+
+ - Quebec Immigration - Quebec Skilled Worker Immigration
+ - Quebec Experience Class (PEQ)
+ - Quebec Business Immigration
+
+
+ - Pilot Immigration Programs - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+
+
+ - Sponsorship Immigration - Overview
+ - Sponsor Your Spouse or Common-Law Partner
+ - Sponsor Your Parents & Grandparents
+ - Parents and Grandparents Super Visa
+ - Sponsor your children
+ - Sponsorship of Adopted Children
+
+
+ - Refugee Immigration
+
+
+- Business - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Post Graduation Work Permit
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+****- About - About Us
+ - Advertising Disclosure
+ - Editorial Code of Conduct
+
+
+- Immigration - Canada Immigration Overview
+ - Express Entry Overview - Express Entry for Skilled Immigration
+ - Canada Express Entry Draws 2024
+ - Comprehensive Ranking System (CRS)
+ - Express Entry Invitations to Apply (ITAs)
+
+
+ - Federal Skilled Worker - Federal Skilled Worker Program Eligible Occupations
+
+
+ - Federal Skilled Trades Program
+ - Canadian Experience Class
+ - Provincial Immigration - Overview
+ - Alberta
+ - British Columbia
+ - Manitoba
+ - New Brunswick
+ - Newfoundland
+ - Northwest Territories and Nunavut
+ - Nova Scotia
+ - Ontario
+ - Prince Edward Island
+ - Quebec
+ - Saskatchewan
+ - Yukon
+ - Atlantic Immigration Program
+
+
+ - Quebec Immigration - Quebec Skilled Worker Immigration
+ - Quebec Experience Class (PEQ)
+ - Quebec Business Immigration
+
+
+ - Pilot Immigration Programs - Rural and Northern Immigration Pilot
+ - Agri-Food Pilot
+
+
+ - Sponsorship Immigration - Overview
+ - Sponsor Your Spouse or Common-Law Partner
+ - Sponsor Your Parents & Grandparents
+ - Parents and Grandparents Super Visa
+ - Sponsor your children
+ - Sponsorship of Adopted Children
+
+
+ - Refugee Immigration
+
+
+- Business - Overview
+ - Start-Up Visa Program - Canada’s Immigration Pathway for Entrepreneurs
+ - Eight Things to Know About Canada’s Start-Up Visa Program
+
+
+ - Quebec Investor Program
+ - Provincial Entrepreneur Programs
+ - Self-Employed Programs
+ - Buy a Business and Move to Canada
+ - International Business Immigration Programs
+
+
+- Work - Work Permits - LMIA-Based Work Permits
+ - LMIA-Exemptions
+ - Work Permit Exemptions
+ - Open Work Permits
+ - Global Skills Stream
+ - International Mobility Program
+ - International Experience Canada Program
+
+
+ - How to apply - The Process
+ - After Submission
+ - Change or Extend Your Work Permit
+
+
+ - Working in Quebec
+ - Live-in Caregivers
+
+
+- Study - Canada Study Permit
+ - Why Study in Canada?
+ - Study Permit - Step-By-Step Guide
+ - Financial Requirements
+
+
+ - Student Direct Stream
+ - Work and Study - Work While Studying
+ - Internships and Co-Op Programs
+ - On-Campus Work
+ - Off-Campus Work
+ - Work After Graduation
+ - Post Graduation Work Permit
+
+
+ - Studying in Quebec - Conditions to Qualify under PEQ
+ - Financial Requirements to Study in Quebec
+
+
+ - Pathways to Permanent Residence
+ - Tools - Online IELTS courses
+ - Language Tests Converter
+ - Study in Canada FAQ
+ - Study in Canada News Articles
+ - Canada Study Assessment
+
+
+
+
+- Visit - Canada Temporary Visa Overview
+ - Canada Visitor Visa Guide
+ - Electronic Travel Authorization (eTA)
+ - Canada Work Permit
+ - Parents and Grandparents Super Visa
+
+
+- Citizenship - How to Apply for Canada Citizenship: A Step-by-Step Guide
+ - Eligibility
+ - Benefits of Canadian Citizenship
+ - Language Requirements
+ - Residency Requirements
+
+
+- Tools & Resources - Book a Consultation
+ - Essential Guide for Newcomers
+ - Directory of Lawyers and Consultants
+ - Banking with Scotiabank
+ - News
+ - Email Newsletters - Immigration.ca
+ - Oh Canada
+ - True North
+
+
+ - My Great Canada Podcast
+ - Immigration Processing Fees
+ - Immigration Processing Times
+ - Frequently Asked Questions
+ - Online IELTS courses
+ - Language Tests Converter
+ - Law Library - Immigration News Articles
+ - Publications
+ - Immigration Manuals
+ - Operational Bulletins
+ - Case Law
+ - Immigration Wiki
+
+
+ - Criminal Inadmissibility - Overview
+ - Impaired Driving Convictions
+ - Individual Criminality
+ - Organized Crime
+ - Rehabilitation
+ - Temporary Residence Permits (TRP)
+
+
+
+
+
+- Business Immigration
+
+# Provincial Entrepreneur Programs
+
+- Colin R. Singer
+- **May 30, 2024
+
+
+Each of Canada’s provinces operates its own entrepreneur program with varying requirements.
+
+Some aim to attract candidates to areas outside their major cities.
+
+Details of provincial and territorial entrepreneur programs are outlined below.
+
+Details of Quebec business immigration programs are here.
+
+How to Buy a Business and Move to Canada ****British Columbia British Columbia operates three business streams:
+
+- Entrepreneur Immigration
+- Entrepreneur Immigration – Regional Stream
+- Entrepreneur Immigration – Strategic Projects
+
+B.C. Entrepreneur Immigration
+
+Requirements
+
+- Establish an eligible new business or purchase and improve an existing business in B.C.
+- Invest a minimum of $200,000 in the new or existing business.
+- Create at least one new full-time job for a Canadian citizen or permanent resident
+- Have a net worth of a minimum of $600,000.
+- Have business and/or management experience.
+- Canadian Language Benchmark (CLB) Level 4 in English or French in each of the four competencies: listening, speaking, reading and writing, BY THE TIME OF NOMINATION.
+- Have, or be eligible for, legal immigration status in Canada.
+- Have been lawfully admitted in the country where you currently reside.
+- Pay a $300 registration fee, $3,500 application fee and $1,000 fee.
+
+B.C. Entrepreneur Immigration – Regional Stream
+
+The British Columbia Entrepreneur Immigration – Regional Stream aims to attract entrepreneurs to rural parts of the province.
+
+Community Requirements
+
+- The population of less than 75,000.
+- Located beyond 30 km from a municipality of more than 75,000 population.
+- Demonstrated capacity to support foreign entrepreneurs with a network of settlement and business support agencies.
+- Immigration and pilot-specific training must be completed by community representatives.
+
+Candidate Requirements
+
+- Desire to start a business and settle in a B.C. regional community.
+- Complete an exploratory visit.
+- Minimum of $100,000 CAD in eligible business investments.
+- Minimum personal net worth of $300,000 CAD.
+- CLB Level 4 In English or French in each of the four competencies: listening, speaking, reading and writing, BY THE TIME OF NOMINATION.
+- Minimum of 51 per cent ownership.
+- Minimum of one new job created.
+
+B.C. Entrepreneur Immigration – Strategic Projects
+
+The B.C. Entrepreneur Immigration – Strategic Projects stream assists foreign-controlled companies establishing an eligible business in B.C. with the timely entry of foreign key managerial, professional or technical staff who intend to become permanent residents of Canada and settle in B.C.
+
+Company Requirements
+
+- Make a minimum equity investment of $500,000 to establish or purchase and expand an eligible business in B.C.
+- Create at least three new jobs for Canadian citizens or permanent residents for each foreign key staff member proposed (to a maximum of five key staff).
+- Establish or purchase and expand a company in B.C.
+
+Read more >>
+
+****Alberta Alberta Farm Stream
+
+The Farm Stream is managed by the AAIP in close collaboration with the Alberta Agriculture and Forestry, and targets applicants with farm management skills and sufficient financial resources to invest in a farming business in Alberta.
+
+Alberta Foreign Graduate Entrepreneur Stream
+
+The Foreign Graduate Entrepreneur Stream is aimed at qualified foreign-educated graduates from outside Canada, who wish to receive permanent residence upon launching start-up enterprises in Alberta.
+
+Alberta Graduate Entrepreneur Stream
+
+The Graduate Entrepreneur Stream is aimed at international graduates from Alberta post-secondary institutions who want to establish or operate a business in the province.
+
+Alberta Rural Entrepreneur Stream
+
+The Rural Entrepreneur Stream is aimed at entrepreneurs who want to start a business or buy an existing business in a rural Alberta community.
+
+****Saskatchewan The Saskatchewan Immigrant Nominee Program has two main business categories: the Entrepreneur stream and the International Graduate Entrepreneur Stream.
+
+Entrepreneur Stream
+
+Process
+
+- Expression of interest
+- Invitation to submit an application
+- Nomination
+
+The expression of interest must meet the following minimum entry requirements:
+
+- Minimum net worth of $500,000 legally acquired.
+- Minimum of three years of entrepreneurial or relevant management experience.
+- Investment of at least $300,000 in Regina or Saskatoon, or $200,000 is any other Saskatchewan area.
+
+Candidates enter a pool where they receive a score. The top-scoring candidates are invited to submit an application.
+
+Applications must include:
+
+- Business Establishment Plan confirming figures in expression of interest, and including at least one-third ownership of a company in Saskatchewan, unless investment is $1 million or higher.
+- Commitment to be active in the day-to-day management of business.
+- Creation of two or more jobs for Canadian citizens or permanent residents if the business is located in Regina or Saskatoon.
+
+International Graduate Entrepreneur Stream: Process
+
+1. Submit an Expression of Interest (EOI)
+
+Candidates must submit an Expression of Interest to the SINP
+
+2. Invitation to Apply
+
+Candidates are scored based on their Expression of Interest, with the top-scoring candidates issued Invitations to Apply.
+
+Applicants that pass the SINP’s assessment stage sign a Business Performance Agreement (BPA) based on their submitted Business Establishment Plan (BEP).
+
+3. Business Establishment
+
+Approved candidates establish and actively operate their business while in Saskatchewan on a valid Post-Graduation Work Permit.
+
+4. Nomination
+
+Once a candidate satisfies the conditions of the Business Performance Agreement, they can apply to be nominated by the SINP for permanent residency.
+
+Applicants that close or sell their business upon earning an SINP nomination and prior to obtaining permanent residence will have their nomination revoked.
+
+International Graduate Entrepreneur Stream: Requirements
+
+Requirements To Submit an EOI
+
+
+
+- Be at least 21 years of age.
+- Have completed a full-time Saskatchewan post-secondary degree or diploma of at least two years in length from a recognized and eligible Saskatchewan institution.
+- Have a valid Post-Graduate Work Permit with no less than 24 months of eligibility remaining.
+- Have lived in Saskatchewan during their academic program.
+- Have a minimum Canadian Language Benchmark (CLB) level of 7.
+
+**Requirements For Business Establishment**- Live in Saskatchewan.
+- Actively own and operate an eligible business in Saskatchewan for at least one year prior to applying for nomination.
+- Own at least one-third of the equity of the business.
+- Demonstrate that the business is generating the minimum required revenue amount after one year of operation, dependent on the number of employees.
+- Sign a Business Performance Agreement with the Government of Saskatchewan, which will be provided to you by the SINP after your application is approved.
+
+Read more >>
+
+****Manitoba Business Investor Stream
+
+The Manitoba Business Investor Stream is aimed at qualified international business investors and entrepreneurs. Candidates are initially issued with a temporary work permit and must have the intent and ability to start or purchase a business in Manitoba within two years of arrival. The stream abolishes a previous requirement for a $100,000 deposit with the Manitoba government. There are pathways for entrepreneurs and for farm investors.
+
+a) Entrepreneur Pathway
+
+For applicants wanting to open a business in Manitoba. Candidates are initially issued with a temporary work permit. They are nominated for permanent residence after establishing a business meeting the conditions of a Business Performance Agreement. Priority is given to candidates starting businesses outside Winnipeg.
+
+b) Farm Investor Pathway
+
+For applicants wanting to open and operate a farm in rural Manitoba. Candidates are initially issued with a temporary work permit. They are nominated for permanent residence after establishing a business meeting the conditions of a Business Performance Agreement.
+
+Read more >>
+
+****Nova Scotia The Nova Scotia
+
+Entrepreneur stream targets candidates with business ownership or senior management experience. They must live in Nova Scotia, either start a new business or buy an existing business, and actively participate in the day-to-day management of that business.Under the Entrepreneur stream, candidates are first issued a temporary work permit before applying for permanent residence after operating the business for a year. The stream uses an Expression of Interest format, where candidates in a pool are invited to apply.Entrepreneur Stream: Candidate RequirementsBe aged 21 or older.Want to live permanently in Nova Scotia while owning and actively managing a Nova Scotia business.Minimum net worth of $600,000 ($400,000 if their business is outside Halifax Regional Municipality (HRM)). Minimum investment of $150,000 of their own money to establish or purchase a business in Nova Scotia ($100,000 if their business is outside HRM). Minimum 3 years of experience actively managing and owning a business (33 percent ownership minimum) OR more than 5 years of experience in a senior business management role.Score minimum of 5 on the Canadian Language Benchmark in speaking, listening, reading and writing in English or French.
+
+The provincial government can now issue ITAs to strategically chosen candidates, in support of key sectors.
+
+Read More >>
+
+****Ontario The Ontario Entrepreneur Stream is aimed at individuals from outside Canada who want to start a business or buy an already existing business in Ontario. Those who are approved for the program will be nominated for Canadian permanent residence. Once nominated, an applicant qualifies to apply for Canadian permanent residence.
+
+Applicants under the OES must:
+
+- Have at least 24 months of full-time business experience in the past 60 months.
+- The experience must be as an owner or senior manager of a business. - Have a minimum net worth of $800,000 if your proposed business will be in the Greater Toronto Area (GTA).
+ - If your proposed business will be outside of the GTA, the minimum net worth requirement is $400,000.
+ - If your proposed business will be involved in Information Communications Technology or Digital Communications anywhere in the province, the minimum net worth requirement is $400,000.
+
+
+- Be ready to invest at least $600,000 in an Ontario business and possess at least 33% equity ownership if the business is in the GTA. - If the business is outside the GTA, you must be ready to invest at least $200,000 and have at least 33% equity ownership.
+ - If the business will be involved in Information Communications Technology or Digital Communications anywhere in the province, you must be ready to invest at least $200,000 and have at least 33% equity ownership.
+
+
+- Commit to creating two full-time jobs for Canadian citizens or permanent residents in the proposed company if the business is located inside the GTA. - If the business is outside the GTA, you must create at least one job for Canadian citizens or permanent residents.
+ - If the business will be involved in Information Communications Technology or Digital Communications anywhere in the province, you must create at least one job for Canadian citizens or permanent residents.
+
+
+
+****New Brunswick The New Brunswick Provincial Nominee Program operates an Entrepreneurial Stream and Post-Graduate Entrepreneurial Stream aimed at professionals and graduates from New Brunswick institutions.
+
+### Entrepreneurial Stream Requirements
+
+- Have an eligible connection to New Brunswick.
+- Be aged between 22 and 55.
+- Minimum of two years post-secondary education degree or diploma.
+- Score at least level 5 on the Canadian Language Benchmark exam for speaking, listening, reading and writing in English or French.
+- Have completed at least two years of full-time post-secondary education.
+- The legally-acquired personal net worth of at least $600,000, of which $300,000 must be available in unencumbered liquidity.
+- Invest at least $250,000 in a New Brunswick business, taking ownership of at least 33 percent.
+- Sign a Business Performance Agreement with the New Brunswick provincial government and pay a deposit of $100,000.
+- Business must create significant economic benefits to New Brunswick.
+- Show business experience – either three years of ownership or five years of senior management experience in the last five years.
+- Submit a business concept of 1,000 to 1,500 words.
+- Conduct an exploratory visit to New Brunswick, or participate in an information session offered by the New Brunswick provincial government.
+- Intend to live permanently in New Brunswick.
+
+---
+
+Post-Graduate Entrepreneurial Stream Requirements
+
+- Be aged between 22 and 40.
+- Score at least level 7 on the Canadian Language Benchmark for speaking, listening, reading and writing in English or French.
+- Have completed at least two years of full-time post-secondary education at a recognized New Brunswick university or community college.
+- Have lived in New Brunswick for the duration of the course (distance-learning courses do not qualify).
+- Have 100 percent owned and operated a business for one full year.
+- Have a valid Post-Graduation Work Permit.
+- Intend to live permanently in New Brunswick.
+
+Read more >>
+
+****Prince Edward Island The Prince Edward Island Impact Category issues permanent residence to entrepreneurs who have established a business in the province.
+
+The Work Permit Stream operates on a two-stage basis:
+
+1. Candidates come to Canada on a temporary work permit and establish their business.
+2. Candidates are nominated for permanent residence once their business is established and the terms of an agreement met.
+
+Previously, the province operated direct permanent residence business streams, but these were closed in September 2018 over immigration fraud concerns.
+
+Read More >>
+
+****North West Territories The North West Territories Business Stream is aimed at entrepreneurs with business expertise and investment capital, who wish to purchase or start a business in the region.
+
+Northwest Territories Business Stream: Requirements
+
+- Invest: - A minimum of $300,000 equity into starting or buying a business within the corporate boundaries of Yellowknife, NWT, **or**
+ - A minimum of $150,000 equity into starting or buying a business outside of the corporate boundaries of Yellowknife, NWT.
+
+
+- Have a personal net worth of: - At least $500,000 if starting or buying a business within the corporate boundaries of Yellowknife, NWT, **or**
+ - At least $250,000 if starting or buying a business outside the corporate boundaries of Yellowknife, NWT.
+
+
+
+Read more >>
+
+****Yukon Yukon Business Nominee Program allows entrepreneurs to own and operate their business in Yukon.
+
+Candidates initially come to Yukon on a two-year work permit, before being nominated for permanent residence if they successfully establish their business.
+
+Yukon Business Nominee Program: Requirements
+
+- The legally-acquired net worth of at least $500,000, documented and verified by a Yukon accounting firm.
+- Legally-acquired minimum of $300,000 in liquid assets, documented and verified by a Yukon accounting firm.
+- Invest at least $300,000 in capital investments for the business in the first 2 years. - This does not include any capital investments made before acceptance into the Yukon Business Nominee Program.
+ - Capital investments include purchases such as property or equipment. It does not include purchases such as a house, vehicles that are only partially for the business and operational or maintenance expenses.
+
+
+
+Read more >>
+
+
+Advertisement #### Colin R. Singer
+
+- Tags: Business , Canada , entrepreneur immigration , Provincial , Provincial Entrepreneur Programs , Provincial Nominee Programs
+
+**Share on facebook **Share on twitter **Share on linkedin **Share on whatsapp **Share on pinterest **Share on reddit **Share on email ### Related articles
+
+##### Quebec Entrepreneur Program
+
+Read More » Colin R. Singer January 26, 2022 ##### Start-Up Visa Program
+
+Read More » Colin R. Singer March 9, 2022 Business Immigration - Start-Up Visa Program
+- How to Apply for Canada’s Start-Up Visa from India
+- Quebec Immigrant Investor Program (QIIP)
+- Quebec Entrepreneur Program
+- Quebec Business Immigration
+- Buy a Business & Move to Canada
+- Provincial Entrepreneur Programs
+- Self-Employed Visa Canada: Your Path to Canadian Residency
+- International Business Immigration Programs
+
+Permanent Residence - Express Entry
+- Express Entry Immigration Draws
+- Skilled Worker Immigration
+- Quebec Immigration
+- Business & Investment Immigration
+- Sponsorship Immigration
+- Provincial Immigration
+- Refugee Immigration
+- Skilled Trades Immigration
+- How a Caregiver Can Apply For Canadian Permanent Residence
+- Canada Citizenship
+- Analyzing Citizenship Bill C-6 (Video)
+- What Settlement Funds Do I Need?
+- Canada Immigration FAQ
+- Government of Canada Fee Schedule
+- Canada Immigration Applications Processing times
+- Rural and Northern Immigration Pilot
+
+Subscribe to our Latest Newsletter Latest News - Canadian CV guide – dos and don’ts for 2025: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+November 28, 2024
+- What to Expect From Canada’s Start-Up Visa Program in 2025
+December 23, 2024
+- Canadian CV checklist: Check out True North, immigration.ca’s weekly career coaching newsletter for newcomers
+December 23, 2024
+- Manitoba Issues 399 Canada Immigration Invitations In New PNP Draw
+December 23, 2024
+- Celebrate the holidays in Canadian style: Check out Oh Canada, immigration.ca’s weekly culture and lifestyle newsletter for newcomers
+December 20, 2024
+- Canada The Top Destination for International Job Seekers, Report Says
+December 20, 2024
+- Prince Edward Island PNP Draw: Province Issues 33 Skilled Worker And Business Invitations
+December 20, 2024
+
+## Useful Links
+
+- **Free Immigration to Canada Evaluation
+- **Sign-up for Canadian Immigration Newsletters
+- **Canadian Citizenship Requirements
+- **Canada Work Visa – Work in Canada
+- **Canada Visitor Visa Guide
+- **12 Ways You Can Immigrate To Canada
+
+## Help
+
+- **Book an Immigration Consultation
+- **Contact Us
+- **Disclaimer
+- **Privacy Policy
+- **Fraud alert
+
+Linkedin **Facebook **Instagram **Youtube **Twitter **Podcast **Go to Top
+
+Document 6:
+HTML [if lt IE 7]>
+
+
+
+
+ Search for: UberMenu [Configuration:main] [Theme Loc:primary_navigation] [Integration:auto] **Main Menu - Immigration to Canada - Federal Skilled Worker Program - 50 Eligible Occupations
+ - Arranged Employment
+ - Permanent Job Offer
+ - The Six Selection Factors
+ - Sufficient Settlement
+ - Medical Examination
+ - Security Clearance
+ - Processing Times
+ - The Process
+
+Canadian Experience Class Federal Skilled Trades Express Entry
+ - Provincial Nominee Program - Newfoundland
+ - Nova Scotia
+ - Prince Edward Island
+ - New Brunswick
+ - Ontario
+ - Manitoba
+
+ - Saskatchewan
+ - Alberta
+ - British Columbia
+ - Yukon
+ - Northwest Territories
+
+Family Class Sponsorship Program - Spousal
+ - Parent and Grandparent Sponsorship
+ - Parent and Grandparent Super Visa
+ - Dependent Child and Other Family Sponsorship
+
+
+ - Investors, Entrepreneurs and Self-Employed - Immigrant Investor Program
+ - Federal Entrepreneur Program
+ - Self-Employed Persons Program
+ - Start-Up Visa Program
+
+Quebec Immigration - Quebec Experience Class
+ - Quebec Skilled Worker
+ - Quebec Investor Program
+ - Quebec Entrepreneur Program
+ - Quebec Family Sponsorship
+ - Quebec Self-Employed Worker Program
+
+
+
+
+- Working in Canada - NAFTA Work Permits - NAFTA Investor Work Permit
+ - NAFTA Intra-Company Transfer
+ - NAFTA Professional (TN Visa)
+
+Work Holiday Visa
+ - Work Permit Canada Labour Market Impact Assessment (LMIA) - LMIA Exemptions
+
+Post-Graduation Work Permit
+ - Salary Calculator Job Search Tool Work Permit to Permanent Residency
+
+
+- Business / Investor - Federal Programs - Federal Entrepreneur Program
+ - Federal Investor Program
+ - Federal Self-Employed Program
+ - Federal Start-Up Visa
+
+
+ - Provincial Nominee Program - Alberta Self-Employed Farmer Stream
+ - British Columbia Business Immigration Component
+ - New Brunswick Business Applicants
+ - Ontario Business Investor Stream + Individual Investor Stream
+ - Prince Edward Island Business Impact Category
+ - Yukon Business Program
+ - Northwest Territories Entrepreneur Stream
+ - Northwest Territories Self-Employed Stream
+
+
+ - Quebec Programs - Quebec Investor Program
+ - Quebec Entrepreneur Program
+ - Quebec Self-Employed Program
+
+
+
+
+- Inadmissibility - Removal Orders
+ - Medical Inadmissibility
+ - Criminal Inadmissibility
+ - Criminal Rehabilitation Application
+ - Temporary Resident Permit
+ - Deemed Rehabilitation
+ - Assault Convictions
+ - Entering Canada With DUI
+
+
+- Study in Canada - Study Permit Canada
+ - Work While You Study In Canada
+ - Study Permit to Permanent Resident
+ - Canada School Finder
+
+
+
+End UberMenu - **
+- **
+- **
+- **
+- **
+
+### Opportunity Lives Here
+
+**Share This # Federal Entrepreneur Program
+
+## Business Immigration To Canada
+
+This Program Has Been Permanently Closed
+
+The Canadian immigration Entrepreneur Program is designed to attract experienced entrepreneurs who intend to own and actively manage a business in Canada. This Canadian immigration program aims to grow the Canadian economy while also creating new jobs for Canadian citizens and Canadian permanent residents. It should be noted that entrepreneurs intending to live in Quebec are not eligible under this program and should apply under the Quebec Entrepreneur Program.
+
+Once approved under the Federal Entrepreneur program, the investor along with his or her immediate family, can then apply for their Canadian permanent visas. Applicants must either establish a new business or acquire at least 33.3% equity in an existing and qualified Canadian business (in which the applicant must actively manage). The business must also create at least one new employment position for a Canadian citizen or Canadian permanent resident.
+
+### Eligibility Requirements:
+
+1. The applicant’s intended destination is anywhere in Canada, except Quebec (see Quebec Entrepreneur Program);
+
+
+2. The applicant must have a minimum net worth of $300,000 CAD, that has been legally obtained;
+
+
+3. The applicant must have sufficient business experience. This can be demonstrated by having previously managed and owned a qualified business;
+
+
+4. The applicant, or his accompanying family members, must not be found inadmissible for medical or security reasons.
+
+
+
+/.main ### Get Your FreeImmigration Assessment
+
+Online Now
+
+### How can we help?
+
+Call **1 (855) 360-4333**
+or Submit Below #### 24 Hour
+
+Response time
+
+
+
+
+
+
+
+
+
+
+Δ
+
+### Immigration Overview
+
+- Federal Skilled Worker Program - Permanent Job Offer
+ - Arranged Employment
+ - The Process
+ - The 50 Eligible Occupations
+ - Education
+ - Language Skills
+ - Work Experience
+ - Age
+ - Adaptability
+ - Sufficient Settlement Funds – Federal Skilled Workers
+ - Medical Examinations
+ - Security Clearance
+ - Processing Times
+
+
+- Federal Skilled Trades
+- Canadian Experience Class (CEC)
+- Family Class Sponsorship Program - Spousal Sponsorship
+ - Parent and Grandparent Super Visa
+ - Parent and Grandparent Sponsorship
+ - Dependent Child Sponsorship
+
+
+- Provincial Nominee Program - The Newfoundland And Labrador Provicinal Nominee Program – NLPNP - NLPNP – International Graduate Category
+ - NLPNP – Skilled Worker Category
+
+
+ - Nova Scotia Provincial Nominee Program – NS PNP - Nova Scotia PNP “Regional Labour Market Demand” Stream
+ - “Family Business Worker” Stream – NS PNP
+ - The Nova Scotia PNP “Agri-Food Sector Stream” – Canada Immigration
+ - The Nova Scotia PNP “International Graduate Stream” – Canada Immigration
+ - The Nova Scotia PNP “Non-dependent Child” Stream – Canada Immigration
+ - Nova Scotia PNP “Skilled Worker” Stream
+
+
+ - Prince Edward Island Immigration - Business Impact Category
+ - PEI PNP Labour Impact Category
+
+
+ - New Brunswick Provincial Nominee Program - Skilled Worker Applicants with Family Support Category
+ - Skilled Worker Applicants with Employer Support Category
+ - Business Applicant Category
+
+
+ - Ontario Provincial Nominee Program - Employer Pre-Screening Applications
+ - Employers / Foreign Worker Stream
+ - Business Investor Stream and Individual Investor Stream
+ - International Student Category"""
+ ]
+ answer = \
+"""Here's a detailed report about the current Canadian and American immigration laws for entrepreneurs:
+
+**Canada**
+
+Canada offers several pathways for entrepreneurs seeking to immigrate and establish businesses, both at the federal and provincial levels.
+
+**Federal Programs:**
+
+1. **Start-Up Visa Program:**
+ * **Overview:** This program targets immigrant entrepreneurs with innovative business ideas who can secure support from designated Canadian organizations.
+ * **Requirements:**
+ * **Qualifying Business:** The proposed business must be innovative, scalable, and able to create jobs in Canada.
+ * **Support from Designated Organization:** Applicants need a letter of support from a designated venture capital fund (minimum CAD 200,000 investment), angel investor group (minimum CAD 75,000 investment), or acceptance into a business incubator program.
+ * **Language Proficiency:** Minimum Canadian Language Benchmark (CLB) level 5 in English or French.
+ * **Settlement Funds:** Proof of sufficient funds to support themselves and their families upon arrival in Canada.
+ * **Ownership:** Each applicant must hold 10% or more of the voting rights, and the designated organization and applicants together must hold more than 50% of the total voting rights.
+ * **Process:**
+ 1. Secure support from a designated organization.
+ 2. Submit an online application for permanent residence.
+ 3. Apply for a temporary work permit to start building the business in Canada while the permanent residence application is processed.
+ * **Benefits:**
+ * Direct path to permanent residence.
+ * Up to five entrepreneurs can apply as part of the same business.
+ * Access to Canada's business ecosystem and support networks.
+
+2. **Self-Employed Persons Program:**
+ * **Overview:** This program is for individuals with relevant experience in cultural activities or athletics who intend to be self-employed in Canada.
+ * **Requirements:**
+ * **Relevant Experience:** At least two years of self-employment or participation at a world-class level in cultural activities or athletics.
+ * **Intention and Ability:** Demonstrate the intention and ability to be self-employed in Canada and make a significant contribution to specified economic activities.
+ * **Selection Criteria:** Applicants are assessed based on education, experience, age, language ability, and adaptability.
+
+**Provincial Entrepreneur Programs:**
+
+Most Canadian provinces and territories offer entrepreneur programs under their Provincial Nominee Programs (PNPs). These programs vary in requirements but generally involve:
+
+1. **Expression of Interest:** Submitting a profile to the province indicating interest in starting a business.
+2. **Invitation to Apply:** If selected, the province invites the applicant to submit a full application.
+3. **Business Establishment:** Upon approval, the applicant typically receives a temporary work permit to establish and operate the business in the province.
+4. **Nomination for Permanent Residence:** After meeting the terms of a performance agreement (e.g., investment, job creation, business operation period), the province nominates the applicant for permanent residence.
+
+**Key Provincial Programs:**
+
+* **British Columbia:** Entrepreneur Immigration, Regional Pilot, Strategic Projects.
+* **Alberta:** Farm Stream, Foreign Graduate Entrepreneur Stream, Graduate Entrepreneur Stream, Rural Entrepreneur Stream.
+* **Saskatchewan:** Entrepreneur Stream, International Graduate Entrepreneur Stream.
+* **Manitoba:** Business Investor Stream (Entrepreneur Pathway and Farm Investor Pathway).
+* **Nova Scotia:** Entrepreneur Stream, International Graduate Entrepreneur Stream.
+* **Ontario:** No longer operates a business immigration program.
+* **New Brunswick:** Entrepreneurial Stream, Post-Graduate Entrepreneurial Stream.
+* **Prince Edward Island:** Work Permit Stream.
+* **Northwest Territories:** Business Stream.
+* **Yukon:** Business Nominee Program.
+
+**Quebec:**
+
+Quebec has its own immigration programs, including:
+
+1. **Quebec Immigrant Investor Program:** Requires a passive investment of CAD 1.2 million and a net worth of CAD 2 million.
+2. **Quebec Entrepreneur Program:** Two streams, one for starting innovative businesses with support from an accelerator/incubator, and another for acquiring and operating a business in Quebec.
+3. **Quebec Self-Employed Program:** For individuals with a net worth of CAD 100,000 who intend to create their own employment in Quebec.
+
+**United States**
+
+The US offers several visa options for entrepreneurs, although there is no dedicated "startup visa" like Canada's.
+
+**Nonimmigrant (Temporary) Visas:**
+
+1. **E-2 Treaty Investor Visa:**
+ * **Overview:** For nationals of countries with a treaty of commerce and navigation with the US, who invest a substantial amount of capital in a US business.
+ * **Requirements:**
+ * Substantial investment (no specific minimum, but typically at least USD 100,000).
+ * The business must be a real, operating enterprise.
+ * The investor must have at least 50% ownership or operational control.
+ * The investment must be "at risk."
+ * **Benefits:**
+ * Renewable indefinitely as long as the business continues to operate.
+ * Spouses can obtain work authorization.
+
+2. **L-1 Intracompany Transferee Visa:**
+ * **Overview:** For executives, managers, or specialized knowledge employees of a foreign company transferring to a US affiliate, parent, subsidiary, or branch.
+ * **Requirements:**
+ * The employee must have worked for the foreign company for at least one year within the preceding three years.
+ * The US company must have a qualifying relationship with the foreign company.
+ * The employee must be coming to the US in a managerial, executive, or specialized knowledge capacity.
+ * **Benefits:**
+ * Can lead to a green card through the EB-1C category.
+ * Spouses can obtain work authorization.
+
+3. **H-1B Specialty Occupation Visa:**
+ * **Overview:** For professionals in specialty occupations that require a bachelor's degree or higher.
+ * **Requirements:**
+ * Job offer from a US employer.
+ * The position must require a degree in a specific field.
+ * The applicant must possess the required degree or equivalent.
+ * **Challenges for Entrepreneurs:**
+ * Subject to an annual cap and lottery.
+ * Difficult for entrepreneurs to demonstrate an employer-employee relationship if they own a significant portion of the company.
+
+4. **O-1 Extraordinary Ability Visa:**
+ * **Overview:** For individuals with extraordinary ability in the sciences, arts, education, business, or athletics.
+ * **Requirements:**
+ * Demonstrated extraordinary ability through sustained national or international acclaim.
+ * Extensive documentation of achievements.
+ * **Benefits:**
+ * No annual cap.
+ * Can be a good option for highly accomplished entrepreneurs.
+
+5. **International Entrepreneur Rule (IER):**
+ * **Overview:** Allows foreign entrepreneurs to be paroled into the US to build and grow their startup companies.
+ * **Requirements:**
+ * Substantial ownership interest (at least 10%) in a US startup formed within the past five years.
+ * Central and active role in the company.
+ * Significant investment from qualified US investors (at least USD 250,000) or government grants (at least USD 100,000).
+ * **Status:** The IER has faced legal challenges and its future is uncertain.
+
+**Immigrant (Permanent) Visas:**
+
+1. **EB-5 Immigrant Investor Program:**
+ * **Overview:** Provides a path to permanent residence for foreign investors who invest in a new commercial enterprise that creates jobs for US workers.
+ * **Requirements:**
+ * Investment of USD 1.8 million (or USD 900,000 in a targeted employment area).
+ * Creation of at least 10 full-time jobs for US workers.
+ * **Benefits:**
+ * Leads to a green card.
+ * Can invest in own business or through a regional center.
+
+2. **EB-1C Multinational Executive or Manager:**
+ * **Overview:** For executives or managers of multinational companies transferring to the US.
+ * **Requirements:**
+ * Similar to L-1A but leads to permanent residence.
+ * The US company must have been doing business for at least one year.
+
+3. **EB-2 National Interest Waiver (NIW):**
+ * **Overview:** For individuals with advanced degrees or exceptional ability whose work is deemed to be in the national interest of the US.
+ * **Requirements:**
+ * Advanced degree or exceptional ability.
+ * The proposed endeavor has substantial merit and national importance.
+ * The applicant is well-positioned to advance the endeavor.
+ * It would be beneficial to the US to waive the job offer requirement.
+ * **Benefits:**
+ * Self-petition is allowed (no employer sponsor needed).
+ * Can be a good option for entrepreneurs whose work benefits the US.
+
+**Conclusion:**
+
+Both Canada and the US offer various pathways for immigrant entrepreneurs. Canada's Start-Up Visa Program provides a direct route to permanent residence, while the US offers a range of nonimmigrant and immigrant visa options, each with its own set of requirements and benefits. Entrepreneurs should carefully consider their individual circumstances, business goals, and long-term plans when choosing the most suitable option. Consulting with an experienced immigration attorney is highly recommended to navigate the complexities of the immigration process.
+"""
+ start = time.perf_counter()
+ response = asyncio.run(evaluator.evaluate_response(
+ "Give me a very detailed report about the current Canadian and American immigration laws for entrepreneurs",
+ answer,
+ context,
+ include_metrics=["faithfulness", "answer relevancy", "contextual relevancy", "contextual recall"]
+ ))
+ print(response)
+ end = time.perf_counter()
+ print(f"Time taken: {end - start} seconds")
+ for metric, data in response.items():
+ print(f"{metric.title()}: {data['score']}")
+ print(f"Reason: {data['reason']}")
+ print("-"*50)
+
+ satisfactory = evaluator.is_satisfactory(
+ response,
+ include_metrics=["bias", "toxicity", "summarization", "hallucination", "answer correctness"],
+ # exclude_metrics=["bias", "toxicity", "faithfulness", "contextual recall"],
+ thresholds=[0.3, 0.3, 0.9, 0.0, 0.9]
+ )
+ print(f"Satisfactory: {satisfactory}")
+ should_respond = evaluator.should_respond(satisfactory)
+ print(should_respond)
diff --git a/src/evaluation/wrapper/__init__.py b/src/evaluation/wrapper/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/evaluation/wrapper/langchain_wrapper.py b/src/evaluation/wrapper/langchain_wrapper.py
new file mode 100644
index 0000000000000000000000000000000000000000..e0ed658cfc27fb3f901ba36da5f7c5e0f44b0789
--- /dev/null
+++ b/src/evaluation/wrapper/langchain_wrapper.py
@@ -0,0 +1,120 @@
+import os
+import json
+from typing import Any, Tuple
+from deepeval.models.base_model import DeepEvalBaseLLM
+from src.evaluation.writer.agent_write import create_workflow_sync, create_workflow_async
+from src.utils.api_key_manager import with_api_manager
+from src.helpers.helper import remove_markdown
+from dotenv import load_dotenv
+
+class LangChainWrapper(DeepEvalBaseLLM):
+ def __init__(self):
+ # Load environment variables from .env file
+ load_dotenv()
+
+ # Initialize model name from environment variable
+ self.model_name = os.getenv("MODEL_NAME")
+
+ # Method to invoke the LLM synchronously
+ def _invoke_llm_sync(self, prompt: Any) -> Tuple[str, float]:
+ @with_api_manager(temperature=0.0, top_p=1.0)
+ def _inner_invoke_sync(*args, **kwargs):
+ response = kwargs['llm'].invoke(prompt)
+ raw_text = response.content.strip()
+ return raw_text
+
+ raw_text = _inner_invoke_sync()
+ return raw_text
+
+ # Method to invoke the LLM asynchronously
+ async def _invoke_llm_async(self, prompt: Any) -> Tuple[str, float]:
+ @with_api_manager(temperature=0.0, top_p=1.0)
+ async def _inner_invoke_async(*args, **kwargs):
+ response = await kwargs['llm'].ainvoke(prompt)
+ raw_text = response.content.strip()
+ return raw_text
+
+ raw_text = await _inner_invoke_async()
+ return raw_text
+
+ # Method to parse text as a schema
+ def _parse_as_schema(self, raw_text: str, schema: Any) -> Any:
+ cleaned_text = remove_markdown(raw_text)
+ data = json.loads(cleaned_text)
+
+ # Try to parse data as schema
+ try:
+ return schema(**data)
+ except Exception:
+ print(f"Failed to parse data for schema: {schema}")
+ raise
+
+ # Method to generate text synchronously
+ def generate(self, prompt: Any, schema: Any = None) -> str:
+ raw_text = self._invoke_llm_sync(prompt)
+
+ if schema is not None:
+ try:
+ parsed_obj = self._parse_as_schema(raw_text, schema)
+ return parsed_obj
+ except json.JSONDecodeError as e:
+ print(f"Failed to parse JSON data: {e}\nUsing LangGraph fallback...")
+
+ input = {
+ "initial_prompt": prompt,
+ "plan": "",
+ "write_steps": [],
+ "final_json": ""
+ }
+ app = create_workflow_sync()
+ final_state = app.invoke(input)
+ output = remove_markdown(final_state['final_json'])
+
+ try:
+ data = json.loads(output)
+ return data
+ except json.JSONDecodeError as e:
+ raise Exception(f"Cannot parse JSON data: {e}")
+ else:
+ return raw_text
+
+ # Method to generate text asynchronously
+ async def a_generate(self, prompt: Any, schema: Any = None) -> str:
+ raw_text = await self._invoke_llm_async(prompt)
+
+ if schema is not None:
+ try:
+ parsed_obj = self._parse_as_schema(raw_text, schema)
+ return parsed_obj
+ except json.JSONDecodeError as e:
+ print(f"Failed to parse JSON data: {e}\nUsing LangGraph fallback...")
+
+ input = {
+ "initial_prompt": prompt,
+ "plan": "",
+ "write_steps": [],
+ "final_json": ""
+ }
+ app = create_workflow_async()
+ final_state = await app.ainvoke(input)
+ output = remove_markdown(final_state['final_json'])
+
+ try:
+ data = json.loads(output)
+ return data
+ except json.JSONDecodeError as e:
+ raise Exception(f"Cannot parse JSON data: {e}")
+ else:
+ return raw_text
+
+ # Method to get the model name
+ def get_model_name(self) -> str:
+ return f"LangChainWrapper for {self.model_name}"
+
+ # Method to load the model
+ def load_model(self, *, llm: Any):
+ @with_api_manager(temperature=0.0, top_p=1.0)
+ def inner_load_model(*args, **kwargs):
+ return llm
+
+ return inner_load_model()
\ No newline at end of file
diff --git a/src/evaluation/writer/__init__.py b/src/evaluation/writer/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/evaluation/writer/agent_write.py b/src/evaluation/writer/agent_write.py
new file mode 100644
index 0000000000000000000000000000000000000000..a69d4a9d5c90fb923ce9675501d43e17a1225c30
--- /dev/null
+++ b/src/evaluation/writer/agent_write.py
@@ -0,0 +1,255 @@
+import json
+import asyncio
+from typing import List
+from typing_extensions import TypedDict
+from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
+from langgraph.graph import StateGraph, END
+from src.utils.api_key_manager import with_api_manager
+from src.helpers.helper import remove_markdown
+
+# Define the Graph State
+class GraphState(TypedDict):
+ initial_prompt: str
+ plan: str
+ write_steps: List[dict]
+ final_json: str
+
+@with_api_manager(temperature=0.0, top_p=1.0)
+def planning_node(state: GraphState, *, llm) -> GraphState:
+ print("\n---PLANNING---\n")
+
+ initial_prompt = state['initial_prompt']
+
+ plan_template = \
+f"""You need to create a structured JSON based on the following instructions:
+{initial_prompt}
+
+Rules:
+1. Outline a multi-step plan (one step per line) that will guide the creation of the final JSON.
+2. You must create the entire plan yourself without asking others to create it for you.
+2. The steps should be as follows:
+ - Each step should be a high-level task or section of the JSON.
+ - Check if breaking down each step into smaller, low-level sub-tasks or sections is required
+ - If yes, ONLY include the sub-steps (one sub-step per line).
+3. The plan should be concise and clear, and each step and sub-step should be distinct.
+4. The plan should be unformatted and in plain text. DO NOT even use bullet points or new lines.
+4. The number of steps should be as less as possible, but still enough to cover ALL sections.
+5. If the user request contains any specific details, include them in the plan.
+6. DO NOT create the final content, just the plan/outline.
+7. DO NOT include any markdown or formatting in the plan."""
+
+ chat_template = ChatPromptTemplate.from_messages([
+ HumanMessagePromptTemplate.from_template("{text}"),
+ ]
+ )
+ prompt = chat_template.invoke({"text": plan_template})
+
+ response = llm.invoke(prompt)
+ plan = response.content.strip()
+
+ # Store plan text in state
+ state['plan'] = remove_markdown(plan)
+ print(plan)
+ return state
+
+@with_api_manager(temperature=0.0, top_p=1.0)
+def writing_node_sync(state: GraphState, *, llm) -> GraphState:
+ print("\n---WRITING THE JSON---\n")
+
+ initial_prompt = state['initial_prompt']
+ plan = state['plan']
+ plan = plan.strip()
+
+ # Split the plan by lines
+ plan_lines = plan.split('\n')
+
+ # Our final partial JSON objects
+ partial_jsons: List[dict] = []
+
+ # Return partial JSON.
+ for idx, step_line in enumerate(plan_lines):
+ if len(step_line.strip()) > 0:
+ step_prompt_text = \
+f"""You are creating part {idx+1} of the final JSON document.
+User request:
+{initial_prompt}
+
+Plan step (outline):
+{step_line.strip()}
+
+Rules:
+1. You need to write the JSON data for this step.
+2. The JSON should be structured and valid.
+3. If the user request contains any specific details, include them in the JSON.
+4. If the user request contains the format of the JSON, follow it. If not, create a generic JSON as you see fit.
+5. Respond ONLY with valid JSON for this step without any markdown or formatting."""
+
+ chat_template = ChatPromptTemplate.from_messages([
+ HumanMessagePromptTemplate.from_template("{text}"),
+ ]
+ )
+ prompt = chat_template.invoke({"text": step_prompt_text})
+
+ response = llm.invoke(prompt)
+ step_result = response.content.strip()
+
+ # Attempt to parse the partial JSON
+ try:
+ cleaned_result = remove_markdown(step_result)
+ partial_obj = json.loads(cleaned_result)
+ except json.JSONDecodeError:
+ # If the model didn't produce valid JSON, throw an error
+ raise Exception(f"Failed to parse JSON data for step {idx+1}")
+
+ # print(f"Step {idx+1} JSON:\n{json.dumps(partial_obj, indent=2)}\n")
+
+ # Add the partial JSON to the list
+ partial_jsons.append(partial_obj)
+
+ # Save all partial JSON in the state
+ state['write_steps'] = partial_jsons
+ return state
+
+@with_api_manager(temperature=0.0, top_p=1.0)
+async def writing_node_async(state: GraphState, *, llm) -> GraphState:
+ async def get_partial_json(idx: int, step_line: str) -> dict:
+ step_prompt_text = \
+f"""You are creating part {idx+1} of the final JSON document.
+User request:
+{initial_prompt}
+
+Plan step (outline):
+{step_line.strip()}
+
+Rules:
+1. You need to write the JSON data for this step.
+2. The JSON should be structured and valid.
+3. If the user request contains any specific details, include them in the JSON.
+4. If the user request contains the format of the JSON, follow it. If not, create a generic JSON as you see fit.
+5. Respond ONLY with valid JSON for this step without any markdown or formatting."""
+
+ chat_template = ChatPromptTemplate.from_messages([
+ HumanMessagePromptTemplate.from_template("{text}"),
+ ]
+ )
+ prompt = chat_template.invoke({"text": step_prompt_text})
+
+ response = await llm.ainvoke(prompt)
+ step_result = response.content.strip()
+
+ cleaned_result = remove_markdown(step_result)
+ try:
+ partial_obj = json.loads(cleaned_result)
+ except json.JSONDecodeError as e:
+ raise Exception(f"Failed to parse JSON data for step {idx+1}: {e}")
+
+ # print(f"Step {idx+1} JSON:\n{json.dumps(partial_obj, indent=2)}\n")
+
+ return partial_obj
+
+ print("\n---WRITING THE JSON---\n")
+
+ initial_prompt = state['initial_prompt']
+ plan = state['plan'].strip()
+
+ plan_lines = plan.split('\n')
+ partial_jsons: List[dict] = []
+
+ # Build tasks for each step
+ tasks = []
+ for idx, line in enumerate(plan_lines):
+ if len(line.strip()) > 0:
+ tasks.append(asyncio.create_task(get_partial_json(idx, line)))
+
+ # Run them concurrently
+ partial_jsons = await asyncio.gather(*tasks)
+
+ # Store results
+ state['write_steps'] = list(partial_jsons)
+ return state
+
+def consolidation_node(state: GraphState) -> GraphState:
+ print("\n---CONSOLIDATING THE JSON---\n")
+
+ plan = state['plan']
+ partial_jsons = state['write_steps']
+
+ final_obj = {
+ "plan": plan,
+ "steps": partial_jsons
+ }
+
+ # Convert to string
+ final_json_str = json.dumps(final_obj, ensure_ascii=False, indent=2)
+
+ # Store it in the state
+ state['final_json'] = final_json_str
+ return state
+
+def create_workflow_sync() -> StateGraph:
+ workflow = StateGraph(GraphState)
+
+ # Add nodes
+ workflow.add_node("planning_node", planning_node)
+ workflow.add_node("writing_node", writing_node_sync)
+ workflow.add_node("consolidation_node", consolidation_node)
+
+ # Set entry point
+ workflow.set_entry_point("planning_node")
+
+ # Add edges
+ workflow.add_edge("planning_node", "writing_node")
+ workflow.add_edge("writing_node", "consolidation_node")
+ # Finally, consolidation_node leads to END
+ workflow.add_edge("consolidation_node", END)
+
+ return workflow.compile()
+
+def create_workflow_async() -> StateGraph:
+ workflow = StateGraph(GraphState)
+
+ # Add nodes
+ workflow.add_node("planning_node", planning_node)
+ workflow.add_node("writing_node", writing_node_async)
+ workflow.add_node("consolidation_node", consolidation_node)
+
+ # Set entry point
+ workflow.set_entry_point("planning_node")
+
+ # Add edges
+ workflow.add_edge("planning_node", "writing_node")
+ workflow.add_edge("writing_node", "consolidation_node")
+ # Finally, consolidation_node leads to END
+ workflow.add_edge("consolidation_node", END)
+
+ return workflow.compile()
+
+if __name__ == "__main__":
+ import time
+
+ test_instruction = "Write a 1500-word piece on the HBO TV show Westworld, covering major characters, \
+themes of AI and consciousness, and how the story might have continued had it not been cancelled. \
+Include specific details, quotes, and references to the show and its creators.\
+Do not include any spoilers for the climax of the show's final season."
+
+ app = create_workflow_async()
+ # We supply an initial state.
+ # (We only need 'initial_prompt' here; the other fields will be set by nodes.)
+ state_input: GraphState = {
+ "initial_prompt": test_instruction,
+ "plan": "",
+ "write_steps": [],
+ "final_json": ""
+ }
+ start = time.time()
+ final_state = asyncio.run(app.ainvoke(state_input))
+ end = time.time()
+
+ # The final JSON is in final_state['final_json']
+ print("\n===== FINAL JSON OUTPUT =====\n")
+ print(final_state['final_json'])
+ print("=============================\n")
+
+ print("\n===== PERFOMANCE =====\n")
+ print(f"Time taken: {end-start:.2f} seconds")
+ print("======================\n")
diff --git a/src/helpers/helper.py b/src/helpers/helper.py
new file mode 100644
index 0000000000000000000000000000000000000000..353233059feb98a92f96e63ff208ede8ace208e8
--- /dev/null
+++ b/src/helpers/helper.py
@@ -0,0 +1,181 @@
+import os
+import re
+import gc
+import torch
+import transformers
+from langchain.text_splitter import RecursiveCharacterTextSplitter, TokenTextSplitter
+
+ENV_FILE_PATH = os.path.join(os.path.dirname(__file__), "../../.env").replace("\\", "/")
+
+def remove_markdown(text: str) -> str:
+ # Remove code block format type and the code block itself
+ text = re.sub(r'```[a-zA-Z]*\n', '', text) # Remove the format type line
+ text = re.sub(r'```', '', text) # Remove remaining backticks for code blocks
+
+ # Remove headers
+ text = re.sub(r'^\s*#+\s+', '', text, flags=re.MULTILINE)
+
+ # Remove bold and italic
+ text = re.sub(r'\*\*(.*?)\*\*', r'\1', text)
+ text = re.sub(r'__(.*?)__', r'\1', text)
+ text = re.sub(r'\*(.*?)\*', r'\1', text)
+ text = re.sub(r'_(.*?)_', r'\1', text)
+
+ # Remove strikethrough
+ text = re.sub(r'~~(.*?)~~', r'\1', text)
+
+ # Remove inline code
+ text = re.sub(r'`(.*?)`', r'\1', text)
+
+ # Remove links
+ text = re.sub(r'\[(.*?)\]\((.*?)\)', r'\1', text)
+
+ # Remove images
+ text = re.sub(r'!\[(.*?)\]\((.*?)\)', '', text)
+
+ # Remove blockquotes
+ text = re.sub(r'^\s*>\s+', '', text, flags=re.MULTILINE)
+
+ # Remove lists
+ text = re.sub(r'^\s*[\*\+-]\s+', '', text, flags=re.MULTILINE)
+ text = re.sub(r'^\s*\d+\.\s+', '', text, flags=re.MULTILINE)
+
+ # Remove horizontal lines
+ text = re.sub(r'^\s*[-*_]{3,}\s*$', '', text, flags=re.MULTILINE)
+
+ # Remove any remaining markdown symbols
+ text = re.sub(r'[*_~`]', '', text)
+
+ return text.strip()
+
+def clear_gpu_memory():
+ # Clear GPU memory and cache if available
+ if torch.cuda.is_available():
+ try:
+ print("Starting the GPU memory cleanup process...")
+ # Clear CUDA cache
+ torch.cuda.empty_cache()
+ # Reset all GPU memory
+ device_count = torch.cuda.device_count()
+ print(f"Number of GPUs: {device_count}")
+ for device_id in range(device_count):
+ print(f"Clearing GPU memory and cache for device {device_id}...")
+ # Set current device before operations
+ torch.cuda.set_device(device_id)
+ torch.cuda.reset_peak_memory_stats(torch.cuda.current_device())
+ torch.cuda.empty_cache()
+ # Force clear any allocated tensors
+ torch.cuda.synchronize()
+ torch.cuda.ipc_collect()
+ except Exception as e:
+ raise Exception(f"Error clearing GPU memory and cache: {e}")
+
+def clear_memory():
+ # Delete all tensors and models
+ print("Deleting all tensors and models...")
+ for obj in gc.get_objects():
+ try:
+ if torch.is_tensor(obj):
+ del obj
+ elif isinstance(obj, transformers.PreTrainedModel) or \
+ isinstance(obj, transformers.tokenization_utils_base.PreTrainedTokenizerBase) or \
+ "SentenceTransformer" in str(type(obj)):
+
+ model_name = "" # Initialize model name
+ if hasattr(obj, "name_or_path"):
+ model_name = obj.name_or_path
+ elif hasattr(obj, "config") and hasattr(obj.config, "_name_or_path"):
+ model_name = obj.config._name_or_path
+ else:
+ model_name = str(type(obj)) # Fallback to type if name is not found
+
+ print(f"Deleting model: {model_name}") # Log the model name
+ del obj
+ except Exception as e:
+ print(f"Error during deletion: {e}")
+
+ gc.collect() # Run garbage collection
+
+# Function to chunk text
+def chunk_text(input_text, max_chunk_length=100, overlap=0, context_length=None):
+ # Use context_length if provided, otherwise use max_chunk_length
+ chunk_size = context_length if isinstance(context_length, int) and context_length > 0 else max_chunk_length
+
+ splitter = RecursiveCharacterTextSplitter(
+ separators=["\n\n", "\n", ". ", " ", ""],
+ chunk_size=chunk_size,
+ chunk_overlap=overlap,
+ length_function=len
+ )
+ chunks = splitter.split_text(input_text)
+
+ token_splitter = TokenTextSplitter(chunk_size=max_chunk_length, chunk_overlap=overlap) \
+ if not context_length else None
+
+ final_chunks = []
+ span_annotations = []
+ current_position = 0
+
+ for chunk in chunks:
+ # If token_splitter exists, use it. Otherwise, use the chunk as is
+ current_chunks = token_splitter.split_text(chunk) if token_splitter else [chunk]
+ final_chunks.extend(current_chunks)
+
+ for tc in current_chunks:
+ span_annotations.append((current_position, current_position + len(tc)))
+ current_position += len(tc)
+
+ return final_chunks, span_annotations
+
+# Function to read .env file
+def read_env():
+ env_dict = {}
+ if not os.path.exists(ENV_FILE_PATH):
+ return env_dict
+
+ with open(ENV_FILE_PATH, "r", encoding="utf-8") as f:
+ for line in f:
+ line = line.strip()
+ if not line or line.startswith("#"):
+ continue
+ if "=" in line:
+ var, val = line.split("=", 1)
+ env_dict[var.strip()] = val.strip()
+ return env_dict
+
+# Function to update .env file
+def update_env_vars(new_values: dict):
+ # Overwrite .env file with new values
+ with open(ENV_FILE_PATH, "w", encoding="utf-8") as f:
+ for var, val in new_values.items():
+ f.write(f"{var}={val}\n")
+
+# Function to prepare provider key updates dictionary
+def prepare_provider_key_updates(provider: str, multiline_keys: str) -> dict:
+ lines = [ln.strip() for ln in multiline_keys.splitlines() if ln.strip()]
+ updates = {}
+
+ if provider == "openai":
+ for i, key in enumerate(lines, start=1):
+ updates[f"OPENAI_API_KEY_{i}"] = key
+ elif provider == "google":
+ for i, key in enumerate(lines, start=1):
+ updates[f"GOOGLE_API_KEY_{i}"] = key
+ elif provider == "xai":
+ for i, key in enumerate(lines, start=1):
+ updates[f"XAI_API_KEY_{i}"] = key
+ elif provider == "anthropic":
+ for i, key in enumerate(lines, start=1):
+ updates[f"ANTHROPIC_API_KEY_{i}"] = key
+
+ return updates
+
+# Function to prepare proxy list dictionary
+def prepare_proxy_list_updates(proxy_list: str) -> list:
+ lines = [proxy.strip() for proxy in proxy_list.splitlines() if proxy.strip()]
+ proxies = {}
+
+ for i, proxy in enumerate(lines, start=1):
+ proxies[f"PROXY_{i}"] = proxy
+
+ return proxies
\ No newline at end of file
diff --git a/src/query_processing/__init__.py b/src/query_processing/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/query_processing/late_chunking/late_chunker.py b/src/query_processing/late_chunking/late_chunker.py
new file mode 100644
index 0000000000000000000000000000000000000000..7f08e3b67ef44d238d616f4a052a1de8e176b33b
--- /dev/null
+++ b/src/query_processing/late_chunking/late_chunker.py
@@ -0,0 +1,276 @@
+import os
+import asyncio
+from concurrent.futures import ThreadPoolExecutor
+from model2vec import StaticModel
+from transformers import AutoConfig
+from sentence_transformers import SentenceTransformer
+import torch
+import numpy as np
+from sklearn.metrics.pairwise import cosine_similarity
+from src.utils.api_key_manager import APIKeyManager
+from src.helpers.helper import chunk_text
+
+class LateChunker:
+ def __init__(
+ self,
+ model_name='minishlab/potion-base-8M',
+ max_workers=os.cpu_count() * 2,
+ verbose=False
+ ):
+ self.verbose = verbose
+
+ self.device = "cuda" if torch.cuda.is_available() else "cpu"
+ self.llm = APIKeyManager().get_llm()
+ self.model_name = model_name
+
+ # Initialize model using the fallback strategy
+ self.model, self.context_length = self._initialize_model()
+
+ # Initialize ThreadPoolExecutor
+ self.executor = ThreadPoolExecutor(max_workers=max_workers)
+
+ def _initialize_model(self):
+ sentence_transformer_error = None
+ model2vec_error = None
+
+ # First attempt: Try SentenceTransformer
+ try:
+ # Get the model config to check max context length
+ config = AutoConfig.from_pretrained(self.model_name)
+ max_length = config.max_position_embeddings
+
+ # Initialize SentenceTransformer model
+ model = SentenceTransformer(self.model_name, trust_remote_code=True)
+ model.max_seq_length = max_length # Set the correct max length
+ model.to(self.device).half()
+ context_length = model.max_seq_length
+ return model, context_length
+ except Exception as e:
+ sentence_transformer_error = str(e)
+
+ # Second attempt: Try Model2Vec
+ try:
+ # Initialize Model2Vec model
+ model = StaticModel.from_pretrained(
+ self.model_name
+ )
+ # Get max sequence length from static model config
+ context_length = model.config['seq_length']
+ return model, context_length
+ except Exception as e:
+ model2vec_error = str(e)
+ error_msg = (
+ f"Failed to load model {self.model_name}.\n"
+ f"SentenceTransformer error: {sentence_transformer_error}\n"
+ f"Model2Vec error: {model2vec_error}"
+ )
+ raise Exception(error_msg) from e
+
+ async def late_chunking(self, text, span_annotations, current_chunk_idx=None, total_chunks=None):
+ print(f"Processing chunk {current_chunk_idx+1}/{total_chunks}...") \
+ if self.verbose else None
+
+ # Get the current running event loop
+ loop = asyncio.get_running_loop()
+
+ # Generate chunk embeddings
+ chunk_embeddings = []
+ for start, end in span_annotations:
+ chunk_text = text[start:end]
+ print("Generating chunk embeddings...") if self.verbose else None
+ chunk_embedding = await loop.run_in_executor(
+ self.executor,
+ lambda: torch.tensor(
+ self.model.encode(
+ chunk_text,
+ convert_to_tensor=True
+ )
+ )
+ )
+ if isinstance(chunk_embedding, torch.Tensor):
+ chunk_embedding = chunk_embedding.clone().detach().to(self.device)
+
+ print(f"Chunk embedding shape: {chunk_embedding.shape}") if self.verbose else None
+ chunk_embeddings.append(chunk_embedding)
+
+ print("Late Chunking applied successfully!") if self.verbose else None
+ return chunk_embeddings if chunk_embeddings else None
+
+ def get_text_embedding(self, text):
+ embeddings = self.model.encode(text, convert_to_tensor=True)
+ if isinstance(embeddings, torch.Tensor):
+ return embeddings.clone().detach().to(self.device)
+ return torch.tensor(embeddings).to(self.device)
+
+ def calculate_embedding_similarities(self, text1_embedding, text2_embedding):
+ text1_embedding = text1_embedding.cpu().numpy()
+ text2_embedding = text2_embedding.cpu().numpy()
+
+ if text1_embedding.ndim == 1:
+ text1_embedding = text1_embedding.reshape(1, -1)
+ if text2_embedding.ndim == 1:
+ text2_embedding = text2_embedding.reshape(1, -1)
+
+ if text1_embedding.shape[1] != text2_embedding.shape[1]:
+ text1_embedding = text1_embedding.T
+ if text2_embedding.shape[1] != text1_embedding.shape[1]:
+ text2_embedding = text2_embedding.T
+
+ return cosine_similarity(text1_embedding, text2_embedding)[0]
+
+ def select_relevant_chunks(self, similarities, chunks, max_tokens):
+ sorted_indices = np.argsort(similarities)[::-1]
+ selected_chunks = []
+ total_tokens = 0
+
+ for i, idx in enumerate(sorted_indices):
+ print(f"Selected chunk {i+1}/{len(sorted_indices)} with similarity {similarities[idx]:.2f}") \
+ if self.verbose else None
+ chunk_tokens = self.llm.get_num_tokens(chunks[idx])
+ print(f"Chunk tokens: {chunk_tokens}") if self.verbose else None
+
+ if total_tokens + chunk_tokens > max_tokens:
+ print(f"Total tokens exceed max tokens allowed ({total_tokens} > {max_tokens}). \
+Stopping chunk selection.") if self.verbose else None
+ break
+
+ selected_chunks.append((idx, chunks[idx]))
+ total_tokens += chunk_tokens
+
+ print("Sorting selected chunks...") if self.verbose else None
+ selected_chunks.sort(key=lambda x: x[0])
+ print("Selected chunks sorted successfully!") if self.verbose else None
+ return " ".join([chunk for _, chunk in selected_chunks])
+
+ async def chunker(self, text, query, max_chunk_length=1000, max_tokens=2048, overlap=200):
+ # Tokenize the entire text to check its length
+ total_tokens = self.llm.get_num_tokens(text)
+
+ # If the text is less than max tokens, return the text as is
+ if total_tokens <= max_tokens:
+ print(f"Text is less than the max tokens allowed ({total_tokens} <= {max_tokens}). \
+Returning original text.") if self.verbose else None
+ return text
+
+ # Chunk the text if it exceeds max tokens
+ print(f"Text is greater than the max tokens allowed ({total_tokens} > {max_tokens}). \
+Chunking text...") if self.verbose else None
+ chunks, span_annotations = chunk_text(
+ text,
+ max_chunk_length=max_chunk_length,
+ overlap=overlap,
+ # Use the smaller of either context length or max tokens
+ context_length=min(self.context_length, max_tokens)
+ )
+ print(f"Text chunked into {len(chunks)} macro chunks.") if self.verbose else None
+
+ # Process each macro chunk individually
+ chunk_embeddings = []
+ tasks = []
+
+ for i, macro_chunk in enumerate(chunks):
+ # Adjust span annotations relative to the current macro chunk
+ start_offset = span_annotations[i][0]
+ adjusted_spans = [
+ (start - start_offset, end - start_offset)
+ for start, end in span_annotations
+ if start >= start_offset and end <= start_offset + len(macro_chunk)
+ ]
+
+ # Apply late chunking for the current macro chunk
+ tasks.append(self.late_chunking(macro_chunk, adjusted_spans, i, len(chunks)))
+
+ # Aggregate embeddings asynchronously
+ results = await asyncio.gather(*tasks)
+ chunk_embeddings = torch.stack([result[0] for result in results])
+
+ # Generate query embedding
+ print("Generating query embedding...") if self.verbose else None
+ query_embedding = self.get_text_embedding(query)
+ print(f"Query embedding shape: {query_embedding.shape}") if self.verbose else None
+
+ # Calculate similarities between query embedding and chunk embeddings
+ print("Calculating embedding similarities...") if self.verbose else None
+ similarities = self.calculate_embedding_similarities(query_embedding, chunk_embeddings)
+ print(f"Similarities shape: {similarities.shape}") if self.verbose else None
+
+ # Select relevant chunks based on similarity
+ print("Selecting relevant chunks...") if self.verbose else None
+ return self.select_relevant_chunks(similarities, chunks, max_tokens)
+
+if __name__ == "__main__":
+ from sklearn.feature_extraction.text import TfidfVectorizer
+ from sklearn.metrics.pairwise import cosine_similarity
+ from src.reasoning.reasoner import Reasoner
+ from src.search.search_engine import SearchEngine
+ from src.crawl.crawler import CustomCrawler
+ import time
+
+ search_engine = SearchEngine()
+ crawler = CustomCrawler()
+ reasoner = Reasoner()
+ chunking = LateChunker(verbose=True)
+
+ loop = asyncio.new_event_loop()
+
+ search1 = loop.run_until_complete(search_engine.search(
+ "What is the history of climate change and pollution since the pre-indutrial revolution?",
+ num_results=20,
+ exclude_filetypes=["pdf"]
+ ))
+ urls = [result["link"] for result in search1]
+ search2 = loop.run_until_complete(search_engine.search(
+ "What is the impact of climate change on the Indian economy?",
+ num_results=20,
+ exclude_filetypes=["pdf"]
+ ))
+ urls.extend([result["link"] for result in search2])
+ search3 = loop.run_until_complete(search_engine.search(
+ "What are some of the latest, state of art techniques used to fight climate change?",
+ num_results=20,
+ exclude_filetypes=["pdf"]
+ ))
+ urls.extend([result["link"] for result in search3])
+ search4 = loop.run_until_complete(search_engine.search(
+ "What does the projection for climate change look like in the next 50 years?",
+ num_results=20,
+ exclude_filetypes=["pdf"]
+ ))
+ urls.extend([result["link"] for result in search4])
+ search5 = loop.run_until_complete(search_engine.search(
+ "What efforts are being made by governments all around the world to combat climate change?",
+ num_results=20,
+ exclude_filetypes=["pdf"]
+ ))
+ urls.extend([result["link"] for result in search5])
+
+ results = loop.run_until_complete(crawler.fetch_page_contents(
+ urls=urls,
+ max_attempts=1,
+ delay=0
+ ))
+ text = "\n".join([f"Document {i}:\n{result}\n" for i, result in enumerate(results)])
+
+ num_tokens_before_chunking = chunking.llm.get_num_tokens(text)
+ start_time = time.perf_counter()
+ response = loop.run_until_complete(chunking.chunker(
+ text,
+ query="What is this text about? Give me a detailed answer",
+ max_tokens=128000
+ ))
+ end_time = time.perf_counter()
+ num_tokens_after_chunking = chunking.llm.get_num_tokens(response)
+ print(f"\nResponse:\n{response}")
+ print(f"\nNumber of URLs: {len(urls)}")
+ print(f"\nNumber of tokens before late chunking: {num_tokens_before_chunking}")
+ print(f"\nNumber of tokens after late chunking: {num_tokens_after_chunking}")
+ print(f"\nTime taken: {end_time - start_time:.2f} seconds")
+
+ # Calculate cosine similarity between original text and response
+ def calculate_cosine_similarity(text1, text2):
+ vectorizer = TfidfVectorizer().fit_transform([text1, text2])
+ vectors = vectorizer.toarray()
+ return cosine_similarity(vectors)[0][1]
+
+ similarity = calculate_cosine_similarity(text, response)
+ print(f"\nCosine similarity between original text and late chunked text: {similarity * 100:.2f}%")
diff --git a/src/query_processing/query_processor.py b/src/query_processing/query_processor.py
new file mode 100644
index 0000000000000000000000000000000000000000..4067e6aa869311c76041ea8bea05fb3ed36c8ec7
--- /dev/null
+++ b/src/query_processing/query_processor.py
@@ -0,0 +1,609 @@
+import spacy
+import json
+from langchain.prompts import ChatPromptTemplate
+from src.utils.api_key_manager import with_api_manager
+from src.helpers.helper import remove_markdown
+
+class QueryProcessor:
+ def __init__(self):
+ self.nlp = spacy.load("en_core_web_sm")
+
+ def extract_entities(self, query):
+ doc = self.nlp(query)
+ return [ent.text for ent in doc.ents]
+
+ @with_api_manager()
+ async def classify_query(self, query, *, llm):
+ template = \
+"""You are an expert at classifying queries. Your task is to classify the given user query (descriptions are provided below) into one of the following categories:
+1. Internal Knowledge Base -> The query is a simple question that can be answered without external internet resources. It is the simplest category.
+2. Simple External Lookup -> The query requires up to 5 external internet resource references for a quick fact-check before answering. It is a moderate category.
+3. Complex Moderate Decomposition -> The query needs complex reasoning and up to 20 external internet resource references to answer accurately. It is a complex category.
+4. Complex Advanced Decomposition -> The query requires very complex reasoning, dynamic sub-query generation, and up to 50 external internet resource references to answer accurately. It is a very complex category.
+5. Extensive Research Dynamic Structuring -> The query requires extensive research, extremely complex reasoning, and up to 500 external internet resource references to answer accurately. It is the most complex category.
+
+Rules:
+1. Only classify the query into one of the categories provided above.
+2. Classify the query based on its complexity.
+3. If the query contains "category: " in it, then the query should be classified into the category that is mentioned in the query.
+
+Examples:
+1. Internal Knowledge Base
+ - "What is the capital of France?"
+ - "How many continents are there in the world?"
+ - "What is the chemical formula for water?"
+ - "Who wrote the play 'Hamlet'?"
+ - "Who painted the Mona Lisa?"
+ - "What is Newton's first law of motion?"
+ - "What is the sum of the angles in a triangle?"
+
+2. Simple External Lookup
+ - "What is the current market price of gold?"
+ - "What is the current population of Japan?"
+ - "Who won the Nobel Peace Prize in 2023?"
+ - "What is the average temperature in London in October?"
+ - "How many countries are in the European Union?"
+ - "What are the top five best-selling novels of 2024?"
+
+3. Complex Moderate Decomposition
+ - "Compare the political structures of ancient Greece and ancient Rome"
+ - "How do climate change and deforestation contribute to the decline in biodiversity?"
+ - "What are the major differences in healthcare systems between the U.S., Canada, and the U.K.?"
+ - "How have cryptocurrencies evolved since their inception, and what are the key events that shaped their development?"
+ - "What are the economic and social impacts of artificial intelligence on the job market?"
+ - "What are the pros and cons of genetically modified organisms in agriculture?"
+
+4. Complex Advanced Decomposition
+ - "What are the long-term psychological and societal effects of internet addiction on teenagers?"
+ - "How do various world religions view the concept of life after death, and what cultural practices reflect these beliefs?"
+ - "What are the implications of quantum computing on encryption technologies, and how might they evolve in the next decade?"
+ - "How have trade policies between China and the U.S. affected global supply chains since 2000?"
+ - "What are the top five electric SUVs available in the market as of October 2024 for under $60,000, and how do they compare in terms of range, features, and performance?"
+ - "What are the major obstacles to achieving carbon neutrality in heavy industries like steel and cement? What are the potential solutions?"
+
+5. Extensive Research Dynamic Structuring
+ - "Create a comprehensive study on the economic, cultural, and environmental impacts of megacities around the world, including case studies from at least five different continents."
+ - "Conduct a detailed comparative analysis of various renewable energy policies across G20 countries, evaluating their effectiveness, challenges, and future projections."
+ - "Research the evolution of space exploration programs in the last 60 years, highlighting the key milestones, technological advancements, and geopolitical factors that shaped them."
+ - "Analyze the factors that contribute to the spread of misinformation on social media platforms, and propose a detailed multi-faceted strategy for combating this issue globally, including technological, legal, and educational solutions."
+ - "Create a comprehensive report on the evolution and future of human-machine interaction, covering past technological milestones, current trends in AI, and the potential ethical implications of future advancements."
+ - "Evaluate the long-term effects of colonialism on economic development in Africa, including case studies of at least five different countries, and analyze how these effects differ based on colonial power, time of independence, and resource distribution."
+
+Your response should ONLY contain the category in plain text without any formatting.
+
+Query: {query}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ response = await llm.ainvoke(prompt.format_messages(query=query))
+ return response.content.strip()
+
+ @with_api_manager()
+ async def decompose_query(self, query, intent=None, *, llm):
+ if intent:
+ template = \
+"""You are an expert in information retrieval and query analysis.
+Your task is to decompose the given user query into smaller sub-queries based on the provided intent.
+
+Rules:
+1. Analyse if the query can be decomposed into smaller sub-queries first, given that the sub-queries will be used to search the internet.
+ - Only decompose a query into sub-queries if:
+ 1. It is complex enough to benefit from decomposition.
+ For example, "What is the capital of France?", "Who is the current CEO of Apple?", and "What is the weather in Tokyo?"
+ are simple queries and do not benefit from decomposition, whereas "What are the benefits of AI in healthcare?",
+ "What are the latest advancements in AI for healthcare diagnostics?", and "What are the key factors influencing the stock market?"
+ are complex queries that benefit from decomposition.
+ 2. It is a nested query (i.e. the query contains sub-queries within it).
+ For example, "What are the latest reviews for the iPhone 15, Samsung Galaxy S23, and Google Pixel 7?" is a nested query as it contains three sub-queries:
+ "latest reviews for iPhone 15", "latest reviews for Samsung Galaxy S23", and "latest reviews for Google Pixel 7".
+2. The sub-queries should be precise and specific to the information the user is seeking.
+3. The sub-queries should be independent and not overlap with each other.
+4. The sub-queries should be exhaustive and cover all the information the user is seeking.
+5. The sub-queries should follow a funneling approach and filter out irrelevant information with each successive sub-query.
+6. Each sub-query should be a standalone question that can be answered independently.
+7. Each sub-query should be logically connected to the original query and the intent provided.
+
+Your response should be in JSON format with the following structure (do not include any markdown):
+{{
+ "originalquery": "",
+ "subqueries": [
+ {{"subquery": "", "explanation": ""}},
+ {{"subquery": "", "explanation": ""}},
+ ...
+ ]
+}}
+
+**OR**
+
+[IMPORTANT] If the query is simple or if it is not beneficial to decompose the query,
+for internet search purposes, return the original query in plain text without any formatting and/or markdown.
+
+Intent: {intent}
+Query: {query}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(intent=intent, query=query)
+ else:
+ template = \
+"""You are an expert in information retrieval and query analysis.
+Your task is to decompose the given user query into smaller sub-queries.
+
+Rules:
+1. Analyse if the query can be decomposed into smaller sub-queries first, given that the sub-queries will be used to search the internet.
+ - Only decompose a query into sub-queries if:
+ 1. It is complex enough to benefit from decomposition.
+ For example, "What is the capital of France?", "Who is the current CEO of Apple?", and "What is the weather in Tokyo?"
+ are simple queries and do not benefit from decomposition, whereas "What are the benefits of AI in healthcare?",
+ "What are the latest advancements in AI for healthcare diagnostics?", and "What are the key factors influencing the stock market?"
+ are complex queries that benefit from decomposition.
+ 2. It is a nested query (i.e. the query contains sub-queries within it).
+ For example, "What are the latest reviews for the iPhone 15, Samsung Galaxy S23, and Google Pixel 7?" is a nested query as it contains three sub-queries:
+ "latest reviews for iPhone 15", "latest reviews for Samsung Galaxy S23", and "latest reviews for Google Pixel 7".
+2. The sub-queries should be precise and specific to the information the user is seeking.
+3. The sub-queries should be independent and not overlap with each other.
+4. The sub-queries should be exhaustive and cover all the information the user is seeking.
+5. The sub-queries should follow a funneling approach and filter out irrelevant information with each successive sub-query.
+6. Each sub-query should be a standalone question that can be answered independently.
+7. Each sub-query should be logically connected to the original query.
+
+Your response should be in JSON format with the following structure (do not include any markdown):
+{{
+ "originalquery": "",
+ "subqueries": [
+ {{"subquery": "", "explanation": ""}},
+ {{"subquery": "", "explanation": ""}},
+ ...
+ ]
+}}
+
+**OR**
+
+[IMPORTANT] If the query is simple or if it is not beneficial to decompose the query,
+for internet search purposes, return the original query in plain text without any formatting and/or markdown.
+
+Query: {query}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(query=query)
+
+ try:
+ response = await llm.ainvoke(messages)
+ cleaned_response = remove_markdown(response.content.strip())
+
+ # Attempt to parse the response as JSON
+ try:
+ data = json.loads(cleaned_response)
+
+ # Validate the presence of 'subqueries' in the JSON
+ if "subqueries" in data and isinstance(data["subqueries"], list):
+ sub_queries = [item["subquery"] for item in data["subqueries"] if "subquery" in item]
+ original_query = data["originalquery"]
+
+ if len(sub_queries) > 1:
+ return sub_queries, original_query
+ else:
+ raise ValueError("Response JSON does not contain 'sub_queries'.")
+ else:
+ raise ValueError("Response JSON does not contain 'sub_queries'.")
+ except json.JSONDecodeError:
+ # If JSON parsing fails, assume the response is the original query in plain text
+ print(f"JSON parsing failed. Assuming the response is the original query in plain text.")
+ return [query], None
+ except ValueError as ve:
+ # Handle other potential value errors during parsing
+ print(f"ValueError during JSON parsing: {ve}")
+ return [query], None
+ except Exception as e:
+ print(f"Error decomposing query: {e}")
+ return [query], None
+
+ @with_api_manager()
+ async def decompose_query_with_dependencies(self, query, intent=None, context=None, *, llm):
+ if intent:
+ if context:
+ template = \
+"""You are an expert in information retrieval and query analysis.
+
+Your task is to decompose the given user query into smaller sub-queries,
+based on the provided intent and previous queries, and assign each sub-query a logical role.
+
+Logical Roles:
+1. Pre-requisite -> The sub-query is a pre-requisite for other sub-queries and must be answered first.
+2. Dependent -> The sub-query is dependent on answers from one or more pre-requisite sub-queries and must be modified accordingly.
+3. Independent -> The sub-query can be answered independently of the other sub-queries.
+
+Rules:
+1. Analyse if the query can be decomposed into smaller sub-queries first, given that the sub-queries will be used to search the internet.
+ - Only decompose a query into sub-queries if:
+ 1. It is complex enough to benefit from decomposition.
+ For example, "What is the capital of France?", "Who is the current CEO of Apple?", and "What is the weather in Tokyo?"
+ are simple queries and do not benefit from decomposition, whereas "What are the benefits of AI in healthcare?",
+ "What are the latest advancements in AI for healthcare diagnostics?", and "What are the key factors influencing the stock market?"
+ are complex queries that benefit from decomposition.
+ 2. It is a nested query (i.e. the query contains sub-queries within it).
+ For example, "What are the latest reviews for the iPhone 15, Samsung Galaxy S23, and Google Pixel 7?" is a nested query as it contains three sub-queries:
+ "latest reviews for iPhone 15", "latest reviews for Samsung Galaxy S23", and "latest reviews for Google Pixel 7".
+2. The sub-queries should be precise and specific to the information the user is seeking.
+3. The sub-queries should be as distinct as possible,
+minimizing unnecessary overlap while acknowledging that some dependencies may exist due to the logical roles assigned.
+4. The sub-queries should be exhaustive and cover all the information the user is seeking.
+5. The sub-queries should be organized in a logical manner,
+with the pre-requisite sub-queries addressing foundational information needed for dependent sub-queries.
+6. The sub-queries should not repeat any of the previous queries.
+7. The dependent sub-queries can overlap with previous sub-queries and/or sub-sub-queries,
+i.e. the dependent sub-query can be a subset of the previous sub-queries (excluding previous independent sub-queries),
+other than also being dependent on the current lot of pre-requisite sub-queries.
+This essentially means that the previous dependent sub-queries/sub-sub-queries can also play a pre-requisite role for the current dependent sub-query,
+without "officially" changing their role.
+8. Do not decompose sub-sub-queries further into sub-sub-sub-queries.
+
+Your response should be in JSON format with the following structure (do not include any markdown):
+{{
+ "originalquery": "original query",
+ "subqueries": [
+ {{"subquery": "sub query", "role": "logical role",
+ "dependson": [[This sub-list is for the dependencies from the previous queries, containing indices of the sub-queries from the previous context that this sub-query depends on
+ (if role is 'dependent' AND this sub-query is dependent on previous queries, else empty list)],
+ [This sub-list is for the dependencies from the current lot of sub-queries containing indices of the sub-queries from the current query that this sub-query depends on
+ (if role is 'dependent', else empty list)]]}},
+ {{"subquery": "sub query", "role": "logical role",
+ "dependson": [[This sub-list is for the dependencies from the previous queries, containing indices of the sub-queries from the previous context that this sub-query depends on
+ (if role is 'dependent' AND this sub-query is dependent on previous queries, else empty list)],
+ [This sub-list is for the dependencies from the current lot of sub-queries containing indices of the sub-queries from the current query that this sub-query depends on
+ (if role is 'dependent', else empty list)]]}},
+ ...
+ ]
+}}
+
+**OR**
+
+[IMPORTANT] If the query is simple or if it is not beneficial to decompose the query,
+for internet search purposes, return the original query in plain text without any formatting and/or markdown.
+
+---------------------------------------------------------------------------------------------------------------
+
+The following is an example where the previous context is a list of three dictionaries/JSON objects, with each of the dictionaries/JSON objects in the same format mentioned above:
+{{
+ "originalquery": "What are the top three electric SUVs available in the market as of October 2024 for under $60,000?",
+ "subqueries": [
+ {{"subquery": "What are the top three electric SUVs available in the market as of October 2024?", "role": "independent",
+ "dependson": []}},
+ {{"subquery": "How do they compare in terms of range, features, and performance?", "role": "dependent",
+ "dependson": [[0, None, None] ,
+ []]}},
+ {{"subquery": "What are the key features of the top three electric SUVs available in the market as of October 2024?", "role": "dependent",
+ "dependson": [[0, 1, None] , [0]
+ >}},
+ ...
+ ]
+}}
+
+[IMPORTANT] Note: The length of the first "dependson" sub-list must be equal to the number of dictionaries/JSON objects in the list of previous queries,
+and the length of the second "dependson" sub-list must be equal to the number of sub-queries in the current query.
+
+---------------------------------------------------------------------------------------------------------------
+
+Intent:
+{intent}
+
+Previous Queries:
+{context}
+
+Query:
+{query}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(intent=intent, context=context, query=query)
+ else:
+ template = \
+"""You are an expert in information retrieval and query analysis.
+
+Your task is to decompose the given user query into smaller sub-queries,
+based on the provided intent, and assign each sub-query a logical role.
+
+Logical Roles:
+1. Pre-requisite -> The sub-query is a pre-requisite for other sub-queries and must be answered first.
+2. Dependent -> The sub-query is dependent on answers from one or more pre-requisite sub-queries and must be modified accordingly.
+3. Independent -> The sub-query can be answered independently of the other sub-queries.
+
+Rules:
+1. Analyse if the query can be decomposed into smaller sub-queries first, given that the sub-queries will be used to search the internet.
+ - Only decompose a query into sub-queries if:
+ 1. It is complex enough to benefit from decomposition.
+ For example, "What is the capital of France?", "Who is the current CEO of Apple?", and "What is the weather in Tokyo?"
+ are simple queries and do not benefit from decomposition, whereas "What are the benefits of AI in healthcare?",
+ "What are the latest advancements in AI for healthcare diagnostics?", and "What are the key factors influencing the stock market?"
+ are complex queries that benefit from decomposition.
+ 2. It is a nested query (i.e. the query contains sub-queries within it).
+ For example, "What are the latest reviews for the iPhone 15, Samsung Galaxy S23, and Google Pixel 7?" is a nested query as it contains three sub-queries:
+ "latest reviews for iPhone 15", "latest reviews for Samsung Galaxy S23", and "latest reviews for Google Pixel 7".
+2. The sub-queries should be precise and specific to the information the user is seeking.
+3. The sub-queries should be as distinct as possible,
+minimizing unnecessary overlap while acknowledging that some dependencies may exist due to the logical roles assigned.
+4. The sub-queries should be exhaustive and cover all the information the user is seeking.
+5. The sub-queries should be organized in a logical manner,
+with the pre-requisite sub-queries addressing foundational information needed for dependent sub-queries.
+
+Your response should be in JSON format with the following structure (do not include any markdown):
+{{
+ "originalquery": "original query",
+ "subqueries": [
+ {{"subquery": "sub query", "role": "logical role",
+ "dependson": [list of indices of sub_queries this sub query depends on (if role is 'dependent', else empty list)]}},
+ {{"subquery": "sub query", "role": "logical role",
+ "dependson": [list of indices of sub_queries this sub query depends on (if role is 'dependent', else empty list)]}},
+ ...
+ ]
+}}
+
+**OR**
+
+[IMPORTANT] If the query is simple or if it is not beneficial to decompose the query,
+for internet search purposes, return the original query in plain text without any formatting and/or markdown.
+
+Intent:
+{intent}
+
+Query:
+{query}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(intent=intent, query=query)
+ else:
+ if context:
+ template = \
+"""You are an expert in information retrieval and query analysis.
+
+Your task is to decompose the given user query into smaller sub-queries,
+based on the provided context, and assign each sub-query a logical role.
+
+Logical Roles:
+1. Pre-requisite -> The sub-query is a pre-requisite for other sub-queries and must be answered first.
+2. Dependent -> The sub-query is dependent on answers from one or more pre-requisite sub-queries and must be modified accordingly.
+3. Independent -> The sub-query can be answered independently of the other sub-queries.
+
+Rules:
+1. Analyse if the query can be decomposed into smaller sub-queries first, given that the sub-queries will be used to search the internet.
+ - Only decompose a query into sub-queries if:
+ 1. It is complex enough to benefit from decomposition.
+ For example, "What is the capital of France?", "Who is the current CEO of Apple?", and "What is the weather in Tokyo?"
+ are simple queries and do not benefit from decomposition, whereas "What are the benefits of AI in healthcare?",
+ "What are the latest advancements in AI for healthcare diagnostics?", and "What are the key factors influencing the stock market?"
+ are complex queries that benefit from decomposition.
+ 2. It is a nested query (i.e. the query contains sub-queries within it).
+ For example, "What are the latest reviews for the iPhone 15, Samsung Galaxy S23, and Google Pixel 7?" is a nested query as it contains three sub-queries:
+ "latest reviews for iPhone 15", "latest reviews for Samsung Galaxy S23", and "latest reviews for Google Pixel 7".
+2. The sub-queries should be precise and specific to the information the user is seeking.
+3. The sub-queries should be as distinct as possible,
+minimizing unnecessary overlap while acknowledging that some dependencies may exist due to the logical roles assigned.
+4. The sub-queries should be exhaustive and cover all the information the user is seeking.
+5. The sub-queries should be organized in a logical manner,
+with the pre-requisite sub-queries addressing foundational information needed for dependent sub-queries.
+6. The sub-queries should not repeat any of the previous queries.
+7. The dependent sub-queries can overlap with previous sub-queries and/or sub-sub-queries,
+i.e. the dependent sub-query can be a subset of the previous sub-queries (excluding previous independent sub-queries),
+other than also being dependent on the current lot of pre-requisite sub-queries.
+This essentially means that the previous dependent sub-queries/sub-sub-queries can also play a pre-requisite role for the current dependent sub-query,
+without "officially" changing their role.
+8. Do not decompose sub-sub-queries further into sub-sub-sub-queries.
+
+Your response should be in JSON format with the following structure (do not include any markdown):
+{{
+ "originalquery": "original query",
+ "subqueries": [
+ {{"subquery": "sub query", "role": "logical role",
+ "dependson": [[This sub-list is for the dependencies from the previous queries, containing indices of the sub-queries from the previous context that this sub-query depends on
+ (if role is 'dependent' AND this sub-query is dependent on previous queries, else empty list)],
+ [This sub-list is for the dependencies from the current lot of sub-queries containing indices of the sub-queries from the current query that this sub-query depends on
+ (if role is 'dependent', else empty list)]]}},
+ {{"subquery": "sub query", "role": "logical role",
+ "dependson": [[This sub-list is for the dependencies from the previous queries, containing indices of the sub-queries from the previous context that this sub-query depends on
+ (if role is 'dependent' AND this sub-query is dependent on previous queries, else empty list)],
+ [This sub-list is for the dependencies from the current lot of sub-queries containing indices of the sub-queries from the current query that this sub-query depends on
+ (if role is 'dependent', else empty list)]]}},
+ ...
+ ]
+}}
+
+**OR**
+
+[IMPORTANT] If the query is simple or if it is not beneficial to decompose the query,
+for internet search purposes, return the original query in plain text without any formatting and/or markdown.
+
+---------------------------------------------------------------------------------------------------------------
+
+The following is an example where the previous context is a list of three dictionaries/JSON objects, with each of the dictionaries/JSON objects in the same format mentioned above:
+{{
+ "originalquery": "What are the top three electric SUVs available in the market as of October 2024 for under $60,000?",
+ "subqueries": [
+ {{"subquery": "What are the top three electric SUVs available in the market as of October 2024?", "role": "independent",
+ "dependson": []}},
+ {{"subquery": "How do they compare in terms of range, features, and performance?", "role": "dependent",
+ "dependson": [[0, None, None] ,
+ []]}},
+ {{"subquery": "What are the key features of the top three electric SUVs available in the market as of October 2024?", "role": "dependent",
+ "depends_on": [[0, 1, None] , [0]
+ >}},
+ ...
+ ]
+}}
+
+[IMPORTANT] Note: The length of the first "dependson" sub-list must be equal to the number of dictionaries/JSON objects in the list of previous queries,
+and the length of the second "dependson" sub-list must be equal to the number of sub-queries in the current query.
+
+---------------------------------------------------------------------------------------------------------------
+
+Previous Queries:
+{context}
+
+Query:
+{query}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(context=context, query=query)
+ else:
+ template = \
+"""You are an expert in information retrieval and query analysis.
+
+Your task is to decompose the given user query into smaller sub-queries, and assign each sub-query a logical role.
+
+Logical Roles:
+1. Pre-requisite -> The sub-query is a pre-requisite for other sub-queries and must be answered first.
+2. Dependent -> The sub-query is dependent on answers from one or more pre-requisite sub-queries and must be modified accordingly.
+3. Independent -> The sub-query can be answered independently of the other sub-queries.
+
+Rules:
+1. Analyse if the query can be decomposed into smaller sub-queries first, given that the sub-queries will be used to search the internet.
+ - Only decompose a query into sub-queries if:
+ 1. It is complex enough to benefit from decomposition.
+ For example, "What is the capital of France?", "Who is the current CEO of Apple?", and "What is the weather in Tokyo?"
+ are simple queries and do not benefit from decomposition, whereas "What are the benefits of AI in healthcare?",
+ "What are the latest advancements in AI for healthcare diagnostics?", and "What are the key factors influencing the stock market?"
+ are complex queries that benefit from decomposition.
+ 2. It is a nested query (i.e. the query contains sub-queries within it).
+ For example, "What are the latest reviews for the iPhone 15, Samsung Galaxy S23, and Google Pixel 7?" is a nested query as it contains three sub-queries:
+ "latest reviews for iPhone 15", "latest reviews for Samsung Galaxy S23", and "latest reviews for Google Pixel 7".
+2. The sub-queries should be precise and specific to the information the user is seeking.
+3. The sub-queries should be as distinct as possible,
+minimizing unnecessary overlap while acknowledging that some dependencies may exist due to the logical roles assigned.
+4. The sub-queries should be exhaustive and cover all the information the user is seeking.
+5. The sub-queries should be organized in a logical manner,
+with the pre-requisite sub-queries addressing foundational information needed for dependent sub-queries.
+
+Your response should be in JSON format with the following structure (do not include any markdown):
+{{
+ "originalquery": "original query",
+ "subqueries": [
+ {{"subquery": "sub query", "role": "logical role",
+ "dependson": [list of indices of sub_queries this sub query depends on (if role is 'dependent', else empty list)]}},
+ {{"subquery": "sub query", "role": "logical role",
+ "dependson": [list of indices of sub_queries this sub query depends on (if role is 'dependent', else empty list)]}},
+ ...
+ ]
+}}
+
+**OR**
+
+[IMPORTANT] If the query is simple or if it is not beneficial to decompose the query,
+for internet search purposes, return the original query in plain text without any formatting and/or markdown.
+
+Query:
+{query}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(query=query)
+
+ try:
+ response = await llm.ainvoke(messages)
+ cleaned_response = remove_markdown(response.content.strip())
+ print(f"Cleaned Response: {cleaned_response}")
+
+ # Attempt to parse the response as JSON
+ try:
+ data = json.loads(cleaned_response)
+
+ # Validate the presence of 'subqueries' in the JSON
+ if "subqueries" in data and isinstance(data["subqueries"], list):
+ sub_queries = [item["subquery"] for item in data["subqueries"] if "subquery" in item]
+
+ if len(sub_queries) > 1:
+ roles = [item["role"] for item in data["subqueries"] if "role" in item]
+ dependencies = [item["dependson"] for item in data["subqueries"] if "dependson" in item]
+ return data, sub_queries, roles, dependencies
+ else:
+ # Assume the model made a mistake and was supposed to return the original query
+ print("No sub-queries found in the response.")
+ return None, [query], ['root'], []
+ else:
+ # Assume the model made a mistake and was supposed to return the original query
+ print("Response JSON does not contain 'sub_queries'.")
+ return None, [query], ['root'], []
+ except json.JSONDecodeError:
+ # If JSON parsing fails, assume the response is the original query in plain text
+ print(f"JSON parsing failed. Assuming the response is the original query in plain text.")
+ return None, [query], ['root'], []
+ except ValueError as ve:
+ # Handle other potential value errors during parsing
+ print(f"ValueError during JSON parsing: {ve}")
+ return None, [query], ['root'], []
+ except Exception as e:
+ print(f"Error decomposing query: {e}")
+ return None, [query], ['root'], []
+
+ @with_api_manager()
+ async def modify_query(self, query, context, *, llm):
+ combined_context = "\n\n".join(f"Context {i}:\n\n{content}" for i, content in enumerate(context, 1))
+ template = \
+"""[IMPORTANT]
+This is a very important task.
+Please take a deep breath, read the rules and the context VERY carefully,
+and then think step-by-step to reason your way to the answer.
+
+[PROMPT]
+You are an expert in query refinement.
+Your task is to modify the given query based on the context(s) provided.
+
+Rules:
+1. Assume that the user is unable to see the query and the context(s) provided so he has no idea what the original query is.
+2. The modified query should maintain the intent of the original query.
+3. The modified query should be precise and specific to the information the query is seeking.
+4. The modified query should be concise but include essential information from the context.
+
+Your response should ONLY contain the modified query in plain text without any formatting.
+
+Query: {query}
+
+Context:
+{context}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(query=query, context=combined_context)
+ response = await llm.ainvoke(messages)
+ return response.content.strip()
+
+ @with_api_manager()
+ async def get_query_intent(self, query, *, llm):
+ template = \
+"""You are the best psychologist in the world with many decades of experience.
+Your task is to think step-by-step and create 10 different versions of the given user query,
+considering that these versions should be semantically clear and help describe the user's intention behind the query.
+
+Your goal is to think step-by-step and look at the 10 versions of the query, along with the original query,
+and then take a deep breath to conduct a thorough analysis of the user's intention.
+Your analysis should be concise, detailed, and to the point. It should also contain the kind of answers and information the user is looking for.
+
+[IMPORTANT] Your response should ONLY be the intent analysis of the user's query without any formatting.
+Do not include the reasoning process or the 10 versions of the query in your response.
+
+Original query: {query}"""
+
+ prompt = ChatPromptTemplate.from_template(template)
+ response = await llm.ainvoke(prompt.format_messages(query=query))
+ return response.content.strip()
+
+if __name__ == "__main__":
+ import asyncio
+
+ query = "Given the current state of scientific knowledge, how can cold-fusion be achieved?"
+ contexts = []
+ processor = QueryProcessor()
+
+ intent = asyncio.run(processor.get_query_intent(query))
+ data1, context1, _, _ = asyncio.run(processor.decompose_query_with_dependencies(query, intent=intent))
+ contexts.append(data1)
+ print(f"Intent:\n{intent}\n")
+ print(f"Context 1:\n{contexts}\n")
+
+ if len(context1) > 1:
+ data2, context2, _, _ = asyncio.run(processor.decompose_query_with_dependencies(
+ context1[4],
+ context=contexts
+ )
+ )
+ contexts.append(data2)
+ print(f"Context 2:\n{contexts}\n")
+
+ if len(context2) > 1:
+ _, sub_queries, roles, dependencies = asyncio.run(processor.decompose_query_with_dependencies(
+ context2[1],
+ context=contexts
+ )
+ )
+ print(f"Sub-queries:\n{sub_queries}\n")
+ print(f"Roles:\n{roles}\n")
+ print(f"Dependencies:\n{dependencies}\n")
\ No newline at end of file
diff --git a/src/rag/__init__.py b/src/rag/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/rag/neo4j_graphrag.py b/src/rag/neo4j_graphrag.py
new file mode 100644
index 0000000000000000000000000000000000000000..75ce9404aae2e4e8b9bfb0f9b6efe785848d891c
--- /dev/null
+++ b/src/rag/neo4j_graphrag.py
@@ -0,0 +1,2206 @@
+import os
+import gc
+import time
+import asyncio
+import torch
+import uuid
+from contextlib import contextmanager
+from neo4j import GraphDatabase
+from pyvis.network import Network
+from src.query_processing.late_chunking.late_chunker import LateChunker
+from src.query_processing.query_processor import QueryProcessor
+from src.reasoning.reasoner import Reasoner
+from src.utils.api_key_manager import APIKeyManager
+from src.search.search_engine import SearchEngine
+from src.crawl.crawler import Crawler, CustomCrawler
+from sentence_transformers import SentenceTransformer
+from bert_score.scorer import BERTScorer
+import numpy as np
+from concurrent.futures import ThreadPoolExecutor
+from typing import List, Dict, Any
+
+class Neo4jGraphRAG:
+ def __init__(self, num_workers: int = 1):
+ """Initialize Neo4j connection and required components."""
+ # Neo4j connection setup
+ self.neo4j_uri = os.getenv("NEO4J_URI")
+ self.neo4j_user = os.getenv("NEO4J_USER")
+ self.neo4j_password = os.getenv("NEO4J_PASSWORD")
+ self.driver = GraphDatabase.driver(
+ self.neo4j_uri,
+ auth=(self.neo4j_user, self.neo4j_password)
+ )
+
+ # Component initialization
+ self.num_workers = num_workers
+ self.search_engine = SearchEngine()
+ self.query_processor = QueryProcessor()
+ self.reasoner = Reasoner()
+ # self.crawler = Crawler(verbose=True)
+ self.custom_crawler = CustomCrawler(max_concurrent_requests=1000)
+ self.chunking = LateChunker()
+ self.llm = APIKeyManager().get_llm()
+
+ # Model initialization
+ self.model = SentenceTransformer(
+ "dunzhang/stella_en_400M_v5",
+ trust_remote_code=True,
+ device="cuda" if torch.cuda.is_available() else "cpu"
+ )
+ self.scorer = BERTScorer(
+ model_type="roberta-base",
+ lang="en",
+ rescale_with_baseline=True,
+ device= "cpu" # "cuda" if torch.cuda.is_available() else "cpu"
+ )
+
+ # Counters and tracking
+ self.root_node_id = "QR"
+ self.node_counter = 0
+ self.sub_node_counter = 0
+ self.cross_connections = set()
+
+ # Add graph tracking
+ self.current_graph_id = None
+
+ # Thread pool
+ self.executor = ThreadPoolExecutor(max_workers=self.num_workers)
+
+ # Create a callback to emit an event
+ self.on_event_callback = None
+
+ def set_on_event_callback(self, callback):
+ """Register a single callback to be triggered for various event types."""
+ self.on_event_callback = callback
+
+ async def emit_event(self, event_type: str, data: dict):
+ """Helper method to safely emit an event if a callback is registered."""
+ if self.on_event_callback:
+ # Check if the callback is asynchronous or synchronous
+ if asyncio.iscoroutinefunction(self.on_event_callback):
+ # The callback signature: callback(event_type, data)
+ return await self.on_event_callback(event_type, data)
+ else:
+ return self.on_event_callback(event_type, data)
+
+ @contextmanager
+ def transaction(self, max_retries: int = 1):
+ """Synchronous context manager for Neo4j transactions."""
+ session = self.driver.session()
+ retry_count = 0
+
+ while True:
+ try:
+ tx = session.begin_transaction()
+ try:
+ yield tx
+ tx.commit()
+ break
+ except Exception as e:
+ tx.rollback()
+ raise e
+ except Exception as e:
+ retry_count += 1
+ if retry_count >= max_retries:
+ print(f"Transaction failed after {max_retries} attempts: {str(e)}")
+ raise e
+ print(f"Transaction failed, retrying ({retry_count}/{max_retries}): {str(e)}")
+ time.sleep(1) # Use regular sleep for sync context
+ finally:
+ session.close()
+
+ def initialize_schema(self):
+ """Check and initialize database schema."""
+ constraint_node_id_per_graph = None
+ index_node_query = None
+ index_node_role = None
+ constraint_graph_id = None
+ index_graph_created = None
+ constraint_node_graph = None
+
+ try:
+ with self.transaction() as tx:
+ # Check if schema already exists by looking for our composite constraint
+ constraint_node_id_per_graph = tx.run("""
+ SHOW CONSTRAINTS
+ WHERE name = 'constraint_node_id_per_graph'
+ """).data()
+
+ index_node_role = tx.run("""
+ SHOW INDEXES
+ WHERE name = 'index_node_role'
+ """).data()
+
+ index_node_graph_id = tx.run("""
+ SHOW INDEXES
+ WHERE name = 'index_node_graph_id'
+ """).data()
+
+ constraint_graph_id = tx.run("""
+ SHOW CONSTRAINTS
+ WHERE name = 'constraint_graph_id'
+ """).data()
+
+ index_graph_created = tx.run("""
+ SHOW INDEXES
+ WHERE name = 'index_graph_created'
+ """).data()
+
+ constraint_node_graph = tx.run("""
+ SHOW CONSTRAINTS
+ WHERE name = 'constraint_node_graph'
+ """).data()
+
+ if constraint_node_id_per_graph and index_node_role and \
+ index_node_graph_id and constraint_graph_id and index_graph_created and constraint_node_graph:
+ print("Database schema already initialized")
+ return
+
+ print("Initializing database schema...")
+
+ # Create composite constraint for node ID uniqueness within each graph
+ if not constraint_node_id_per_graph:
+ tx.run("""
+ CREATE CONSTRAINT constraint_node_id_per_graph IF NOT EXISTS
+ FOR (n:Node)
+ REQUIRE (n.id, n.graph_id) IS UNIQUE
+ """)
+
+ if not index_node_role:
+ tx.run("""
+ CREATE INDEX index_node_role IF NOT EXISTS FOR (n:Node)
+ ON (n.role)
+ """)
+
+ if not index_node_graph_id:
+ tx.run("""
+ CREATE INDEX index_node_graph_id IF NOT EXISTS FOR (n:Node)
+ ON (n.graph_id)
+ """)
+
+ # Graph management constraints
+ if not constraint_graph_id:
+ tx.run("""
+ CREATE CONSTRAINT constraint_graph_id IF NOT EXISTS
+ FOR (g:Graph)
+ REQUIRE g.id IS UNIQUE
+ """)
+
+ if not index_graph_created:
+ tx.run("""
+ CREATE INDEX index_graph_created IF NOT EXISTS FOR (g:Graph)
+ ON (g.created)
+ """)
+
+ if not constraint_node_graph:
+ tx.run("""
+ CREATE CONSTRAINT constraint_node_graph IF NOT EXISTS
+ FOR (n:Node)
+ REQUIRE n.graph_id IS NOT NULL
+ """)
+
+ print("Database schema initialization complete")
+
+ except Exception as e:
+ print(f"Error ensuring schema exists: {str(e)}")
+ raise
+
+ def add_node(self, node_id: str, query: str, data: str = "", role: str = None):
+ """Add a node to the current graph."""
+ if self.current_graph_id is None:
+ raise Exception("Error: No current graph selected")
+
+ try:
+ with self.transaction() as tx:
+ # Generate embedding
+ embedding = self.model.encode(query).tolist()
+
+ # Create node with properties including embedding and graph ID
+ result = tx.run(
+ """
+ MERGE (n:Node {id: $node_id, graph_id: $graph_id})
+ SET n.query = $node_query,
+ n.embedding = $embedding,
+ n.data = $data,
+ n.role = $role
+ """,
+ node_id=node_id,
+ graph_id=self.current_graph_id,
+ node_query=query,
+ embedding=embedding,
+ data=data,
+ role=role
+ )
+ print(f"Added node '{node_id}' to graph '{self.current_graph_id}' with role '{role}' and query: '{query}'")
+
+ except Exception as e:
+ print(f"Error adding node '{node_id}' to graph '{self.current_graph_id}' with role '{role}' and query: '{query}': {str(e)}")
+ raise
+
+ def add_edge(self, node1: str, node2: str, weight: float = 1.0, relationship_type: str = None):
+ """Add an edge between two nodes in a way that preserves a DAG structure in the graph"""
+ if self.current_graph_id is None:
+ raise Exception("Error: No current graph selected")
+
+ # 1) Prevent self loops
+ if node1 == node2:
+ print(f"Cannot add edge to the same node {node1}!")
+ return
+
+ try:
+ with self.transaction() as tx:
+ # 2) Check if there is already a path from node2 back to node1
+ check_path = tx.run(
+ """
+ MATCH (start:Node {id: $node2, graph_id: $graph_id})
+ MATCH (end:Node {id: $node1, graph_id: $graph_id})
+ // If there's any path of length >= 0 from 'start' to 'end',
+ // then creating (end)->(start) would introduce a cycle.
+ WHERE (start)-[:RELATION*0..]->(end)
+ RETURN COUNT(start) AS pathExists
+ """,
+ node1=node1,
+ node2=node2,
+ graph_id=self.current_graph_id
+ )
+ path_count = check_path.single()["pathExists"]
+
+ if path_count > 0:
+ print(f"An edge between {node1} -> {node2} already exists!")
+ return
+
+ # 3) Otherwise, safe to create a new directed edge
+ tx.run(
+ """
+ MATCH (a:Node {id: $node1, graph_id: $graph_id})
+ MATCH (b:Node {id: $node2, graph_id: $graph_id})
+ MERGE (a)-[r:RELATION {type: $rel_type}]->(b)
+ SET r.weight = $weight
+ """,
+ node1=node1,
+ node2=node2,
+ graph_id=self.current_graph_id,
+ rel_type=relationship_type,
+ weight=weight
+ )
+
+ print(
+ f"Added edge between '{node1}' and '{node2}' in graph "
+ f"'{self.current_graph_id}' (type='{relationship_type}', weight={weight})"
+ )
+
+ except Exception as e:
+ print(f"Error adding edge between '{node1}' and '{node2}': {str(e)}")
+ raise
+
+ def edge_exists(self, node1: str, node2: str) -> bool:
+ """Check if an edge exists between two nodes."""
+ try:
+ with self.transaction() as tx:
+ result = tx.run(
+ """
+ MATCH (a:Node {id: $node1})-[r:RELATION]-(b:Node {id: $node2})
+ RETURN COUNT(r) as count
+ """,
+ node1=node1,
+ node2=node2
+ )
+ return result.single()["count"] > 0
+
+ except Exception as e:
+ print(f"Error checking edge existence between {node1} and {node2}: {str(e)}")
+ raise
+
+ def graph_exists(self) -> bool:
+ """Check if a graph exists in Neo4j."""
+ try:
+ with self.transaction() as tx:
+ result = tx.run("""
+ MATCH (n:Node)
+ RETURN count(n) > 0 as has_nodes
+ """)
+ return result.single()["has_nodes"]
+ except Exception as e:
+ print(f"Error checking graph existence: {str(e)}")
+ raise
+
+ def get_graphs(self) -> list:
+ """Get detailed information about all existing graphs and their nodes."""
+ try:
+ with self.transaction() as tx:
+ result = tx.run(
+ """
+ MATCH (g:Graph)
+ OPTIONAL MATCH (n:Node {graph_id: g.id})-[r:RELATION]->(:Node)
+ WITH g, collect(DISTINCT n) AS nodes, collect(DISTINCT r) AS rels
+ RETURN {
+ graph_id: g.id,
+ created: g.created,
+ updated: g.updated,
+ node_count: size(nodes),
+ edge_count: size(rels),
+ nodes: [node IN nodes | {
+ id: node.id,
+ query: node.query,
+ data: node.data,
+ role: node.role,
+ pagerank: node.pagerank
+ }]
+ } as graph_info
+ ORDER BY g.created DESC
+ """
+ )
+ return list(result)
+ except Exception as e:
+ print(f"Error getting graphs: {str(e)}")
+ raise
+
+ def select_graph(self, graph_id: str) -> bool:
+ """Select a specific graph as the current working graph."""
+ try:
+ with self.transaction() as tx:
+ result = tx.run("""
+ MATCH (g:Graph {id: $graph_id})
+ RETURN g
+ """, graph_id=graph_id)
+
+ if result.single():
+ self.current_graph_id = graph_id
+ return True
+ return False
+
+ except Exception as e:
+ print(f"Error selecting graph: {str(e)}")
+ raise
+
+ def create_new_graph(self) -> str:
+ """Create a new graph instance and its ID."""
+ try:
+ with self.transaction() as tx:
+ graph_id = str(uuid.uuid4())
+ tx.run("""
+ CREATE (g:Graph {
+ id: $graph_id,
+ created: datetime(),
+ updated: datetime()
+ })
+ """, graph_id=graph_id)
+
+ self.current_graph_id = graph_id
+
+ except Exception as e:
+ print(f"Error creating new graph: {str(e)}")
+ raise
+
+ def load_graph(self, node_id: str) -> bool:
+ """Load an existing graph structure from Neo4j based on node ID."""
+ # Helper function to safely extract number from node ID
+ def extract_number(node_id: str) -> int:
+ try:
+ # Extract all digits from the string
+ num_str = ''.join(filter(str.isdigit, node_id))
+ return int(num_str) if num_str else 0
+ except ValueError:
+ print(f"Warning: Could not extract number from node ID: {node_id}")
+ return 0
+
+ try:
+ with self.driver.session() as session:
+ # Start transaction
+ tx = session.begin_transaction()
+
+ try:
+ # Get all related nodes and relationships
+ result = tx.run("""
+ MATCH path = (n:Node)-[r:RELATION*0..]->(m:Node)
+ WHERE n.id = $node_id
+ RETURN DISTINCT n, r, m,
+ length(path) as depth,
+ [rel in r | type(rel)] as rel_types,
+ [rel in r | rel.weight] as weights
+ """, node_id=node_id)
+
+ # Reset internal state
+ self.node_counter = 0
+ self.sub_node_counter = 0
+ self.cross_connections.clear()
+
+ # Track processed nodes to avoid duplicates
+ processed_nodes = set()
+
+ # Process results
+ for record in result:
+ # Update counters based on node patterns
+ if record["n"]["id"] not in processed_nodes:
+ node_id = record["n"]["id"]
+ if "SQ" in node_id:
+ current_num = extract_number(node_id)
+ self.node_counter = max(self.node_counter, current_num)
+ elif "SSQ" in node_id:
+ current_num = extract_number(node_id)
+ self.sub_node_counter = max(self.sub_node_counter, current_num)
+ processed_nodes.add(node_id)
+
+ if record["m"]["id"] not in processed_nodes:
+ node_id = record["m"]["id"]
+ if "SQ" in node_id:
+ current_num = extract_number(node_id)
+ self.node_counter = max(self.node_counter, current_num)
+ elif "SSQ" in node_id:
+ current_num = extract_number(node_id)
+ self.sub_node_counter = max(self.sub_node_counter, current_num)
+ processed_nodes.add(node_id)
+
+ # Increment counters for next use
+ self.node_counter += 1
+ self.sub_node_counter += 1
+
+ # Track cross-connections
+ result = tx.run("""
+ MATCH (n:Node)-[r:RELATION]->(m:Node)
+ WHERE r.type = 'logical'
+ RETURN n.id as source, m.id as target
+ """)
+
+ for record in result:
+ connection = tuple(sorted([record["source"], record["target"]]))
+ self.cross_connections.add(connection)
+
+ tx.commit()
+ print(f"Successfully loaded graph. Current counters - Node: {self.node_counter}, Sub: {self.sub_node_counter}")
+ return True
+
+ except Exception as e:
+ tx.rollback()
+ print(f"Transaction error while loading graph: {str(e)}")
+ return False
+
+ except Exception as e:
+ print(f"Error loading graph: {str(e)}")
+ return False
+
+ async def modify_graph(self, new_query: str, similar_node_id: str, session_id: str = None):
+ """Modify an existing graph structure by integrating a new query."""
+
+ # Inner function to add a new node as a sibling
+ async def add_as_sibling(node_id: str, query: str):
+ with self.transaction() as tx:
+ result = tx.run("""
+ MATCH (n:Node)<-[r:RELATION]-(parent:Node)
+ WHERE n.id = $node_id
+ RETURN parent.id as parent_id,
+ parent.query as parent_query,
+ r.type as rel_type
+ """, node_id=node_id)
+
+ parent_data = result.single()
+ if not parent_data:
+ raise ValueError(f"No parent found for node {node_id}")
+
+ if "SQ" in node_id:
+ self.node_counter += 1
+ new_node_id = f"SQ{self.node_counter}"
+ else:
+ self.sub_node_counter += 1
+ new_node_id = f"SSQ{self.sub_node_counter}"
+
+ self.add_node(
+ node_id=new_node_id,
+ query=query,
+ role="independent"
+ )
+ self.add_edge(
+ parent_data["parent_id"],
+ new_node_id,
+ relationship_type=parent_data["rel_type"]
+ )
+
+ return new_node_id
+
+ # Inner function to add a new node as a child
+ async def add_as_child(node_id: str, query: str):
+ if "SQ" in node_id:
+ self.sub_node_counter += 1
+ new_node_id = f"SSQ{self.sub_node_counter}"
+ else:
+ self.node_counter += 1
+ new_node_id = f"SQ{self.node_counter}"
+
+ self.add_node(
+ node_id=new_node_id,
+ query=query,
+ role="dependent"
+ )
+ self.add_edge(
+ node_id,
+ new_node_id,
+ relationship_type="logical"
+ )
+
+ return new_node_id
+
+ # Inner function to collect context from existing graph nodes
+ def collect_graph_context() -> list:
+ try:
+ with self.transaction() as tx:
+ # Get all nodes except root, ordered by depth and ID to maintain hierarchy
+ result = tx.run("""
+ MATCH (n:Node)
+ WHERE n.id <> $root_id AND n.graph_id = $graph_id
+ WITH n
+ ORDER BY
+ CASE
+ WHEN n.id STARTS WITH 'SQ' THEN 1
+ WHEN n.id STARTS WITH 'SSQ' THEN 2
+ ELSE 3
+ END,
+ n.id
+ RETURN COLLECT({
+ id: n.id,
+ query: n.query,
+ role: n.role
+ }) as nodes
+ """, root_id=self.root_node_id, graph_id=self.current_graph_id)
+
+ nodes = result.single()["nodes"]
+ if not nodes:
+ return []
+
+ # Group nodes by hierarchy level
+ level_queries = {}
+ current_sq = None
+
+ for node in nodes:
+ node_id = node["id"]
+ if node_id.startswith("SQ"):
+ current_sq = node_id
+ if current_sq not in level_queries:
+ level_queries[current_sq] = {
+ "originalquery": node["query"],
+ "subqueries": []
+ }
+
+ # Add the SQ node itself as a sub-query
+ level_queries[current_sq]["subqueries"].append({
+ "subquery": node["query"],
+ "role": node["role"],
+ "dependson": [] # Dependencies will be added below
+ })
+
+ elif node_id.startswith("SSQ") and current_sq:
+ level_queries[current_sq]["subqueries"].append({
+ "subquery": node["query"],
+ "role": node["role"],
+ "dependson": [] # Dependencies will be added below
+ })
+
+ # Add dependency information
+ for sq_id, query_data in level_queries.items():
+ for i, sub_query in enumerate(query_data["subqueries"]):
+ # Get dependencies for this sub_query
+ deps = tx.run("""
+ MATCH (n:Node {query: $node_query})-[r:RELATION {type: 'logical'}]->(m:Node)
+ WHERE n.graph_id = $graph_id
+ RETURN COLLECT(m.query) as dependencies
+ """, node_query=sub_query["subquery"], graph_id=self.current_graph_id)
+
+ dep_queries = deps.single()["dependencies"]
+ if dep_queries:
+ # Find indices of dependent queries
+ curr_deps = []
+ prev_deps = []
+ for dep_query in dep_queries:
+ # Check current level dependencies
+ curr_idx = next(
+ (idx for idx, sq in enumerate(query_data["subqueries"])
+ if sq["subquery"] == dep_query),
+ None
+ )
+ if curr_idx is not None:
+ curr_deps.append(curr_idx)
+ else:
+ # Check previous level dependencies
+ for prev_idx, prev_data in enumerate(level_queries.values()):
+ if dep_query in [sq["subquery"] for sq in prev_data["subqueries"]]:
+ prev_deps.append(prev_idx)
+ break
+
+ query_data["subqueries"][i]["dependson"] = [prev_deps, curr_deps]
+
+ # Convert to list maintaining order
+ return list(level_queries.values())
+
+ except Exception as e:
+ print(f"Error collecting graph context: {str(e)}")
+ raise
+
+ try:
+ # Get the role and other metadata of the similar node
+ with self.transaction() as tx:
+ result = tx.run("""
+ MATCH (n:Node {id: $node_id})
+ RETURN n.role as role,
+ n.query as query,
+ EXISTS((n)<-[:RELATION]-()) as has_parent
+ """, node_id=similar_node_id)
+
+ node_data = result.single()
+ if not node_data:
+ raise Exception(f"Node {similar_node_id} not found")
+
+ # Collect context from existing graph
+ context = collect_graph_context()
+
+ # Determine modification strategy
+ if node_data["role"] == "independent":
+ # Add as sibling if has parent, else as child
+ if node_data["has_parent"]:
+ new_node_id = await add_as_sibling(similar_node_id, new_query)
+ else:
+ new_node_id = await add_as_child(similar_node_id, new_query)
+ else:
+ # Add as child for dependent or pre-requisite nodes
+ new_node_id = await add_as_child(similar_node_id, new_query)
+
+ # Recursively build subgraph for new node if needed
+ await self.build_graph(
+ query=new_query,
+ parent_node_id=new_node_id,
+ depth=1 if "SQ" in new_node_id else 2,
+ context=context, # Pass the collected context
+ session_id=session_id
+ )
+
+ except Exception as e:
+ print(f"Error modifying graph: {str(e)}")
+ raise
+
+ async def build_graph(self, query: str, data: str = None, parent_node_id: str = None,
+ depth: int = 0, threshold: float = 0.8, recurse: bool = True,
+ context: list = None, session_id: str = None, max_tokens_allowed: int = 128000):
+ """Build a new graph structure in Neo4j."""
+
+ async def process_node(self, node_id: str, sub_query: str,
+ session_id: str, future: asyncio.Future,
+ depth=depth, max_tokens_allowed=max_tokens_allowed):
+ """Process a node asynchronously."""
+ try:
+ # Generate an optimized search query
+ optimized_query = await self.search_engine.generate_optimized_query(sub_query)
+
+ # Search for the sub-query
+ results = await self.search_engine.search(
+ query=optimized_query,
+ num_results=10,
+ exclude_filetypes=["pdf"]
+ )
+ # Emit event with the raw results
+ await self.emit_event("search_results_fetched", {
+ "node_id": node_id,
+ "sub_query": sub_query,
+ "optimized_query": optimized_query,
+ "search_results": results
+ })
+
+ # Filter the URLs based on the query
+ filtered_urls = await self.search_engine.filter_urls(
+ sub_query,
+ "extensive research dynamic structure",
+ results
+ )
+ # Emit an event with the filtered URLs
+ await self.emit_event("search_results_filtered", {
+ "node_id": node_id,
+ "sub_query": sub_query,
+ "filtered_urls": filtered_urls
+ })
+
+ # Get the URLs
+ urls = [result.get('link', 'No URL') for result in filtered_urls]
+
+ # Fetch URL contents
+ search_contents = await self.custom_crawler.fetch_page_contents(
+ urls,
+ sub_query,
+ session_id=session_id,
+ max_attempts=1,
+ timeout=30
+ )
+ # Emit an event with the fetched contents
+ await self.emit_event("search_contents_fetched", {
+ "node_id": node_id,
+ "sub_query": sub_query,
+ "contents": search_contents
+ })
+
+ # Format the contents
+ contents = ""
+ for k, content in enumerate(search_contents, 1):
+ if isinstance(content, Exception):
+ print(f"Error fetching content: {content}")
+ elif content:
+ contents += f"Document {k}:\n{content}\n\n"
+
+ if len(contents.strip()) > 0:
+ if depth == 0:
+ # Emit an event to indicate the completion of sub-query processing
+ await self.emit_event("sub_query_processed", {
+ "node_id": node_id,
+ "sub_query": sub_query,
+ "contents": contents
+ })
+
+ # Chunk the contents if it exceeds the token limit
+ token_count = self.llm.get_num_tokens(contents)
+ if token_count > max_tokens_allowed:
+ contents = await self.chunking.chunker(
+ text=contents,
+ query=sub_query,
+ max_tokens=max_tokens_allowed
+ )
+ print(f"Number of tokens in the answer: {token_count}")
+ print(f"Number of tokens in the content: {self.llm.get_num_tokens(contents)}")
+ else:
+ if depth == 0:
+ # Emit an event to indicate the failure of sub-query processing
+ await self.emit_event("sub_query_failed", {
+ "node_id": node_id,
+ "sub_query": sub_query,
+ "contents": contents
+ })
+
+ # Update node with data atomically
+ with self.transaction() as tx:
+ tx.run(
+ """
+ MATCH (n:Node {id: $node_id})
+ SET n.data = $data
+ """,
+ node_id=node_id,
+ data=contents
+ )
+
+ # Set the result in the future
+ future.set_result(contents)
+
+ except Exception as e:
+ print(f"Error processing node {node_id}: {str(e)}")
+ future.set_exception(e)
+ raise
+
+ async def process_dependent_node(self, node_id: str, sub_query: str, depth, dep_futures: list, future):
+ """Process a dependent node asynchronously."""
+ try:
+ loop = asyncio.get_running_loop()
+
+ # Wait for dependencies
+ dep_data = [await f for f in dep_futures]
+
+ # Modify query based on dependencies
+ modified_query = await self.query_processor.modify_query(
+ sub_query,
+ dep_data
+ )
+
+ # Generate new embedding for modified query
+ embedding = await loop.run_in_executor(
+ self.executor,
+ self.model.encode,
+ modified_query
+ )
+
+ # Update node query and embedding atomically
+ with self.transaction() as tx:
+ tx.run(
+ """
+ MATCH (n:Node {id: $node_id})
+ SET n.query = $modified_query,
+ n.embedding = $embedding
+ """,
+ node_id=node_id,
+ modified_query=modified_query,
+ embedding=embedding.tolist()
+ )
+
+ # Process the modified node
+ try:
+ if not future.done():
+ await process_node(
+ self, node_id, modified_query, session_id, future, depth, max_tokens_allowed
+ )
+ except Exception as e:
+ if not future.done():
+ future.set_exception(e)
+ raise
+
+ except Exception as e:
+ print(f"Error processing dependent node {node_id}: {str(e)}")
+ if not future.done():
+ future.set_exception(e)
+ raise
+
+ def create_cross_connections(self, node_id=None, depth=None, role=None):
+ """Create cross connections based on dependencies."""
+ try:
+ # Get all logical relationships
+ relationships = self.get_node_relationships(
+ node_id=node_id,
+ depth=depth,
+ role=role,
+ relationship_type='logical'
+ )
+
+ for current_node_id, edges in relationships.items():
+ # Get node role
+ with self.transaction() as tx:
+ result = tx.run(
+ "MATCH (n:Node {id: $node_id}) RETURN n.role as role",
+ node_id=current_node_id
+ )
+ node_data = result.single()
+ if not node_data or not node_data["role"]:
+ continue
+
+ node_role = node_data["role"].lower()
+
+ # Only process dependent nodes
+ if node_role == 'dependent':
+ # Process incoming edges (dependencies)
+ for source_id, target_id, edge_data in edges['in_edges']:
+ if not source_id or source_id == self.root_node_id:
+ continue
+
+ # Create connection key
+ connection = tuple(sorted([current_node_id, source_id]))
+
+ # Add cross-connection if not exists
+ if connection not in self.cross_connections:
+ if not self.edge_exists(source_id, current_node_id):
+ print(f"Adding cross-connection edge between {source_id} and {current_node_id}")
+ self.add_edge(
+ source_id,
+ current_node_id,
+ weight=edge_data.get('weight', 1.0),
+ relationship_type='logical'
+ )
+ self.cross_connections.add(connection)
+
+ # Process outgoing edges (children)
+ for source_id, target_id, edge_data in edges['out_edges']:
+ if not target_id or target_id == self.root_node_id:
+ continue
+
+ # Create connection key
+ connection = tuple(sorted([current_node_id, target_id]))
+
+ # Add cross-connection if not exists
+ if connection not in self.cross_connections:
+ if not self.edge_exists(current_node_id, target_id):
+ print(f"Adding cross-connection edge between {current_node_id} and {target_id}")
+ self.add_edge(
+ current_node_id,
+ target_id,
+ weight=edge_data.get('weight', 1.0),
+ relationship_type='logical'
+ )
+ self.cross_connections.add(connection)
+
+ except Exception as e:
+ print(f"Error creating cross connections: {str(e)}")
+ raise
+
+ # Main build_graph implementation
+ # Limit recursion depth
+ if depth > 1:
+ return
+
+ # Initialize context if not provided
+ if context is None:
+ context = []
+
+ # Dictionary to keep track of node data and their futures
+ node_data_futures = {}
+
+ if parent_node_id is None:
+ # If no parent node, this is the root (original query)
+ self.add_node(self.root_node_id, query, data)
+ parent_node_id = self.root_node_id
+
+ # Get the query intent
+ intent = await self.query_processor.get_query_intent(query)
+
+ if depth == 0:
+ # Decompose the query into sub-queries
+ response_data, sub_queries, roles, dependencies = \
+ await self.query_processor.decompose_query_with_dependencies(query, intent)
+ else:
+ # Decompose the sub-query into sub-sub-queries with past context
+ response_data, sub_queries, roles, dependencies = \
+ await self.query_processor.decompose_query_with_dependencies(
+ query,
+ intent,
+ context
+ )
+
+ # Add current query data to context for next iteration
+ if response_data:
+ context.append(response_data)
+
+ # If no further decomposition is possible, sub_queries will contain only the original query
+ if len(sub_queries) > 1 and sub_queries[0] != query:
+ sub_query_ids = []
+ pre_req_nodes = {}
+
+ # Create the structure (nodes and edges) of the graph at the current level
+ for idx, (sub_query, role, dependency) in enumerate(zip(sub_queries, roles, dependencies)):
+ # If this is the sub-queries level,
+ # fire the event, letting the callback know about the sub-query
+ if depth == 0:
+ await self.emit_event(
+ "sub_query_created",
+ {
+ "depth": depth,
+ "sub_query": sub_query,
+ "role": role,
+ "dependency": dependency,
+ "parent_node_id": parent_node_id,
+ }
+ )
+
+ # Generate a unique ID for the sub-query
+ if depth == 0:
+ self.node_counter += 1
+ sub_node_id = f"SQ{self.node_counter}"
+ else:
+ self.sub_node_counter += 1
+ sub_node_id = f"SSQ{self.sub_node_counter}"
+
+ # Add the node ID to the list of sub-query IDs
+ sub_query_ids.append(sub_node_id)
+
+ # Add the node to the graph but without a data
+ self.add_node(node_id=sub_node_id, query=sub_query, role=role)
+
+ # Create future for the node
+ future = asyncio.Future()
+ node_data_futures[sub_node_id] = future
+
+ if role.lower() in ('pre-requisite', 'prerequisite'):
+ pre_req_nodes[idx] = sub_node_id
+
+ # Determine how to add edges based on the role
+ if role.lower() in ('pre-requisite', 'prerequisite', 'independent'):
+ # Pre-requisite and Independent nodes connect directly to the parent
+ self.add_edge(parent_node_id, sub_node_id, relationship_type='hierarchical')
+ elif role.lower() == 'dependent':
+ if isinstance(dependency, list) and (
+ (len(dependency) == 2 and all(isinstance(d, list) for d in dependency))
+ ):
+ print(f"Dependency: {dependency}")
+ # Handle previous query dependencies
+ prev_deps, current_deps = dependency
+
+ # Handle previous query dependencies
+ if context and prev_deps not in [None, []]:
+ for dep_idx in prev_deps:
+ if dep_idx is not None:
+ # Find the corresponding context data
+ for context_data in context:
+ if context_data and 'subqueries' in context_data:
+ if dep_idx < len(context_data['subqueries']):
+ # Get the query from context
+ sub_query_data = context_data['subqueries'][dep_idx]
+ if isinstance(sub_query_data, dict) and 'subquery' in sub_query_data:
+ dep_query = sub_query_data['subquery']
+ # Find matching nodes
+ matching_nodes = self.find_nodes_by_properties(query=dep_query)
+ # Get the best matching node ID and score
+ if matching_nodes not in [None, []]:
+ dep_node_id = matching_nodes[0].get('node_id')
+ score = matching_nodes[0].get('score', 0)
+ if score >= 0.9:
+ self.add_edge(dep_node_id, sub_node_id, relationship_type='logical')
+
+ # Add edges from current query dependencies
+ if current_deps not in [None, []]:
+ for dep_idx in current_deps:
+ if dep_idx < len(sub_queries):
+ dep_node_id = sub_query_ids[dep_idx]
+ self.add_edge(dep_node_id, sub_node_id, relationship_type='logical')
+ else:
+ # Dependency is incorrect
+ raise ValueError(f"Invalid dependency index: {dep_idx}")
+ elif len(dependency) > 0:
+ for dep_idx in dependency:
+ if dep_idx < len(sub_queries):
+ # Get the node ID of the dependency
+ dep_node_id = sub_query_ids[dep_idx]
+ # Add an edge from the dependency to the current sub-query
+ self.add_edge(dep_node_id, sub_node_id, relationship_type='logical')
+ else:
+ raise ValueError(f"Invalid dependency index: {dep_idx}")
+ else:
+ # Dependency is incorrect or empty
+ raise ValueError(f"Invalid dependency: {dependency}")
+ else:
+ # Handle any unexpected roles
+ raise ValueError(f"Unexpected role: {role}")
+
+ # Proceed to process the nodes
+ tasks = []
+
+ # Process pre-requisite and independent nodes concurrently
+ for idx in range(len(sub_queries)):
+ node_id = sub_query_ids[idx]
+ future = node_data_futures[node_id]
+ if roles[idx].lower() in ('pre-requisite', 'prerequisite', 'independent'):
+ tasks.append(process_node(
+ self, node_id, sub_queries[idx], session_id, future, depth, max_tokens_allowed
+ ))
+
+ # Process dependent nodes as soon as their dependencies are ready
+ for idx in range(len(sub_queries)):
+ node_id = sub_query_ids[idx]
+ future = node_data_futures[node_id]
+
+ if roles[idx].lower() == 'dependent':
+ dep_futures = []
+ if isinstance(dependencies[idx], list) and len(dependencies[idx]) == 2:
+ prev_deps, current_deps = dependencies[idx]
+
+ # Get futures from previous context dependencies
+ if context and prev_deps not in [None, []]:
+ for context_idx, context_data in enumerate(context):
+ # If prev_deps is a list, process the corresponding dependency
+ if isinstance(prev_deps, list) and context_idx < len(prev_deps):
+ context_dep = prev_deps[context_idx]
+ if context_dep is not None:
+ if context_data and 'subqueries' in context_data:
+ if context_dep < len(context_data['subqueries']):
+ sub_query_data = context_data['subqueries'][context_dep]
+ if isinstance(sub_query_data, dict) and 'subquery' in sub_query_data:
+ dep_query = sub_query_data['subquery']
+ # Find matching nodes
+ matching_nodes = self.find_nodes_by_properties(query=dep_query)
+ if matching_nodes not in [None, []]:
+ # Get the exact matching node ID and score
+ dep_node_id = matching_nodes[0].get('node_id', None)
+ score = float(matching_nodes[0].get('score', 0))
+ if score == 1.0 and dep_node_id in node_data_futures:
+ dep_futures.append(node_data_futures[dep_node_id])
+
+ # If prev_deps is an integer, process it for the current context
+ elif isinstance(prev_deps, int):
+ if prev_deps < len(context_data['subqueries']):
+ sub_query_data = context_data['subqueries'][prev_deps]
+ if isinstance(sub_query_data, dict) and 'subquery' in sub_query_data:
+ dep_query = sub_query_data['subquery']
+ # Find matching nodes
+ matching_nodes = self.find_nodes_by_properties(query=dep_query)
+ if matching_nodes not in [None, []]:
+ # Get the exact matching node ID and score
+ dep_node_id = matching_nodes[0].get('node_id', None)
+ score = matching_nodes[0].get('score', 0)
+ if score == 1.0 and dep_node_id in node_data_futures:
+ dep_futures.append(node_data_futures[dep_node_id])
+
+ # Get futures from current dependencies
+ if current_deps not in [None, []]:
+ current_deps_list = [current_deps] if isinstance(current_deps, int) else current_deps
+ for dep_idx in current_deps_list:
+ if dep_idx < len(sub_queries):
+ dep_node_id = sub_query_ids[dep_idx]
+ if dep_node_id in node_data_futures:
+ dep_futures.append(node_data_futures[dep_node_id])
+
+ # Start coroutine to wait for dependencies and then process node
+ tasks.append(process_dependent_node(
+ self, node_id, sub_queries[idx], depth, dep_futures, future
+ ))
+
+ # Emit an event to indicate the start of the search process
+ if depth == 0:
+ await self.emit_event("search_process_started", {
+ "depth": depth,
+ "sub_queries": sub_queries,
+ "roles": roles
+ })
+
+ # Wait for all tasks to complete
+ await asyncio.gather(*tasks)
+
+ # Recurse into sub-queries if needed
+ if recurse:
+ recursion_tasks = []
+ for idx, sub_query in enumerate(sub_queries):
+ try:
+ sub_node_id = sub_query_ids[idx]
+ recursion_tasks.append(
+ self.build_graph(
+ query=sub_query,
+ parent_node_id=sub_node_id,
+ depth=depth + 1,
+ threshold=threshold,
+ recurse=recurse,
+ context=context, # Pass the context
+ session_id=session_id
+ ))
+ except Exception as e:
+ print(f"Failed to create recursion task for sub-query {sub_query}: {e}")
+ continue
+
+ # Only proceed if there are any recursion tasks
+ if recursion_tasks:
+ try:
+ await asyncio.gather(*recursion_tasks)
+ except Exception as e:
+ raise Exception(f"Error during recursive processing: {e}")
+
+ # Process completion tasks
+ if depth == 0:
+ print("Graph building complete, processing final tasks...")
+ # Create cross-connections
+ create_cross_connections(self)
+ print("All cross-connections have been created!")
+
+ # Add similarity-based edges
+ print(f"Adding similarity edges with threshold {threshold}")
+ all_nodes = []
+ with self.driver.session() as session:
+ result = session.run(
+ "MATCH (n:Node) WHERE n.id <> $root_id RETURN n.id as id",
+ root_id=self.root_node_id
+ )
+ all_nodes = [record["id"] for record in result]
+
+ for i, node1 in enumerate(all_nodes):
+ for node2 in all_nodes[i+1:]:
+ if not self.edge_exists(node1, node2):
+ self.add_edge_based_on_similarity_and_relevance(
+ node1, node2, query, threshold
+ )
+
+ async def process_graph(
+ self,
+ query: str,
+ data: str = None,
+ similarity_threshold: float = 0.8,
+ relevance_threshold: float = 0.7,
+ sub_sub_queries: bool = True,
+ session_id: str = None,
+ max_tokens_allowed: int = 128000
+ ):
+ """Process a query and manage graph creation/modification."""
+
+ # Inner function to check similarity between new query and existing queries in the graph
+ def check_query_similarity(new_query: str, similarity_threshold: float = 0.8) -> Dict[str, Any]:
+ if self.current_graph_id is None:
+ raise Exception("Error: No current graph ID. Cannot check query similarity.")
+
+ try:
+ # Get all existing queries of the current graph and their metadata from Neo4j
+ print(f"Retrieving existing queries and their metadata for graph {self.current_graph_id}")
+ with self.transaction() as tx:
+ result = tx.run("""
+ MATCH (n:Node)
+ WHERE n.graph_id IS NOT NULL
+ AND n.graph_id = $graph_id
+ RETURN n.id as id,
+ n.query as query,
+ n.role as role
+ """,
+ graph_id=self.current_graph_id
+ )
+
+ # Process results and calculate similarities
+ similarities = []
+ records = list(result) # Materialize results to avoid session timeout
+
+ if records == []: # No existing queries
+ return {"should_create_new": True}
+
+ for record in records:
+ # Skip if missing required data
+ if not all([record["query"]]):
+ continue
+
+ # Calculate query similarity
+ similarity = self.calculate_query_similarity(
+ new_query,
+ record["query"]
+ )
+
+ if similarity >= similarity_threshold:
+ similarities.append({
+ "node_id": record["id"],
+ "query": record["query"],
+ "score": similarity,
+ "role": record["role"]
+ })
+
+ # If no similar queries found
+ if similarities == []:
+ print(f"No similar queries found above threshold {similarity_threshold}")
+ return {"should_create_new": True}
+
+ # Find best match
+ best_match = max(similarities, key=lambda x: x["score"])
+
+ # Determine relationship type based on node ID pattern
+ rel_type = "root"
+ if "SSQ" in best_match["node_id"]:
+ rel_type = "sub-sub"
+ elif "SQ" in best_match["node_id"]:
+ rel_type = "sub"
+
+ return {
+ "most_similar_query": best_match["query"],
+ "similarity_score": best_match["score"],
+ "relationship_type": rel_type,
+ "node_id": best_match["node_id"],
+ "should_create_new": best_match["score"] < similarity_threshold
+ }
+
+ except Exception as e:
+ print(f"Error checking query similarity: {str(e)}")
+ raise
+
+ try:
+ # Check if a graph already exists
+ print("Checking for existing graphs...")
+ result = self.get_graphs()
+ graphs = list(result)
+
+ if graphs == []: # No existing graphs
+ print("No existing graphs found. Creating new graph.")
+ self.create_new_graph()
+ # Emit event for creating a new graph
+ await self.emit_event("graph_operation", {"operation_type": "creating_new_graph"})
+ await self.build_graph(
+ query=query,
+ data=data,
+ threshold=relevance_threshold,
+ recurse=sub_sub_queries,
+ session_id=session_id,
+ max_tokens_allowed=max_tokens_allowed
+ )
+ # Memory cleanup
+ gc.collect()
+
+ # Prune edges and update pagerank
+ self.prune_edges()
+ self.update_pagerank()
+
+ # Verify graph integrity and consistency
+ self.verify_graph_integrity()
+ self.verify_graph_consistency()
+ return
+
+ # Check similarity with existing root queries
+ max_similarity = 0
+ most_similar_graph = None
+
+ # First, consolidate nodes from graphs with same ID
+ consolidated_graphs = {}
+ for graph in graphs:
+ graph_info = graph.get("graph_info")
+ if not graph_info:
+ continue
+
+ graph_id = graph_info.get("graph_id")
+ if not graph_id:
+ continue
+
+ # Initialize or append nodes for this graph_id
+ if graph_id not in consolidated_graphs:
+ consolidated_graphs[graph_id] = {
+ "graph_id": graph_id,
+ "nodes": []
+ }
+
+ # Add nodes if they exist
+ if graph_info.get("nodes"):
+ consolidated_graphs[graph_id]["nodes"].extend(graph_info["nodes"])
+
+ # Now process the consolidated graphs
+ for graph_id, graph_data in consolidated_graphs.items():
+ nodes = graph_data["nodes"]
+
+ # Calculate similarity with each node's query
+ for node in nodes:
+ if node.get("query"): # Skip nodes without queries
+ similarity = self.calculate_query_similarity(
+ query,
+ node["query"]
+ )
+
+ if node.get("id").startswith("SQ"):
+ await self.emit_event("retrieved_sub_query", {
+ "sub_query": node["query"]
+ })
+
+ if similarity > max_similarity:
+ max_similarity = similarity
+ most_similar_graph = graph_id
+
+ if max_similarity >= similarity_threshold:
+ # Use existing graph
+ print(f"Found similar query with score {round(max_similarity, 2)}")
+ self.current_graph_id = most_similar_graph
+
+ if round(max_similarity, 2) == 1.0:
+ print("Loading and using existing graph")
+ # Emit event for loading an existing graph
+ await self.emit_event("graph_operation", {"operation_type": "loading_existing_graph"})
+ success = self.load_graph(self.root_node_id)
+ if not success:
+ raise Exception("Failed to load existing graph")
+ else:
+ # Check for node-level similarity
+ print("Checking for node-level similarity...")
+ similarity_info = check_query_similarity(
+ query,
+ similarity_threshold
+ )
+
+ if similarity_info["relationship_type"] in ["sub", "sub-sub"]:
+ print(f"Most Similar Query: {similarity_info['most_similar_query']}")
+ print("Modifying existing graph structure")
+ # Emit event for modifying the graph
+ await self.emit_event("graph_operation", {"operation_type": "modifying_existing_graph"})
+ await self.modify_graph(
+ query,
+ similarity_info["node_id"],
+ session_id=session_id
+ )
+ # Memory cleanup
+ gc.collect()
+
+ # Prune edges and update pagerank
+ self.prune_edges()
+ self.update_pagerank()
+
+ # Verify graph integrity and consistency
+ self.verify_graph_integrity()
+ self.verify_graph_consistency()
+ else:
+ # Create new graph
+ print(f"Creating new graph for query: {query}")
+ self.create_new_graph()
+ # Emit event for creating a new graph
+ await self.emit_event("graph_operation", {"operation_type": "creating_new_graph"})
+ await self.build_graph(
+ query=query,
+ data=data,
+ threshold=relevance_threshold,
+ recurse=sub_sub_queries,
+ session_id=session_id,
+ max_tokens_allowed=max_tokens_allowed
+ )
+ # Memory cleanup
+ gc.collect()
+
+ # Prune edges and update pagerank
+ self.prune_edges()
+ self.update_pagerank()
+
+ # Verify graph integrity and consistency
+ self.verify_graph_integrity()
+ self.verify_graph_consistency()
+
+ except Exception as e:
+ print(f"Error in process_graph: {str(e)}")
+ raise
+
+ def add_edge_based_on_similarity_and_relevance(self, node1_id: str, node2_id: str, query: str, threshold: float = 0.8):
+ """Add edges based on node similarity and relevance."""
+ try:
+ with self.transaction() as tx:
+ # Get node data atomically
+ result = tx.run(
+ """
+ MATCH (n1:Node {id: $node1_id})
+ WITH n1
+ MATCH (n2:Node {id: $node2_id})
+ RETURN n1.embedding as emb1, n1.data as data1,
+ n2.embedding as emb2, n2.data as data2
+ """,
+ node1_id=node1_id,
+ node2_id=node2_id
+ )
+ data = result.single()
+ if not data or not all([data["emb1"], data["emb2"], data["data1"], data["data2"]]):
+ return
+
+ # Calculate similarities and relevance
+ similarity = self.cosine_similarity(data["emb1"], data["emb2"])
+ query_relevance1 = self.calculate_relevance(query, data["data1"])
+ query_relevance2 = self.calculate_relevance(query, data["data2"])
+ node_relevance = self.calculate_relevance(data["data1"], data["data2"])
+
+ # Calculate weight
+ weight = (similarity + query_relevance1 + query_relevance2 + node_relevance) / 4
+
+ # Add edge if weight exceeds threshold
+ if weight >= threshold:
+ tx.run(
+ """
+ MATCH (a:Node {id: $node1_id}), (b:Node {id: $node2_id})
+ MERGE (a)-[r:RELATION {type: 'similarity_and_relevance'}]->(b)
+ ON CREATE SET r.weight = $weight
+ ON MATCH SET r.weight = $weight
+ """,
+ node1_id=node1_id,
+ node2_id=node2_id,
+ weight=weight
+ )
+ print(f"Added edge between {node1_id} and {node2_id} with type similarity_and_relevance and weight {weight}")
+
+ except Exception as e:
+ print(f"Error in similarity edge creation between {node1_id} and {node2_id}: {str(e)}")
+ raise
+
+ def calculate_relevance(self, data1: str, data2: str) -> float:
+ """Calculate relevance between two data."""
+ try:
+ if not data1 or not data2:
+ return 0.0
+
+ P, R, F1 = self.scorer.score([data1], [data2])
+ return F1.mean().item()
+
+ except Exception as e:
+ print(f"Error calculating relevance: {str(e)}")
+ return 0.0
+
+ def calculate_query_similarity(self, query1: str, query2: str) -> float:
+ """Calculate similarity between two queries."""
+ try:
+ # Generate embeddings
+ embedding1 = self.model.encode(query1).tolist()
+ embedding2 = self.model.encode(query2).tolist()
+
+ # Calculate cosine similarity
+ return self.cosine_similarity(embedding1, embedding2)
+
+ except Exception as e:
+ print(f"Error calculating query similarity: {str(e)}")
+ return 0.0
+
+ def get_similarities_and_relevance(self, threshold: float = 0.8) -> list:
+ """Get similarities and relevance between nodes."""
+ try:
+ with self.transaction() as tx:
+ # Get all nodes except root
+ result = tx.run(
+ """
+ MATCH (n:Node)
+ WHERE n.id <> $root_id
+ RETURN n.id as id, n.embedding as embedding, n.data as data
+ """,
+ root_id=self.root_node_id
+ )
+
+ nodes = list(result)
+ similarities = []
+
+ # Calculate similarities between each pair
+ for i, node1 in enumerate(nodes):
+ for node2 in nodes[i + 1:]:
+ similarity = self.cosine_similarity(node1["embedding"], node2["embedding"])
+ relevance = self.calculate_relevance(node1["data"], node2["data"])
+
+ # Calculate weight
+ weight = (similarity + relevance) / 2
+
+ # Add to results if meets threshold
+ if weight >= threshold:
+ similarities.append({
+ 'node1': node1["id"],
+ 'node2': node2["id"],
+ 'similarity': similarity,
+ 'relevance': relevance,
+ 'weight': weight
+ })
+
+ return similarities
+
+ except Exception as e:
+ print(f"Error getting similarities and relevance: {str(e)}")
+ return []
+
+ def get_node_relationships(self, node_id=None, depth=None, role=None, relationship_type=None):
+ """Get relationships between nodes with filtering options."""
+ try:
+ with self.transaction() as tx:
+ # Build base query
+ cypher_query = """
+ MATCH (n:Node)
+ WHERE n.id <> $root_id
+ AND n.graph_id = $current_graph_id
+ """
+ params = {
+ "root_id": self.root_node_id,
+ "current_graph_id": self.current_graph_id
+ }
+
+ # Add filters
+ if node_id:
+ cypher_query += " AND n.id = $node_id"
+ params["node_id"] = node_id
+ if role:
+ cypher_query += " AND n.role = $role"
+ params["role"] = role
+ if depth is not None:
+ cypher_query += " AND n.depth = $depth"
+ params["depth"] = depth
+
+ # First get outgoing relationships
+ cypher_query += """
+ WITH n
+ OPTIONAL MATCH (n)-[r1:RELATION]->(m1:Node)
+ WHERE m1.id <> $root_id
+ AND m1.graph_id = $current_graph_id
+ """
+
+ # Add relationship type filter if specified
+ if relationship_type:
+ cypher_query += " AND r1.type = $rel_type"
+ params["rel_type"] = relationship_type
+
+ # Then get incoming relationships in a separate match
+ cypher_query += """
+ WITH n, collect({source: n.id, target: m1.id, weight: r1.weight, type: r1.type}) as out_edges
+ OPTIONAL MATCH (n)<-[r2:RELATION]-(m2:Node)
+ WHERE m2.id <> $root_id
+ AND m2.graph_id = $current_graph_id
+ """
+
+ # Add same relationship type filter for incoming edges
+ if relationship_type:
+ cypher_query += " AND r2.type = $rel_type"
+
+ # Return both collections
+ cypher_query += """
+ RETURN n.id as node_id,
+ collect({source: m2.id, target: n.id, weight: r2.weight, type: r2.type}) as in_edges,
+ out_edges
+ """
+
+ result = tx.run(cypher_query, params)
+ relationships = {}
+
+ for record in result:
+ node_id = record["node_id"]
+ relationships[node_id] = {
+ 'in_edges': [(edge['source'], edge['target'], {
+ 'weight': edge['weight'],
+ 'type': edge['type']
+ }) for edge in record["in_edges"] if edge['source'] is not None],
+ 'out_edges': [(edge['source'], edge['target'], {
+ 'weight': edge['weight'],
+ 'type': edge['type']
+ }) for edge in record["out_edges"] if edge['target'] is not None]
+ }
+
+ return relationships
+
+ except Exception as e:
+ print(f"Error getting node relationships: {str(e)}")
+ raise
+
+ def find_nodes_by_properties(self, query: str = None, embedding: list = None,
+ node_data: dict = None, similarity_threshold: float = 0.8) -> list:
+ """Find nodes based on properties."""
+ try:
+ with self.transaction() as tx:
+ match_conditions = []
+ where_conditions = []
+ params = {}
+
+ # Build query conditions
+ if query:
+ where_conditions.append("n.query CONTAINS $node_query")
+ params["node_query"] = query
+
+ if node_data:
+ for key, value in node_data.items():
+ where_conditions.append(f"n.{key} = ${key}")
+ params[key] = value
+
+ # Construct the base query
+ cypher_query = "MATCH (n:Node)"
+ if where_conditions:
+ cypher_query += " WHERE " + " AND ".join(where_conditions)
+ cypher_query += " RETURN n"
+
+ result = tx.run(cypher_query, params)
+ matching_nodes = []
+
+ # Process results and calculate similarities
+ for record in result:
+ node = record["n"]
+ match_score = 0
+ matches = 0
+
+ # Score based on property matches
+ if query and query.lower() in node["query"].lower():
+ match_score += 1
+ matches += 1
+
+ # Score based on embedding similarity
+ if embedding and "embedding" in node:
+ similarity = self.cosine_similarity(embedding, node["embedding"])
+ if similarity >= similarity_threshold:
+ match_score += similarity
+ matches += 1
+
+ # Score based on node_data matches
+ if node_data:
+ data_matches = sum(1 for k, v in node_data.items()
+ if k in node and node[k] == v)
+ if data_matches > 0:
+ match_score += data_matches / len(node_data)
+ matches += 1
+
+ # Add to results if any match found
+ if matches > 0:
+ matching_nodes.append({
+ "node_id": node["id"],
+ "score": match_score / matches,
+ "data": dict(node)
+ })
+
+ # Sort by score
+ matching_nodes.sort(key=lambda x: x["score"], reverse=True)
+ return matching_nodes
+
+ except Exception as e:
+ print(f"Error finding nodes by properties: {str(e)}")
+ raise
+
+ def query_graph(self, query: str) -> str:
+ """Query the graph in Neo4j for a specific query, collecting data from the entire relevant subgraph."""
+ try:
+ with self.transaction() as tx:
+ # Find the query node
+ query_node = tx.run("""
+ MATCH (n:Node {query: $node_query})
+ WHERE n.graph_id = $graph_id
+ RETURN n
+ """, node_query=query, graph_id=self.current_graph_id).single()
+
+ if not query_node:
+ raise ValueError(f"Query node not found for: {query}")
+
+ query_node_id = query_node['n']['id']
+ datas = []
+
+ # Get entire subgraph including all relationship types and independent nodes
+ subgraph_paths = tx.run("""
+ // First get the query node and all its connected paths
+ MATCH path = (n:Node {id: $node_id})-[r:RELATION*0..]->(m:Node)
+ WHERE n.graph_id = $graph_id
+
+ // Collect all nodes and relationships in these paths
+ WITH COLLECT(path) as paths
+ UNWIND paths as path
+ WITH DISTINCT path
+
+ // Get all nodes and relationships from the paths
+ WITH nodes(path) as nodes, relationships(path) as rels
+
+ // Calculate path weight considering all relationship types
+ WITH nodes, rels,
+ reduce(weight = 1.0, rel in rels |
+ CASE rel.type
+ WHEN 'logical' THEN weight * rel.weight * 1.2
+ WHEN 'hierarchical' THEN weight * rel.weight * 1.1
+ WHEN 'similarity_and_relevance' THEN weight * rel.weight * 0.9
+ ELSE weight * rel.weight
+ END
+ ) as path_weight
+
+ // Unwind nodes to get individual records
+ UNWIND nodes as node
+ WITH DISTINCT node, path_weight
+ WHERE node.data IS NOT NULL
+ AND node.data <> '' // Ensure data is not empty
+
+ // Return ordered by weight and pagerank for better context flow
+ RETURN node.data as data,
+ path_weight,
+ node.role as role,
+ node.pagerank as pagerank
+ ORDER BY
+ CASE node.role
+ WHEN 'pre-requisite' THEN 3
+ WHEN 'independent' THEN 2
+ ELSE 1
+ END DESC,
+ path_weight DESC,
+ pagerank DESC
+ """, node_id=query_node_id, graph_id=self.current_graph_id)
+
+ # Collect data in the order they were returned (already optimally sorted)
+ for record in subgraph_paths:
+ data = record["data"]
+ if data and isinstance(data, str):
+ datas.append(data.strip())
+
+ # If no data are found, return an empty string
+ if datas == []:
+ print(f"No data found for: {query}")
+ return ""
+
+ # Return combined data
+ return "\n\n".join([f"Data {i+1}:\n{data}" for i, data in enumerate(datas)])
+
+ except Exception as e:
+ print(f"Error querying graph for specific query: {str(e)}")
+ raise
+
+ def prune_edges(self, max_edges: int = 1000):
+ """Prune excess edges while preserving node data."""
+ try:
+ with self.transaction() as tx:
+ try:
+ # Count current edges
+ result = tx.run(
+ """
+ MATCH (a:Node {graph_id: $graphID})-[r:RELATION]->(b:Node {graph_id: $graphID})
+ RETURN count(r) AS count
+ """,
+ graphID=self.current_graph_id
+ )
+ current_edges = result.single()["count"]
+
+ if current_edges > max_edges:
+ # Mark edges to keep
+ tx.run(
+ """
+ MATCH (a:Node {graph_id: $graphID})-[r:RELATION]->(b:Node {graph_id: $graphID})
+ WITH r
+ ORDER BY r.weight DESC
+ LIMIT $max_edges
+ SET r:KEEP
+ """,
+ graphID=self.current_graph_id,
+ max_edges=max_edges
+ )
+
+ # Remove excess edges
+ tx.run(
+ """
+ MATCH (a:Node {graph_id: $graphID})-[r:RELATION]->(b:Node {graph_id: $graphID})
+ WHERE NOT r:KEEP
+ DELETE r
+ """,
+ graphID=self.current_graph_id
+ )
+
+ # Remove temporary label
+ tx.run(
+ """
+ MATCH (a:Node {graph_id: $graphID})-[r:KEEP]->(b:Node {graph_id: $graphID})
+ REMOVE r:KEEP
+ """,
+ graphID=self.current_graph_id
+ )
+
+ tx.commit()
+ print(f"Pruned edges. Kept top {max_edges} edges by weight.")
+
+ except Exception as e:
+ tx.rollback()
+ raise e
+
+ except Exception as e:
+ print(f"Error pruning edges: {str(e)}")
+ raise
+
+ def update_pagerank(self):
+ """Update PageRank values using Neo4j's graph algorithms."""
+ if not self.current_graph_id:
+ print("No current graph selected. Cannot compute PageRank.")
+ return
+
+ try:
+ with self.transaction() as tx:
+ # Create graph projection with weighted relationships
+ tx.run(
+ """
+ CALL gds.graph.project.cypher(
+ 'graphProjection',
+ 'MATCH (n:Node) WHERE n.graph_id = $myParam RETURN id(n) AS id',
+ 'MATCH (n:Node)-[r:RELATION]->(m:Node)
+ WHERE n.graph_id = $myParam AND m.graph_id = $myParam
+ RETURN id(n) AS source,
+ id(m) AS target,
+ CASE r.type
+ WHEN "logical" THEN r.weight * 2
+ ELSE r.weight
+ END AS weight',
+ { parameters: { myParam: $graphId } }
+ )
+ """,
+ graphId=self.current_graph_id
+ )
+
+ # Run PageRank with relationship weights
+ tx.run(
+ """
+ CALL gds.pageRank.write(
+ 'graphProjection',
+ {
+ relationshipWeightProperty: 'weight',
+ writeProperty: 'pagerank',
+ maxIterations: 20,
+ dampingFactor: 0.85,
+ concurrency: 4
+ }
+ )
+ """
+ )
+
+ # Clean up projection
+ tx.run(
+ """
+ CALL gds.graph.drop('graphProjection')
+ """
+ )
+
+ print("PageRank updated successfully")
+
+ except Exception as e:
+ print(f"Error updating PageRank: {str(e)}")
+ raise
+
+ def display_graph(self, query: str):
+ """Display the graph"""
+ try:
+ with self.transaction() as tx:
+ # 1. Find the graph_id(s) of the node using the provided query
+ cypher_query = """
+ MATCH (n:Node)
+ WHERE n.query = $node_query
+ RETURN COLLECT(DISTINCT n.graph_id) AS graph_ids
+ """
+ result = tx.run(cypher_query, node_query=query)
+ graph_ids = result.single().get("graph_ids", [])
+
+ if not graph_ids:
+ print("No graph found for the given query.")
+ return
+
+ # Create the PyVis network once, so we can add all data to it:
+ net = Network(
+ height="600px",
+ width="100%",
+ directed=True,
+ bgcolor="#222222",
+ font_color="white"
+ )
+
+ # Disable physics initially
+ net.options = {"physics": {"enabled": False}}
+
+ all_nodes = set()
+ all_edges = []
+
+ for graph_id in graph_ids:
+ # 2. Fetch Graph Data for this graph_id
+ result = tx.run(f"MATCH (n)-[r]->(m) WHERE n.graph_id = '{graph_id}' RETURN n, r, m")
+
+ for record in result:
+ source_node = record["n"]
+ target_node = record["m"]
+ relationship = record["r"]
+
+ source_id = source_node.get("id")
+ target_id = target_node.get("id")
+
+ # Build a descriptive tooltip for each node
+ source_tooltip = (
+ f"Query: {source_node.get('query', 'N/A')}"
+ )
+
+ target_tooltip = (
+ f"Query: {target_node.get('query', 'N/A')}"
+ )
+
+ # Add source node if not already in the set
+ if source_id not in all_nodes:
+ net.add_node(
+ source_id,
+ label=source_id,
+ title=source_tooltip,
+ size=20,
+ color="#00cc66"
+ )
+ all_nodes.add(source_id)
+
+ # Add target node if not already in the set
+ if target_id not in all_nodes:
+ net.add_node(
+ target_id,
+ label=target_id,
+ title=target_tooltip,
+ size=20,
+ color="#00cc66"
+ )
+ all_nodes.add(target_id)
+
+ # Add edge
+ all_edges.append({
+ "from": source_id,
+ "to": target_id,
+ "label": relationship.type,
+ })
+
+ # Add all edges
+ for edge in all_edges:
+ net.add_edge(
+ edge["from"],
+ edge["to"],
+ title=edge["label"],
+ color="#cccccc"
+ )
+
+ # 4. Enable improved layout and dragNodes
+ net.options["layout"] = {"improvedLayout": True}
+ net.options["interaction"] = {"dragNodes": True}
+
+ # 5. Save to a temporary file, read it, then remove that file
+ net.save_graph("temp_graph.html")
+ with open("temp_graph.html", "r", encoding="utf-8") as f:
+ html_str = f.read()
+
+ os.remove("temp_graph.html") # Clean up the temp file
+
+ return html_str
+
+ except Exception as e:
+ print(f"Error displaying graph: {str(e)}")
+ raise
+
+ def verify_graph_integrity(self):
+ """Verify and fix graph integrity issues."""
+ try:
+ with self.transaction() as tx:
+ # Check for orphaned nodes
+ orphaned = tx.run(
+ """
+ MATCH (n:Node {graph_id: $graph_id})
+ WHERE NOT (n)-[:RELATION]-()
+ RETURN n.id as node_id
+ """,
+ graph_id=self.current_graph_id
+ ).values()
+
+ if orphaned:
+ print(f"Found orphaned nodes: {orphaned}")
+
+ # Check for invalid edges
+ invalid_edges = tx.run(
+ """
+ MATCH (a:Node)-[r:RELATION]->(b:Node)
+ WHERE a.graph_id = $graph_id
+ AND (b.graph_id <> $graph_id OR b.graph_id IS NULL)
+ RETURN a.id as from_id, b.id as to_id
+ """,
+ graph_id=self.current_graph_id
+ ).values()
+
+ if invalid_edges:
+ print(f"Found invalid edges: {invalid_edges}")
+ # Optionally fix issues
+ tx.run(
+ """
+ MATCH (a:Node)-[r:RELATION]->(b:Node)
+ WHERE a.graph_id = $graph_id
+ AND (b.graph_id <> $graph_id OR b.graph_id IS NULL)
+ DELETE r
+ """,
+ graph_id=self.current_graph_id
+ )
+
+ print("Graph integrity verified successfully")
+ return True
+
+ except Exception as e:
+ print(f"Error verifying graph integrity: {str(e)}")
+ raise
+
+ def verify_graph_consistency(self):
+ """Verify consistency of the Neo4j graph."""
+ try:
+ with self.driver.session() as session:
+ # Check for nodes without required properties
+ missing_props = session.run("""
+ MATCH (n:Node)
+ WHERE n.id IS NULL OR n.query IS NULL
+ RETURN count(n) as count
+ """)
+
+ if missing_props.single()["count"] > 0:
+ raise ValueError("Found nodes with missing required properties")
+
+ # Check for relationship consistency
+ invalid_rels = session.run("""
+ MATCH ()-[r:RELATION]->()
+ WHERE r.type IS NULL OR r.weight IS NULL
+ RETURN count(r) as count
+ """)
+
+ if invalid_rels.single()["count"] > 0:
+ raise ValueError("Found relationships with missing required properties")
+
+ print("Graph consistency verified successfully")
+ return True
+
+ except Exception as e:
+ print(f"Error verifying graph consistency: {str(e)}")
+ raise
+
+ async def close(self):
+ """Properly cleanup all resources."""
+ try:
+ # Shutdown executor
+ if hasattr(self, 'executor'):
+ self.executor.shutdown(wait=True)
+
+ # Close Neo4j driver
+ if hasattr(self, 'driver'):
+ self.driver.close()
+
+ # Cleanup crawler resources and browser contexts
+ if hasattr(self, 'crawler'):
+ await asyncio.shield(self.crawler.cleanup_expired_sessions())
+ await asyncio.shield(self.crawler.cleanup_browser_context(self.session_id))
+
+ except Exception as e:
+ print(f"Error during cleanup: {e}")
+
+ @staticmethod
+ def cosine_similarity(v1: List[float], v2: List[float]) -> float:
+ """Calculate cosine similarity between two vectors."""
+ try:
+ v1_array = np.array(v1)
+ v2_array = np.array(v2)
+ return np.dot(v1_array, v2_array) / (np.linalg.norm(v1_array) * np.linalg.norm(v2_array))
+
+ except Exception as e:
+ print(f"Error calculating cosine similarity: {str(e)}")
+ return 0.0
+
+if __name__ == "__main__":
+ import os
+ from dotenv import load_dotenv
+ from src.reasoning.reasoner import Reasoner
+ from src.evaluation.evaluator import Evaluator
+
+ load_dotenv()
+
+ graph_search = Neo4jGraphRAG(num_workers=24)
+ evaluator = Evaluator()
+ reasoner = Reasoner()
+
+ async def test_graph_search():
+ # Sample data for testing
+ queries = [
+"""In the context of global economic recovery and energy security concerns, provide an in-depth comparative assessment of the renewable energy policies among G20 countries.
+Specifically, examine how short-term economic stimulus measures intersect with long-term decarbonization commitments, including:
+1. Carbon pricing mechanisms
+2. Subsidies for emerging technologies (such as green hydrogen and battery storage)
+3. Cross-border climate finance initiatives
+
+Highlight the unique challenges faced by both advanced and emerging economies in addressing:
+1. Energy poverty
+2. Supply chain disruptions
+3. Geopolitical tensions (e.g., the Russia-Ukraine conflict)
+
+Discuss how these factors influence policy effectiveness, and evaluate the degree to which each country is on track to meet—or exceed—its Paris Agreement targets.
+Note any significant policy gaps, regional collaborations, or innovative best practices.
+Lastly, provide a forward-looking perspective on how these renewable energy strategies may evolve over the next decade, considering:
+1. Technological breakthroughs
+2. Global market trends
+3. Potential climate-related disasters
+
+Present your analysis as a detailed, well-formatted report.""",
+"""Analyse the impact of 'hot-money' on the value of Indian Rupee and answer the following questions:-
+1. How does it affect the exchange rate?
+2. How can it be mitigated/eliminated?
+3. Why is it a problem?
+4. What are the consequences?
+5. What are the alternatives?
+ - Evaluate the alternatives for pros and cons.
+ - Evaluate the impact of alternatives on the exchange rate.
+ - How can they be implemented?
+ - What are the consequences of each alternative?
+ - Evaluate the feasibility of the alternatives.
+ - Pick top 5 alternatives and justify your choices in detail.
+6. What are the implications for the Indian economy? Furthermore:-
+ - Evaluate the impact of the chosen alternatives on the Indian economy.""",
+"""Inflation has been an intrinsic past of human civilization since the very beginning. Answer the following questions:-
+1. How true is the above statement?
+2. What are the causes of inflation?
+3. What are the consequences of inflation?
+4. Can we completely eliminate inflation?""",
+"""Perform a detailed comparison between the ancient Greece and Roman civilizations.
+1. What were the key differences between the two civilizations?
+ - Evaluate the differences in governance, society, and culture
+ - Evaluate the differences in economy, trade, and military
+ - Evaluate the differences in technology and infrastructure
+2. What were the similarities between the two civilizations?
+ - Evaluate the similarities in governance, society, and culture
+ - Evaluate the similarities in economy, trade, and military
+ - Evaluate the similarities in technology and infrastructure
+3. How did these two civilizations influence each other?
+ - Evaluate the influence of one civilization on the other
+4. How did these two civilizations influence the modern world?
+5. Was there another civilization that influenced these two? If yes, how?""",
+"""Evaluate the long-term effects of colonialism on economic development in Asia:-
+1. Include case studies of at least five different countries
+2. Analyze how these effects differ based on colonial power, time of independence, and resource distribution
+ - Evaluate the impact of colonialism on the economy of the country
+ - Evaluate the impact of colonialism on the economy of the region
+ - Evaluate the impact of colonialism on the economy of the world
+3. How do these effects compare to Africa?"""
+ ]
+ follow_on_queries = [
+ "How is 'hot-money' related to the current economic situation in India?",
+ "What is inflation?",
+ "Did ancient Greece and Rome have any impact on modern democracy? If yes, how?",
+ "Did colonialism have any impact on the trade between Africa and Asia, both in colonial and post-colonial times? If yes, how?"
+ ]
+
+ query = queries[2]
+
+ # Initialize the database schema
+ graph_search.initialize_schema()
+
+ # Build the graph in Neo4j
+ await graph_search.process_graph(query, similarity_threshold=0.8, relevance_threshold=0.8)
+
+ # Query the graph and generate a response
+ answer = graph_search.query_graph(query)
+ response = ""
+ async for chunk in reasoner.reason(query, answer):
+ response += chunk
+ print(response, end="", flush=True)
+
+ # Display the graph
+ graph_search.display_graph(query)
+
+ # Evaluate the response
+ evaluation = await evaluator.evaluate_response(query, response, [answer])
+ print(f"Faithfulness: {evaluation['faithfulness']}")
+ print(f"Answer Relevancy: {evaluation['answer relevancy']}")
+ print(f"Context Utilization: {evaluation['contextual recall']}")
+
+ # Shutdown the executor after all tasks are complete
+ await graph_search.close()
+
+ # Run the test function
+ asyncio.run(test_graph_search())
\ No newline at end of file
diff --git a/src/reasoning/__init__.py b/src/reasoning/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/reasoning/reasoner.py b/src/reasoning/reasoner.py
new file mode 100644
index 0000000000000000000000000000000000000000..0631b2ded51eb7d9a52229c090b76a322f2f9846
--- /dev/null
+++ b/src/reasoning/reasoner.py
@@ -0,0 +1,120 @@
+from langchain.prompts import ChatPromptTemplate
+from langchain_core.prompts import ChatPromptTemplate
+from src.utils.api_key_manager import APIKeyManager
+from src.utils.api_key_manager import with_api_manager
+from src.query_processing.late_chunking.late_chunker import LateChunker
+
+class Reasoner:
+ def __init__(self):
+ self.manager = APIKeyManager()
+ self.model = self.manager.get_llm()
+
+ @with_api_manager(streaming=True)
+ async def reason(
+ self,
+ query,
+ context=None,
+ *,
+ llm
+ ):
+ if context is None:
+ template = \
+"""You are an expert at reasoning.
+Your task is to reason about the given user query and provide an answer.
+
+Rules:
+1. Your response should only be the answer in plain text without any formatting.
+2. You must use proper reasoning and logic to answer the query for your internal use but do not show your reasoning process in the response.
+
+Query:
+{query}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(query=query)
+ else:
+ template = \
+"""You are an expert at reasoning.
+Given the user query and the relevant context, your task is to reason and provide an answer.
+
+Rules:
+1. Your response should only be the answer in plain text without any formatting.
+2. You must use proper reasoning and logic to answer the query for your internal use but do not show your reasoning process in the response.
+3. You must not mention the context/documents provided to you in the response. Make it sound like you are the one who is answering the query.
+
+Context:
+[{context}]
+
+Query:
+{query}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(context=context, query=query)
+
+ try:
+ async for chunk in llm.astream(messages):
+ yield chunk.content
+ except Exception as e:
+ raise e
+
+ @with_api_manager()
+ async def summarize(
+ self,
+ query,
+ content,
+ model_name="minishlab/potion-base-8M",
+ max_chunk_length=1000,
+ max_tokens_allowed=None,
+ overlap=200,
+ *,
+ llm
+ ):
+ if max_tokens_allowed:
+ late_chunker = LateChunker(model_name=model_name)
+ content_tokens = self.model.get_num_tokens(content)
+
+ if content_tokens > max_tokens_allowed:
+ print("Content is too long, applying late chunking...")
+ content = await late_chunker.chunker(
+ text=content,
+ query=query,
+ max_chunk_length=max_chunk_length,
+ max_tokens=max_tokens_allowed,
+ overlap=overlap
+ )
+
+ template= \
+"""You are an expert at summarizing long documents.
+Your task is to create a concise but detailed summary of documents that ultimately lead to detailed and precise answers to the queries.
+
+Rules:
+1. The summary should be concise but detailed, precise and accurate.
+2. Focus on extracting key information, facts, and data that are directly relevant to the query.
+3. Include specific details, numbers, and quotes when they are important.
+4. Ensure that your summary preserves the original meaning and context of the information.
+
+Your response should ONLY be the detailed summary of documents in plain text without any formatting.
+
+Query:
+{query}
+
+Document:
+{content}"""
+ prompt = ChatPromptTemplate.from_template(template)
+ messages = prompt.format_messages(content=content, query=query)
+ response = await llm.ainvoke(messages)
+ return response.content.strip()
+
+if __name__ == "__main__":
+ import asyncio
+ from src.crawl.crawler import Crawler
+
+ reasoner = Reasoner()
+ crawler = Crawler()
+
+ session_id = crawler.create_session()
+ contents = asyncio.run(crawler.crawl_with_retry(
+ "https://www.parliament.nz/en/pb/sc/make-a-submission/document/54SCJUST_SCF_227E6D0B-E632-42EB-CFFE-08DCFEB826C6/principles-of-the-treaty-of-waitangi-bill",
+ session_id=session_id,
+ rotate_proxy=False,
+ return_html=True
+ ))
+ print(contents)
+
diff --git a/src/search/__init__.py b/src/search/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/search/search_engine.py b/src/search/search_engine.py
new file mode 100644
index 0000000000000000000000000000000000000000..26eb395fcd8ed0d10b9956362e983cb4683db239
--- /dev/null
+++ b/src/search/search_engine.py
@@ -0,0 +1,330 @@
+import os
+import json
+import asyncio
+from typing import List, Dict, Any, Optional
+from langchain.prompts import ChatPromptTemplate
+from pathlib import Path
+from dotenv import load_dotenv
+import time
+from langchain_community.tools import BraveSearch
+from src.utils.api_key_manager import with_api_manager
+from src.helpers.helper import remove_markdown
+
+class SearchEngine:
+ def __init__(
+ self,
+ brave_api_key: Optional[str] = None,
+ ):
+ if brave_api_key is None:
+ if os.getenv("BRAVE_API_KEY") is None:
+ raise ValueError("BRAVE_API_KEY is not set")
+ else:
+ self.brave_api_key = os.getenv("BRAVE_API_KEY")
+ else:
+ self.brave_api_key = brave_api_key
+
+ @with_api_manager()
+ async def generate_optimized_query(self, user_query: str, context: str = None, *, llm) -> str:
+ if context:
+ template = \
+"""Objective:
+Create a search engine optimized (SEO) query that accurately reflects the user's intent by utilizing their current query and relevant past context.
+The generated SEO query should enhance visibility, relevance, and ranking on search engines.
+
+Information:
+The search engine being used is semantic in nature and requires a query that aligns with the user's intent while incorporating SEO best practices.
+
+Instructions:
+1. Understand the Inputs:
+ - User Query: This is the current question or statement provided by the user.
+ - Past Context: This includes any relevant previous interactions, preferences, or information that can inform the understanding of the user's intent.
+2. Analyze the User Intent:
+ - Determine what the user is seeking to find or achieve with their query.
+ - Identify keywords and phrases that are central to the user's intent.
+3. Incorporate SEO Best Practices:
+ - Keyword Optimization: Use relevant keywords that users are likely to search for. Include both primary and secondary keywords.
+ - Long-Tail Keywords: Incorporate longer, more specific keyword phrases that reflect the user's intent more precisely.
+ - Clarity and Relevance: Ensure the query is clear, concise, and directly related to the user's needs.
+ - Search Intent Alignment: Align the query with the type of content the user is likely seeking (informational, navigational, transactional, or commercial investigation).
+ - Optimal Length: Keep the query within 5-12 words to maintain effectiveness and avoid keyword stuffing.
+4. Generate the SEO-Optimized Query:
+ - Combine the insights from the user query and past context.
+ - Formulate a search query that maximizes SEO potential while staying true to the user's intent.
+5. Review and Refine:
+ - Ensure the generated query is free from grammatical errors.
+ - Verify that the query does not include unnecessary or irrelevant keywords.
+ - Confirm that the query is tailored to improve search engine rankings for the intended content.
+6. Format [IMPORTANT]:
+ - If the user query is a question, the SEO-optimized query should also be a question.
+ - If the user query is a statement, the SEO-optimized query should be a clear and concise statement.
+ - Unless search results would be more accurate if the optimized query was a question.
+
+Example 1:
+- User Query:
+ 'Best vegan restaurants in New York'
+- Past Context:
+ 'User has previously shown interest in healthy eating and sustainability.'
+- SEO-Optimized Search Query:
+ 'Top Vegan Restaurants in New York City for Healthy Dining'
+
+Example 2:
+- User Query:
+ 'Give me a list of the best sci-fi movies'
+- Past Context:
+ 'User has a preference for classic science fiction films. Previous searches include "Blade Runner" and "2001: A Space Odyssey."'
+- SEO-Optimized Search Query:
+ 'What are the top classic science fiction movies to watch that are similar to Blade Runner and 2001: A Space Odyssey?'
+
+Input:
+- User Query:
+ {user_query}
+
+- Past Context:
+ {context}
+
+Output:
+(The generated SEO-friendly query based on the inputs in plain text format without any markdown)"""
+ else:
+ template = \
+"""Objective:
+Create a search engine optimized (SEO) query that accurately reflects the user's intent by utilizing their current query.
+The generated SEO query should enhance visibility, relevance, and ranking on search engines.
+
+Information:
+The search engine being used is semantic in nature and requires a query that aligns with the user's intent while incorporating SEO best practices.
+
+Instructions:
+1. Understand the Input:
+ - User Query: This is the current question or statement provided by the user.
+2. Analyze the User Intent:
+ - Determine what the user is seeking to find or achieve with their query.
+ - Identify keywords and phrases that are central to the user's intent.
+3. Incorporate SEO Best Practices:
+ - Keyword Optimization: Use relevant keywords that users are likely to search for. Include both primary and secondary keywords.
+ - Long-Tail Keywords: Incorporate longer, more specific keyword phrases that reflect the user's intent more precisely.
+ - Clarity and Relevance: Ensure the query is clear, concise, and directly related to the user's needs.
+ - Search Intent Alignment: Align the query with the type of content the user is likely seeking (informational, navigational, transactional, or commercial investigation).
+ - Optimal Length: Keep the query within 5-12 words to maintain effectiveness and avoid keyword stuffing.
+4. Generate the SEO-Optimized Query:
+ - Utilize the insights from the user query.
+ - Formulate a search query that maximizes SEO potential while staying true to the user's intent.
+5. Review and Refine:
+ - Ensure the generated query is free from grammatical errors.
+ - Verify that the query does not include unnecessary or irrelevant keywords.
+ - Confirm that the query is tailored to improve search engine rankings for the intended content.
+6. Format [IMPORTANT]:
+ - If the user query is a question, the SEO-optimized query should also be a question.
+ - If the user query is a statement, the SEO-optimized query should be a clear and concise statement.
+ - Unless search results would be more accurate if the optimized query was a question.
+
+Example 1:
+- User Query:
+ 'Best vegan restaurants in New York'
+
+- SEO-Optimized Search Query:
+ 'Top Vegan Restaurants in New York City for Healthy Dining'
+
+Example 2:
+- User Query:
+ 'Give me a list of the best sci-fi movies'
+
+- SEO-Optimized Search Query:
+ 'What are the top science fiction movies to watch?'
+
+Input:
+- User Query:
+ {user_query}
+
+Output:
+(The generated SEO-friendly query based on the input in plain text format without any markdown)"""
+
+ prompt_template = ChatPromptTemplate.from_template(template)
+ prompt = prompt_template.format(context=context, user_query=user_query)
+
+ optimized_query = await llm.ainvoke(prompt)
+ return optimized_query.content.strip()
+
+ async def search(
+ self,
+ query: str,
+ num_results: int = 10,
+ gl: str = 'us',
+ hl: str = 'en',
+ safe: str = 'off',
+ exclude_filetypes: Optional[List[str]] = None
+ ) -> List[Dict[str, Any]]:
+ # Construct exclusion string for filetypes (maintaining compatibility)
+ exclusion = ''
+ if exclude_filetypes:
+ exclusion = ' ' + ' '.join([f"NOT filetype:{ft}" for ft in exclude_filetypes])
+
+ modified_query = f"{query}{exclusion}"
+ print(f"Performing search with query: '{modified_query}', num_results: {num_results}, gl: {gl}, hl: {hl}, safe: {safe}")
+
+ try:
+ all_results = []
+ remaining_results = num_results
+ offset = 0
+
+ while remaining_results > 0 and offset <= 9: # Max offset is 9
+ # Calculate count for this page (max 20 per request)
+ count = min(remaining_results, 20)
+
+ # Initialize Brave Search within the method
+ brave_search = BraveSearch.from_api_key(
+ api_key=self.brave_api_key,
+ search_kwargs={
+ "count": count,
+ "offset": offset,
+ "country": gl,
+ "search_lang": hl,
+ "safesearch": safe
+ }
+ )
+ try:
+ results_str = await asyncio.to_thread(brave_search.run, modified_query)
+ page_results = eval(results_str) # Convert string representation of list to actual list
+
+ if not page_results: # No more results available
+ break
+ except Exception as e:
+ if "429" in str(e): # Rate limit error
+ print("Brave API rate limit hit, waiting 1 second...")
+ await asyncio.sleep(1)
+ continue
+ else:
+ raise e
+
+ all_results.extend(page_results)
+ remaining_results -= len(page_results)
+ offset += 1
+
+ # Add a delay to avoid hitting the rate limit
+ await asyncio.sleep(1)
+
+ print(f"Total results fetched: {len(all_results)}")
+ return all_results[:num_results] # Ensure we don't return more than requested
+
+ except Exception as e:
+ raise e
+
+ @with_api_manager()
+ async def filter_urls(
+ self,
+ query: str,
+ category: str,
+ search_results: List[Dict[str, Any]],
+ num_results: int = 3,
+ *,
+ llm
+ ) -> List[Dict[str, str]]:
+ link_info = {}
+ for result in search_results:
+ link = result.get("link")
+ title = result.get("title")
+ snippet = result.get("snippet")
+
+ if link and title and snippet:
+ link_info[link] = {"title": title, "snippet": snippet}
+
+ template = \
+"""[IMPORTANT]
+This is a very important task.
+Please take a deep breath, read the instructions VERY carefully, and think step-by-step before responding.
+
+[PROMPT]
+You are an expert at determining the relevance of search results to a given query.
+Your task is to re-rank the given search results based on their relevance to the original query.
+Use a hybrid of semantic and keyword matching to determine relevance
+
+Consider factors such as:
+1. How well the title and snippet match the query intent
+3. The credibility and authority of the source
+4. The recency of the information (if applicable)
+
+Rules:
+1. Rerank the URLs based on their relevance to the query according to the criteria listed above, from best match to worst match.
+2. Once reranked, select the top best matched results according to the category of the query as defined below:
+ - Simple External Lookup: Select upto 3 top best matched results
+ - Complex Moderate Decomposition: Select upto 4 top best matched results
+ - Complex Advanced Decomposition: Select upto 5 top best matched results
+ - Extensive Research Dynamic Structuring: Select upto 6 top best matched results
+3. [IMPORTANT] Select the MINIMUM number of results (based on the categories above) that are required to answer the query.
+4. The response should only contain a JSON array of objects, each containing 'link', 'title' and 'snippet' keys after reranking and filtering.
+
+Note: Do not include ANY markdown in your response.
+
+[INPUT]
+Query Category:
+{category}
+
+Query:
+{query}
+
+Dictionary Containing Link, Titles and Snippets:
+{link_info}
+
+Ranked URLs (JSON array of objects):"""
+ prompt = ChatPromptTemplate.from_template(template)
+ response = await llm.ainvoke(prompt.format_messages(category=category, query=query, link_info=link_info))
+ cleaned_response = remove_markdown(response.content.strip())
+
+ try:
+ ranked_links = json.loads(cleaned_response)
+ print(f"Number of search results after reranking and filtering: {len(ranked_links)}")
+ return ranked_links
+ except json.JSONDecodeError:
+ print("Error decoding JSON response from LLM")
+ return [{"link": link, "title": info["title"], "snippet": info["snippet"]} for link, info in list(link_info.items())[:num_results]]
+
+if __name__ == "__main__":
+ # Get the project root directory
+ project_root = Path(__file__).resolve().parents[2]
+
+ # Load environment variables
+ load_dotenv()
+
+ required_env_vars = ["BRAVE_API_KEY"]
+ missing_vars = [var for var in required_env_vars if os.getenv(var) is None]
+ if missing_vars:
+ print(f"Environment variables are not set: {missing_vars}")
+ exit()
+ else:
+ print("All environment variables are set!")
+ search_engine = SearchEngine()
+
+ queries = [
+ "Compare the benefits and drawbacks of AI in healthcare",
+ "What is the impact of AI on healthcare?",
+ "How is AI used in healthcare?",
+ "What are the ethical considerations of AI in healthcare?",
+ "What are the economic and social impacts of artificial intelligence on the job market?",
+ "How can cold fusion be achieved without violating the laws of thermodynamics? And how can AGI help with that?",
+ "What are the major obstacles to achieving carbon neutrality in heavy industries like steel and cement? What are the potential solutions?"
+ ]
+
+ async def main(queries: List[str]):
+ for query in queries:
+ optimized_query = await search_engine.generate_optimized_query(query)
+ print(f"\nOriginal Query: {query}")
+ print(f"Optimized Query: {optimized_query}\n")
+
+ start = time.perf_counter()
+ search_results = await search_engine.search(optimized_query, num_results=2, exclude_filetypes=["pdf"])
+ end = time.perf_counter()
+ print(f"Time taken to fetch search results: {end - start:.2f} seconds")
+ # filtered_search = search_engine.filter_urls(
+ # optimized_query,
+ # category="Simple External Lookup",
+ # search_results=search_results,
+ # num_results=2
+ # )
+ print("Search Results:")
+ urls = []
+ for result in search_results:
+ print(f"- {result['title']}: {result['link']}: {result['snippet']}")
+ urls.append(result['link'])
+
+ print("-"*20)
+
+ asyncio.run(main(queries))
\ No newline at end of file
diff --git a/src/utils/__init__.py b/src/utils/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/utils/api_key_manager.py b/src/utils/api_key_manager.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f0603b4b8ef96e325e23016944ce573a5140b06
--- /dev/null
+++ b/src/utils/api_key_manager.py
@@ -0,0 +1,635 @@
+from threading import Lock
+import os
+from typing import List, Optional, Literal, Union, Dict
+from dotenv import load_dotenv
+import re
+from langchain_xai import ChatXAI
+from langchain_openai import ChatOpenAI
+from langchain_anthropic import ChatAnthropic
+from langchain_google_genai import ChatGoogleGenerativeAI
+from functools import wraps
+import time
+from openai import RateLimitError, OpenAIError
+from anthropic import RateLimitError as AnthropicRateLimitError, APIError as AnthropicAPIError
+from google.api_core.exceptions import ResourceExhausted, BadRequest, InvalidArgument
+from tenacity import retry, wait_random_exponential, stop_after_attempt, retry_if_exception_type
+import asyncio
+
+ModelProvider = Literal["openai", "anthropic", "google", "xai"]
+
+class APIKeyManager:
+ _instance = None
+ _lock = Lock()
+
+ # Define supported models
+ SUPPORTED_MODELS = {
+ "openai": [
+ "gpt-3.5-turbo",
+ "gpt-3.5-turbo-instruct",
+ "gpt-3.5-turbo-1106",
+ "gpt-3.5-turbo-0125",
+ "gpt-4-0314",
+ "gpt-4-0613",
+ "gpt-4",
+ "gpt-4-1106-preview",
+ "gpt-4-0125-preview",
+ "gpt-4-turbo-preview",
+ "gpt-4-turbo-2024-04-09",
+ "gpt-4-turbo",
+ "o1-mini-2024-09-12",
+ "o1-mini",
+ "o1-preview-2024-09-12",
+ "o1-preview",
+ "o1",
+ "gpt-4o-mini-2024-07-18",
+ "gpt-4o-mini",
+ "chatgpt-4o-latest",
+ "gpt-4o-2024-05-13",
+ "gpt-4o-2024-08-06",
+ "gpt-4o-2024-11-20",
+ "gpt-4o"
+ ],
+ "google": [
+ "gemini-1.5-flash",
+ "gemini-1.5-flash-latest",
+ "gemini-1.5-flash-exp-0827",
+ "gemini-1.5-flash-001",
+ "gemini-1.5-flash-002",
+ "gemini-1.5-flash-8b-exp-0924",
+ "gemini-1.5-flash-8b-exp-0827",
+ "gemini-1.5-flash-8b-001",
+ "gemini-1.5-flash-8b",
+ "gemini-1.5-flash-8b-latest",
+ "gemini-1.5-pro",
+ "gemini-1.5-pro-latest",
+ "gemini-1.5-pro-001",
+ "gemini-1.5-pro-002",
+ "gemini-1.5-pro-exp-0827",
+ "gemini-1.0-pro",
+ "gemini-1.0-pro-latest",
+ "gemini-1.0-pro-001",
+ "gemini-pro",
+ "gemini-exp-1114",
+ "gemini-exp-1121",
+ "gemini-2.0-pro-exp-02-05",
+ "gemini-2.0-flash-lite-preview-02-05",
+ "gemini-2.0-flash-exp",
+ "gemini-2.0-flash",
+ "gemini-2.0-flash-thinking-exp-1219",
+ ],
+ "xai": [
+ "grok-beta",
+ "grok-vision-beta",
+ "grok-2-vision-1212",
+ "grok-2-1212"
+ ],
+ "anthropic": [
+ "claude-3-5-sonnet-20241022",
+ "claude-3-5-sonnet-latest",
+ "claude-3-5-haiku-20241022",
+ "claude-3-5-haiku-latest",
+ "claude-3-opus-20240229",
+ "claude-3-opus-latest",
+ "claude-3-sonnet-20240229",
+ "claude-3-haiku-20240307"
+ ]
+ }
+
+ def __new__(cls):
+ with cls._lock:
+ if cls._instance is None:
+ cls._instance = super(APIKeyManager, cls).__new__(cls)
+ cls._instance._initialized = False
+ return cls._instance
+
+ def __init__(self):
+ if not self._initialized:
+ self._initialized = True
+
+ # 1) Always load env
+ load_dotenv(override=True)
+
+ self._current_indices = {
+ "openai": 0,
+ "anthropic": 0,
+ "google": 0,
+ "xai": 0
+ }
+ self._lock = Lock()
+
+ # 2) load all provider keys from environment
+ self._api_keys = self._load_api_keys()
+ self._llm = None
+ self._current_provider = None
+
+ # 3) read user’s chosen provider, model, temperature, top_p from env
+ provider_env = os.getenv("MODEL_PROVIDER", "openai").strip().lower()
+ self.model_name = os.getenv("MODEL_NAME", "gpt-3.5-turbo").strip()
+ temp_str = os.getenv("MODEL_TEMPERATURE", "0")
+ topp_str = os.getenv("MODEL_TOP_P", "1")
+
+ try:
+ self.temperature = float(temp_str)
+ except ValueError:
+ self.temperature = 0.0
+ try:
+ self.top_p = float(topp_str)
+ except ValueError:
+ self.top_p = 1.0
+
+ def _reinit(self):
+ self._initialized = False
+ self.__init__()
+
+ def _load_api_keys(self) -> Dict[str, List[str]]:
+ """Load API keys from environment variables dynamically."""
+ api_keys = {
+ "openai": [],
+ "anthropic": [],
+ "google": [],
+ "xai": []
+ }
+
+ # Get all environment variables
+ env_vars = dict(os.environ)
+
+ # Load OpenAI API keys
+ openai_pattern = re.compile(r'OPENAI_API_KEY_\d+$')
+ openai_keys = {k: v for k, v in env_vars.items() if openai_pattern.match(k) and v.strip()}
+
+ if not openai_keys:
+ default_key = os.getenv('OPENAI_API_KEY')
+ if default_key and default_key.strip():
+ api_keys["openai"].append(default_key)
+ else:
+ sorted_keys = sorted(openai_keys.keys(), key=lambda x: int(x.split('_')[-1]))
+ for key_name in sorted_keys:
+ api_key = openai_keys[key_name]
+ if api_key and api_key.strip():
+ api_keys["openai"].append(api_key)
+
+ # Load Google API keys
+ google_pattern = re.compile(r'GOOGLE_API_KEY_\d+$')
+ google_keys = {k: v for k, v in env_vars.items() if google_pattern.match(k) and v.strip()}
+
+ if not google_keys:
+ default_key = os.getenv('GOOGLE_API_KEY')
+ if default_key and default_key.strip():
+ api_keys["google"].append(default_key)
+ else:
+ sorted_keys = sorted(google_keys.keys(), key=lambda x: int(x.split('_')[-1]))
+ for key_name in sorted_keys:
+ api_key = google_keys[key_name]
+ if api_key and api_key.strip():
+ api_keys["google"].append(api_key)
+
+ # Load XAI API keys
+ xai_pattern = re.compile(r'XAI_API_KEY_\d+$')
+ xai_keys = {k: v for k, v in env_vars.items() if xai_pattern.match(k) and v.strip()}
+
+ if not xai_keys:
+ default_key = os.getenv('XAI_API_KEY')
+ if default_key and default_key.strip():
+ api_keys["xai"].append(default_key)
+ else:
+ sorted_keys = sorted(xai_keys.keys(), key=lambda x: int(x.split('_')[-1]))
+ for key_name in sorted_keys:
+ api_key = xai_keys[key_name]
+ if api_key and api_key.strip():
+ api_keys["xai"].append(api_key)
+
+ # Load Anthropic API keys
+ anthropic_pattern = re.compile(r'ANTHROPIC_API_KEY_\d+$')
+ anthropic_keys = {k: v for k, v in env_vars.items() if anthropic_pattern.match(k) and v.strip()}
+
+ if not anthropic_keys:
+ default_key = os.getenv('ANTHROPIC_API_KEY')
+ if default_key and default_key.strip():
+ api_keys["anthropic"].append(default_key)
+ else:
+ sorted_keys = sorted(anthropic_keys.keys(), key=lambda x: int(x.split('_')[-1]))
+ for key_name in sorted_keys:
+ api_key = anthropic_keys[key_name]
+ if api_key and api_key.strip():
+ api_keys["anthropic"].append(api_key)
+
+ if not any(api_keys.values()):
+ raise Exception("No valid API keys found in environment variables")
+
+ for provider, keys in api_keys.items():
+ if keys:
+ print(f"Loaded {len(keys)} {provider} API keys for rotation")
+
+ return api_keys
+
+ def get_next_api_key(self, provider: ModelProvider) -> str:
+ """Get the next API key in round-robin fashion for the specified provider."""
+ with self._lock:
+ if not self._api_keys.get(provider) or len(self._api_keys[provider]) == 0:
+ raise Exception(f"No API key found for {provider}")
+
+ if provider not in self._current_indices:
+ self._current_indices[provider] = 0
+
+ current_key = self._api_keys[provider][self._current_indices[provider]]
+ self._current_indices[provider] = (self._current_indices[provider] + 1) % len(self._api_keys[provider])
+ return current_key
+
+ def _get_provider_for_model(self) -> ModelProvider:
+ """Determine the provider based on the model name."""
+ load_dotenv(override=True) # to refresh in case .env changed
+ provider_env = os.getenv("MODEL_PROVIDER", "openai").lower().strip()
+
+ if provider_env not in self.SUPPORTED_MODELS:
+ raise Exception(
+ f"Invalid or missing MODEL_PROVIDER in env: '{provider_env}'. "
+ f"Must be one of: {list(self.SUPPORTED_MODELS.keys())}"
+ )
+
+ # check if user-chosen model is in that provider’s list
+ if self.model_name not in self.SUPPORTED_MODELS[provider_env]:
+ available = self.SUPPORTED_MODELS[provider_env]
+ raise Exception(
+ f"Model '{self.model_name}' is not available under provider '{provider_env}'. "
+ f"Available: {available}"
+ )
+
+ return provider_env
+
+
+ def _initialize_llm(
+ self,
+ model_name: Optional[str] = None,
+ temperature: Optional[float] = None,
+ top_p: Optional[float] = None,
+ max_tokens: Optional[int] = None,
+ streaming: bool = False
+ ):
+ """Initialize LLM with the next API key in rotation."""
+ load_dotenv(override=True) # refresh .env in case it changed
+ provider = self._get_provider_for_model()
+ model_name = model_name if model_name else self.model_name
+ temperature = temperature if temperature else self.temperature
+ top_p = top_p if top_p else self.top_p
+
+ api_key = self.get_next_api_key(provider)
+ print(f"Using provider={provider}, model_name={model_name}, "
+ f"temperature={temperature}, top_p={top_p}, key={api_key}")
+
+ if provider == "openai":
+ self._llm = ChatOpenAI(
+ model=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=max_tokens,
+ max_retries=0,
+ streaming=streaming,
+ api_key=api_key
+ )
+ elif provider == "google":
+ self._llm = ChatGoogleGenerativeAI(
+ model=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=max_tokens,
+ max_retries=0,
+ streaming=streaming,
+ api_key=api_key
+ )
+ elif provider == "anthropic":
+ self._llm = ChatAnthropic(
+ model=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=max_tokens,
+ max_retries=0,
+ streaming=streaming,
+ api_key=api_key
+ )
+ else:
+ self._llm = ChatXAI(
+ model=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=max_tokens,
+ max_retries=0,
+ streaming=streaming,
+ api_key=api_key
+ )
+
+ self._current_provider = provider
+
+ def get_llm(
+ self,
+ model_name: Optional[str] = None,
+ temperature: Optional[float] = None,
+ top_p: Optional[float] = None,
+ max_tokens: Optional[int] = None,
+ streaming: bool = False
+ ) -> Union[ChatOpenAI, ChatGoogleGenerativeAI, ChatAnthropic, ChatXAI]:
+ """Get LLM instance with the current API key."""
+ provider = self._get_provider_for_model()
+ model_name = model_name if model_name else self.model_name
+ temperature = temperature if temperature else self.temperature
+ top_p = top_p if top_p else self.top_p
+
+ if self._llm is None or provider != self._current_provider:
+ self._initialize_llm(model_name, temperature, top_p, max_tokens, streaming)
+ return self._llm
+
+ def rotate_key(self, provider: Optional[ModelProvider] = None, streaming: bool = False) -> None:
+ """Manually rotate to the next API key."""
+ if provider is None:
+ provider = self._current_provider
+ self._initialize_llm(streaming=streaming)
+
+ def get_all_api_keys(self, provider: Optional[ModelProvider] = None) -> Union[Dict[str, List[str]], List[str]]:
+ """Get all available API keys."""
+ if provider:
+ return self._api_keys[provider].copy()
+ return {k: v.copy() for k, v in self._api_keys.items()}
+
+ def get_key_count(self, provider: Optional[ModelProvider] = None) -> Union[Dict[str, int], int]:
+ """Get the total number of available API keys."""
+ if provider:
+ return len(self._api_keys[provider])
+ return {k: len(v) for k, v in self._api_keys.items()}
+
+ def __len__(self) -> Dict[str, int]:
+ """Get the number of active API keys for each provider."""
+ return self.get_key_count()
+
+ def __bool__(self) -> bool:
+ """Check if there are any API keys available."""
+ return any(bool(keys) for keys in self._api_keys.values())
+
+def with_api_manager(
+ model_name: Optional[str] = None,
+ temperature: Optional[float] = None,
+ top_p: Optional[float] = None,
+ max_tokens: Optional[int] = None,
+ streaming: bool = False,
+ delay_on_timeout: int = 20,
+ max_token_reduction_attempts: int = 0
+ ):
+ """Decorator for automatic key rotation on error with delay on timeout."""
+ manager = APIKeyManager()
+ provider = manager._get_provider_for_model()
+ model_name = model_name if model_name else manager.model_name
+ temperature = temperature if temperature else manager.temperature
+ top_p = top_p if top_p else manager.top_p
+ key_count = manager.get_key_count(provider)
+
+ def decorator(func):
+ if asyncio.iscoroutinefunction(func):
+ @wraps(func)
+ async def wrapper(*args, **kwargs):
+ if key_count > 1:
+ all_keys = manager.get_all_api_keys(provider)
+ tried_keys = set()
+
+ current_max_tokens = max_tokens
+ token_reduction_attempts = 0
+
+ while len(tried_keys) < len(all_keys):
+ try:
+ llm = manager.get_llm(
+ model_name=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=current_max_tokens,
+ streaming=streaming
+ )
+ result = await func(*args, **kwargs, llm=llm)
+ return result
+ except (RateLimitError, ResourceExhausted, AnthropicRateLimitError) as e:
+ current_key = manager._api_keys[provider][(manager._current_indices[provider] - 1) % len(all_keys)]
+ print(f"Rate limit error with {provider} API key {current_key}: {str(e)}")
+ tried_keys.add(current_key)
+ if len(tried_keys) < len(all_keys):
+ manager.rotate_key(provider=provider, streaming=streaming)
+ print(f"Using next available {provider} API key")
+ else:
+ if delay_on_timeout > 0:
+ print(f"Waiting for {delay_on_timeout} seconds before retrying with the first key...")
+ time.sleep(delay_on_timeout)
+ manager._current_indices[provider] = 0
+ else:
+ print(f"All {provider} API keys failed due to rate limits: {str(e)}")
+ raise
+ except (OpenAIError, AnthropicAPIError, BadRequest, InvalidArgument) as e:
+ error_str = str(e)
+ if "token" in error_str.lower() or "context length" in error_str.lower():
+ print(f"Token limit error encountered: {error_str}")
+ if max_token_reduction_attempts > 0 and max_tokens is not None and token_reduction_attempts < max_token_reduction_attempts:
+ current_max_tokens = int(current_max_tokens * 0.8) # Reduce the local variable
+ token_reduction_attempts += 1
+ print(f"Retrying with reduced max_tokens: {current_max_tokens}")
+ continue # Retry with reduced max_tokens
+ else:
+ print("Max token reduction attempts reached or token reduction disabled. Proceeding with key rotation.")
+ current_key = manager._api_keys[provider][(manager._current_indices[provider] - 1) % len(all_keys)]
+ tried_keys.add(current_key)
+ if len(tried_keys) < len(all_keys):
+ manager.rotate_key(provider=provider, streaming=streaming)
+ print(f"Using next available {provider} API key after token limit error.")
+ else:
+ raise # All keys tried, raise the token limit error
+ else:
+ # Re-raise other API errors
+ raise
+
+ # Attempt one final time after trying all keys (for rate limits with delay)
+ try:
+ llm = manager.get_llm(
+ model_name=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=current_max_tokens, # Use the current value
+ streaming=streaming
+ )
+ result = await func(*args, **kwargs, llm=llm)
+ return result
+ except (RateLimitError, ResourceExhausted, AnthropicRateLimitError,
+ OpenAIError, AnthropicAPIError, BadRequest, InvalidArgument) as e:
+ print(f"Error after retrying all {provider} API keys: {str(e)}")
+ raise
+
+ elif key_count == 1:
+ @retry(
+ wait=wait_random_exponential(min=10, max=60),
+ stop=stop_after_attempt(6),
+ retry=retry_if_exception_type((
+ RateLimitError, ResourceExhausted, AnthropicRateLimitError,
+ OpenAIError, AnthropicAPIError, BadRequest, InvalidArgument))
+ )
+ async def attempt_function_call():
+ llm = manager.get_llm(
+ model_name=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=max_tokens,
+ streaming=streaming
+ )
+ return await func(*args, **kwargs, llm=llm)
+
+ try:
+ return await attempt_function_call()
+ except (RateLimitError, ResourceExhausted, AnthropicRateLimitError,
+ OpenAIError, AnthropicAPIError, BadRequest, InvalidArgument) as e:
+ print(f"Error encountered for {provider} after multiple retries: {str(e)}")
+ raise
+ else:
+ print(f"No API keys found for provider: {provider}")
+ raise
+
+ else:
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ if key_count > 1:
+ all_keys = manager.get_all_api_keys(provider)
+ tried_keys = set()
+ current_max_tokens = max_tokens
+ token_reduction_attempts = 0
+
+ while len(tried_keys) < len(all_keys):
+ try:
+ llm = manager.get_llm(
+ model_name=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=current_max_tokens,
+ streaming=streaming
+ )
+ result = func(*args, **kwargs, llm=llm)
+ return result
+ except (RateLimitError, ResourceExhausted, AnthropicRateLimitError) as e:
+ current_key = manager._api_keys[provider][(manager._current_indices[provider] - 1) % len(all_keys)]
+ print(f"Rate limit error with {provider} API key {current_key}: {str(e)}")
+ tried_keys.add(current_key)
+ if len(tried_keys) < len(all_keys):
+ manager.rotate_key(provider=provider, streaming=streaming)
+ print(f"Using next available {provider} API key")
+ else:
+ if delay_on_timeout > 0:
+ print(f"Waiting for {delay_on_timeout} seconds before retrying with the first key...")
+ time.sleep(delay_on_timeout)
+ manager._current_indices[provider] = 0
+ else:
+ print(f"All {provider} API keys failed due to rate limits: {str(e)}")
+ raise
+ except (OpenAIError, AnthropicAPIError, BadRequest, InvalidArgument) as e:
+ error_str = str(e)
+ if "token" in error_str.lower() or "context length" in error_str.lower():
+ print(f"Token limit error encountered: {error_str}")
+ if max_token_reduction_attempts > 0 and max_tokens is not None and token_reduction_attempts < max_token_reduction_attempts:
+ current_max_tokens = int(current_max_tokens * 0.8)
+ token_reduction_attempts += 1
+ print(f"Retrying with reduced max_tokens: {current_max_tokens}")
+ continue # Retry with reduced max_tokens
+ else:
+ print("Max token reduction attempts reached or token reduction disabled. Proceeding with key rotation.")
+ current_key = manager._api_keys[provider][(manager._current_indices[provider] - 1) % len(all_keys)]
+ tried_keys.add(current_key)
+ if len(tried_keys) < len(all_keys):
+ manager.rotate_key(provider=provider, streaming=streaming)
+ print(f"Using next available {provider} API key after token limit error.")
+ else:
+ raise # All keys tried, raise the token limit error
+ else:
+ # Re-raise other API errors
+ raise
+
+ # Attempt one final time after trying all keys (for rate limits with delay)
+ try:
+ llm = manager.get_llm(
+ model_name=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=current_max_tokens,
+ streaming=streaming
+ )
+ result = func(*args, **kwargs, llm=llm)
+ return result
+ except (RateLimitError, ResourceExhausted, AnthropicRateLimitError,
+ OpenAIError, AnthropicAPIError, BadRequest, InvalidArgument) as e:
+ print(f"Error after retrying all {provider} API keys: {str(e)}")
+ raise
+
+ elif key_count == 1:
+ @retry(
+ wait=wait_random_exponential(min=10, max=60),
+ stop=stop_after_attempt(6),
+ retry=retry_if_exception_type((
+ RateLimitError, ResourceExhausted, AnthropicRateLimitError,
+ OpenAIError, AnthropicAPIError, BadRequest, InvalidArgument))
+ )
+ def attempt_function_call():
+ llm = manager.get_llm(
+ model_name=model_name,
+ temperature=temperature,
+ top_p=top_p,
+ max_tokens=max_tokens,
+ streaming=streaming
+ )
+ return func(*args, **kwargs, llm=llm)
+
+ try:
+ return attempt_function_call()
+ except (RateLimitError, ResourceExhausted, AnthropicRateLimitError,
+ OpenAIError, AnthropicAPIError, BadRequest, InvalidArgument) as e:
+ print(f"Error encountered for {provider} after multiple retries: {str(e)}")
+ raise
+ else:
+ print(f"No API keys found for provider: {provider}")
+ raise
+
+ return wrapper
+ return decorator
+
+if __name__ == "__main__":
+ import asyncio
+
+ prompt = "What is the capital of France?"
+
+ # Test key rotation
+ async def test_load_balancing(prompt: str, test_count: int = 10, stream: bool = False):
+ @with_api_manager(streaming=stream)
+ async def test(prompt: str, test_count: int = 10, *, llm):
+ print("="*50)
+ for i in range(test_count):
+ try:
+ print(f"\nTest {i+1} of {test_count}")
+ if stream:
+ async for chunk in llm.astream(prompt):
+ print(chunk.content, end="", flush=True)
+ print("\n" + "-"*50 if i != test_count - 1 else "\n" + "="*50)
+ else:
+ response = await llm.ainvoke(prompt)
+ print(f"Response: {response.content.strip()}")
+ print("-"*50) if i != test_count - 1 else print("="*50)
+ except (RateLimitError, ResourceExhausted, AnthropicRateLimitError) as e:
+ print(f"Error: {str(e)}")
+ raise
+
+ await test(prompt, test_count=test_count)
+
+ # Test without load balancing
+ def test_without_load_balancing(model_name: str, prompt: str, test_count: int = 10):
+ manager = APIKeyManager()
+ print(f"Using model: {model_name}")
+ print("="*50)
+ i = 0
+ while i < test_count:
+ try:
+ print(f"Test {i+1} of {test_count}")
+ llm = manager.get_llm(model_name=model_name)
+ response = llm.invoke(prompt)
+ print(f"Response: {response.content.strip()}")
+ print("-"*50) if i != test_count - 1 else print("="*50)
+ i += 1
+ except Exception as e:
+ raise Exception(f"Error with {model_name}: {str(e)}")
+
+ # test_without_load_balancing(model_name="gemini-exp-1121", prompt=prompt, test_count=50)
+ asyncio.run(test_load_balancing(prompt=prompt, test_count=100, stream=True))
\ No newline at end of file