From f6416d6adff25baf68c37fc17c4ad74607a64865 Mon Sep 17 00:00:00 2001 From: Vuong Le Date: Mon, 3 Nov 2025 13:16:53 +0000 Subject: [PATCH] [KAMINO-747] Image Upload form --- .env.example | 17 + .eslintrc.json | 3 + .gitignore | 28 + .vscode/extensions.json | 5 + AUTHENTICATION.md | 120 + PROJECT_SPEC.md | 51 + README.md | 143 + next.config.js | 6 + package-lock.json | 5012 ++++++++++++++++++++++++ package.json | 25 + src/app/api/analyze/route.ts | 157 + src/app/globals.css | 17 + src/app/layout.tsx | 19 + src/app/page.module.css | 148 + src/app/page.tsx | 172 + src/lib/config.ts | 10 + src/lib/lesion-info.ts | 50 + src/lib/lesions-data.ts | 722 ++++ src/lib/products-data.ts | 500 +++ src/lib/skincare-data.ts | 29 + src/lib/skincare_product_examples.xlsx | Bin 0 -> 27062 bytes src/lib/therapies-data.ts | 167 + src/types/skincare-data.types.ts | 35 + tsconfig.json | 28 + 24 files changed, 7464 insertions(+) create mode 100644 .env.example create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 AUTHENTICATION.md create mode 100644 PROJECT_SPEC.md create mode 100644 README.md create mode 100644 next.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/app/api/analyze/route.ts create mode 100644 src/app/globals.css create mode 100644 src/app/layout.tsx create mode 100644 src/app/page.module.css create mode 100644 src/app/page.tsx create mode 100644 src/lib/config.ts create mode 100644 src/lib/lesion-info.ts create mode 100644 src/lib/lesions-data.ts create mode 100644 src/lib/products-data.ts create mode 100644 src/lib/skincare-data.ts create mode 100644 src/lib/skincare_product_examples.xlsx create mode 100644 src/lib/therapies-data.ts create mode 100644 src/types/skincare-data.types.ts create mode 100644 tsconfig.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5c0aca3 --- /dev/null +++ b/.env.example @@ -0,0 +1,17 @@ +# VisualDx API Configuration +# Copy this file to .env.local and fill in your actual values +# These keys will be generated for this project with the new 'sandbox' permission + +# OAuth2 Client Credentials +CLIENT_ID=your_client_id_here +CLIENT_SECRET=your_client_secret_here + +# API URLs (optional, defaults are set in config.ts) +API_BASE_URL=https://api-dev.visualdx.com/v1 +TOKEN_URL=https://api-dev.visualdx.com/v1/auth/token + +# Audience setting: "consumer" or "clinical" (optional, default: consumer) +AUDIENCE=consumer + +# Cache settings (time-to-live in seconds, optional, default: 259200) +CACHE_TTL=259200 diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..0e81f9b --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..de7e549 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Dependencies +/node_modules +/.pnp +.pnp.js + +# Testing +/coverage + +# Next.js +/.next/ +/out/ + +# Production +/build + +# Misc +.DS_Store +*.tsbuildinfo +next-env.d.ts + +# Environment files +.env*.local + +# Vercel +.vercel + +# Typescript +*.tsbuildinfo \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..78227ea --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "github.copilot-chat" + ] +} \ No newline at end of file diff --git a/AUTHENTICATION.md b/AUTHENTICATION.md new file mode 100644 index 0000000..f1bfcbf --- /dev/null +++ b/AUTHENTICATION.md @@ -0,0 +1,120 @@ +# OAuth2 Authentication Implementation + +## Overview +The application now uses OAuth2 client credentials flow for authentication with the VisualDx API, replacing the previous API key authentication. + +## Architecture + +### Configuration (`src/lib/config.ts`) +Centralized configuration file that manages: +- API Base URL +- Token URL +- Audience (consumer/clinical) +- Cache TTL settings + +### Token Management (`src/app/api/analyze/route.ts`) +Implements automatic token lifecycle management: + +#### Token State +- `apiToken`: Stores the current access token +- `tokenExpiration`: Tracks when the token expires + +#### Key Functions + +**`fetchToken()`** +- Requests a new access token from the OAuth2 endpoint +- Uses Basic Auth with CLIENT_ID and CLIENT_SECRET +- Stores the token and calculates expiration time +- Handles errors gracefully with detailed logging + +**`ensureToken()`** +- Middleware function that checks token validity +- Automatically refreshes expired tokens +- Called before each API request + +**`analyzeImage()`** +- Updated to use the token-based authentication +- Calls `ensureToken()` before making requests +- Uses the `config.API_BASE_URL` for the image analysis endpoint +- Handles 401 errors by clearing the token for retry + +## Environment Variables + +Required in `.env.local`: +```env +CLIENT_ID=your_client_id_here +CLIENT_SECRET=your_client_secret_here +``` + +Optional (have defaults): +```env +API_BASE_URL=https://api-dev.visualdx.com/v1 +TOKEN_URL=https://api-dev.visualdx.com/v1/auth/token +AUDIENCE=consumer +CACHE_TTL=259200 +``` + +## Authentication Flow + +1. Client uploads image via the web form +2. Request arrives at `/api/analyze` endpoint +3. `ensureToken()` checks if token is valid +4. If token is missing or expired: + - Calls `fetchToken()` + - Requests new token with client credentials + - Stores token and expiration +5. Image analysis request is made with Bearer token +6. Response is processed and returned to client + +## Benefits + +- **Automatic token refresh**: No manual token management needed +- **Secure**: Client credentials never exposed to frontend +- **Efficient**: Tokens are reused until expiration +- **Resilient**: Handles token expiration and auth failures gracefully +- **Configurable**: Easy to switch between dev/prod environments + +## Error Handling + +The implementation handles various error scenarios: + +- **Missing credentials**: Returns clear error message +- **Token fetch failure**: Logs error and throws exception +- **Authentication failure (401)**: Clears token and allows retry +- **Permission errors (403)**: Returns user-friendly message +- **API failures**: Generic error handling with logging + +## Security Considerations + +- Client credentials stored in environment variables (`.env.local`) +- `.env.local` excluded from git via `.gitignore` +- Token stored in memory only (not persisted) +- Basic Auth header properly encoded +- HTTPS required for all API communications + +## Migration Notes + +**Old Authentication (API Key)** +```typescript +headers: { + 'Authorization': `Bearer ${apiKey}` +} +``` + +**New Authentication (OAuth2)** +```typescript +await ensureToken(); // Ensures valid token +headers: { + 'Authorization': `Bearer ${apiToken}` +} +``` + +## Testing + +To test the authentication: + +1. Set up `.env.local` with valid CLIENT_ID and CLIENT_SECRET +2. Start the development server: `npm run dev` +3. Upload an image through the UI +4. Check server logs for "Fetching new API token..." and "Token obtained successfully" +5. Subsequent requests should reuse the token until expiration diff --git a/PROJECT_SPEC.md b/PROJECT_SPEC.md new file mode 100644 index 0000000..57ed728 --- /dev/null +++ b/PROJECT_SPEC.md @@ -0,0 +1,51 @@ +# Image Analysis +## Description + +A simple app to analyze a user-supplied image for lesion confidences and return a list of recommended cosmetic products. + +# Image Upload form +## Description +create a page to demonstrate the API's ability to analyze an image + +## ECOA +- create a new next js demo app as a peer of the image proxy repo in our public github + +- create an index/home page at the root of the new app’s directory (e.g. /lesionAnalysis/) + +- the home page should have a “VisualDx API - Lesion Analysis Example” as an

and the page’s title + +- beneath the title should be a paragraph: “Analyze a picture of your skin to find cosmetic product recommendations.” + +- beneath that paragraph should be an tag: “Click here to see the code”, which will be a link to the github repo + +- beneath that tag should be a file input form that accepts images, just like the UX for DermExpert on the web + +- submitting the form sends the image to be analyzed by the api + +- handle auth automatically for the image analysis endpoint on the back-end + +- keys for authentication will be stored privately, and not committed to the repo + + + Note: keys will be generated for this project that us the new ‘sandbox’ permission + +- unlike other demo endpoints, there is no point in caching JSON results - we expect each POST will return a unique answer and we’re not monitoring the input + +- handle all expected error states from image analysis endpoint and display appropriate messages (e.g. “This account lacks permission to analyze images“, “Only .png and .jpg Images smaller than 10MB are supported“, etc.) + +- show a progress spinner while the image analysis is being processed async + +- when the result is returned: + + + clear any previous results or error messages from previous analysis runs + + + display the top lesion finding's name below the input for and scroll the page to the results container. + + + display results based on top lesion finding below the input in a
entitled “lesion-analysis” + + + use the attached spreadsheet to determine the new content of the results container: “

It looks like you might have [lesionName].

[Therapy Message]

+ + - The data in this spreadsheet will be updated in other Jira tickets - persist the data however you wish in the repo itself + + - if a lesion is not listed or is not recognized, the default behavior should be to display: “

I'm not sure what the condition of your skin is

Just to be safe, get this checked out by a dermatologist.

” + + + scroll the page to the top of this results container. diff --git a/README.md b/README.md new file mode 100644 index 0000000..42ea1ff --- /dev/null +++ b/README.md @@ -0,0 +1,143 @@ +# VisualDx API - Lesion Analysis Demo + +A Next.js application that demonstrates the VisualDx API's ability to analyze skin images and provide cosmetic product recommendations. + +## Features + +- Image upload form for PNG and JPG files +- Real-time validation (PNG/JPG files under 10MB) +- Automatic OAuth2 token management for API access +- Progress spinner during analysis +- Error handling for various API states +- Responsive design +- Results display with lesion identification and therapy recommendations + +## Getting Started + +### Prerequisites + +- Node.js 18+ +- npm or yarn +- VisualDx API credentials with sandbox permissions + +### Installation + +1. Clone the repository: +```bash +git clone https://github.com/VisualDx/visualdx-api-image-analysis-demo.git +cd visualdx-api-image-analysis-demo +``` + +2. Install dependencies: +```bash +npm install +``` + +3. Set up environment variables: +Create a `.env.local` file in the root directory and add your VisualDx API credentials: +```env +CLIENT_ID=your_client_id_here +CLIENT_SECRET=your_client_secret_here +API_BASE_URL=https://api-dev.visualdx.com/v1 +TOKEN_URL=https://api-dev.visualdx.com/v1/auth/token +AUDIENCE=consumer +``` + +4. Run the development server: +```bash +npm run dev +``` + +5. Open [http://localhost:3000](http://localhost:3000) in your browser. + +## Usage + +1. Navigate to the home page +2. Select a skin image file (PNG or JPG, under 10MB) +3. Click "Analyze Image" to submit +4. Wait for the analysis to complete +5. View the results with lesion identification and therapy recommendations + +## Project Structure + +``` +src/ +├── app/ +│ ├── api/ +│ │ └── analyze/ +│ │ └── route.ts # API endpoint for image analysis +│ ├── layout.tsx # Root layout component +│ ├── page.tsx # Home page component +│ └── page.module.css # Styles for home page +└── lib/ + ├── config.ts # Centralized environment configuration + ├── lesion-info.ts # Lesion lookup helpers + └── lesions-data.ts # Lesion database and therapy messages +``` + +## API Integration + +The application integrates with the VisualDx API through a secure backend endpoint that: + +- Handles authentication automatically using stored API keys +- Validates uploaded images (type, size) +- Processes API responses and maps them to lesion data +- Handles error states gracefully + +## Error Handling + +The application handles various error states: + +- **Permission errors**: "This account lacks permission to analyze images" +- **File validation**: "Only .png and .jpg images smaller than 10MB are supported" +- **Network errors**: Generic error messages for connection issues +- **Unknown lesions**: Default response for unrecognized conditions + +## Customization + +### Adding New Lesions + +Update the entries in `src/lib/lesions-data.ts` (and regenerate any helpers in `src/lib/lesion-info.ts` if needed) to add new lesion types and their corresponding therapy messages. + +### Result Messaging + +Known lesions render as: + +```html +

It looks like you might have [lesionName].

+

[Therapy Message]

+``` + +Unknown lesions fall back to: + +```html +

I'm not sure what the condition of your skin is

+

Just to be safe, get this checked out by a dermatologist.

+``` + +### Styling + +Modify `src/app/page.module.css` to customize the appearance of the application. + +## Deployment + +This application can be deployed to any platform that supports Next.js: + +- Vercel +- Netlify +- Heroku +- AWS +- Google Cloud Platform + +Make sure to set your environment variables in your deployment platform. + +## Security Notes + +- API keys are stored securely as environment variables +- Keys are never exposed to the client-side code +- All API requests are proxied through the backend +- File uploads are validated on both client and server + +## License + +This project is licensed under the MIT License. \ No newline at end of file diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..da918b3 --- /dev/null +++ b/next.config.js @@ -0,0 +1,6 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + // App directory is now stable in Next.js 14 +} + +module.exports = nextConfig \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4515ffc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5012 @@ +{ + "name": "lesion-analysis-demo", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lesion-analysis-demo", + "version": "0.1.0", + "dependencies": { + "axios": "^1.13.1", + "next": "14.0.0", + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.0.0", + "typescript": "^5" + } + }, + "node_modules/@emnapi/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "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==", + "dev": true, + "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/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.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", + "dev": true, + "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==", + "dev": true, + "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", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.0.tgz", + "integrity": "sha512-cIKhxkfVELB6hFjYsbtEeTus2mwrTC+JissfZYM0n+8Fv+g8ucUfOlm3VEDtwtwydZ0Nuauv3bl0qF82nnCAqA==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.0.tgz", + "integrity": "sha512-Ye37nNI09V3yt7pzuzSQtwlvuJ2CGzFszHXkcTHHZgNr7EhTMFLipn3VSJChy+e5+ahTdNApPphc3qCPUsn10A==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.0.tgz", + "integrity": "sha512-HQKi159jCz4SRsPesVCiNN6tPSAFUkOuSkpJsqYTIlbHLKr1mD6be/J0TvWV6fwJekj81bZV9V/Tgx3C2HO9lA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.0.tgz", + "integrity": "sha512-4YyQLMSaCgX/kgC1jjF3s3xSoBnwHuDhnF6WA1DWNEYRsbOOPWjcYhv8TKhRe2ApdOam+VfQSffC4ZD+X4u1Cg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.0.tgz", + "integrity": "sha512-io7fMkJ28Glj7SH8yvnlD6naIhRDnDxeE55CmpQkj3+uaA2Hko6WGY2pT5SzpQLTnGGnviK85cy8EJ2qsETj/g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.0.tgz", + "integrity": "sha512-nC2h0l1Jt8LEzyQeSs/BKpXAMe0mnHIMykYALWaeddTqCv5UEN8nGO3BG8JAqW/Y8iutqJsaMe2A9itS0d/r8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.0.tgz", + "integrity": "sha512-Wf+WjXibJQ7hHXOdNOmSMW5bxeJHVf46Pwb3eLSD2L76NrytQlif9NH7JpHuFlYKCQGfKfgSYYre5rIfmnSwQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.0.tgz", + "integrity": "sha512-WTZb2G7B+CTsdigcJVkRxfcAIQj7Lf0ipPNRJ3vlSadU8f0CFGv/ST+sJwF5eSwIe6dxKoX0DG6OljDBaad+rg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.0.tgz", + "integrity": "sha512-7R8/x6oQODmNpnWVW00rlWX90sIlwluJwcvMT6GXNIBOvEf01t3fBg0AGURNKdTJg2xNuP7TyLchCL7Lh2DTiw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.0.tgz", + "integrity": "sha512-RLK1nELvhCnxaWPF07jGU4x3tjbyx2319q43loZELqF0+iJtKutZ+Lk8SVmf/KiJkYBc7Cragadz7hb3uQvz4g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.0.tgz", + "integrity": "sha512-g6hLf1SUko+hnnaywQQZzzb3BRecQsoKkF3o/C+F+dOA4w/noVAJngUVkfwF0+2/8FzNznM7ofM6TGZO9svn7w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.14.1.tgz", + "integrity": "sha512-jGTk8UD/RdjsNZW8qq10r0RBvxL8OWtoT+kImlzPDFilmozzM+9QmIJsmze9UiSBrFU45ZxhTYBypn9q9z/VfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", + "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", + "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.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==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.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==", + "dev": true, + "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==", + "dev": true, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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/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==", + "dev": true, + "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.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", + "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "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==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "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==", + "dev": true, + "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==", + "dev": true, + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "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/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "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.4", + "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.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "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-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.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.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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-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.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "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/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.", + "dev": true, + "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-next": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.0.0.tgz", + "integrity": "sha512-jtXeE+/pGQ3h9n11QyyuPN50kO13GO5XvjU5ZRq6W+XTpOMjyobWmK2s7aowy0FtzA49krJzYzEU9s1RMwoJ6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "14.0.0", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true, + "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.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "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.9", + "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": "5.0.0-canary-7118f5dd7-20230705", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz", + "integrity": "sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==", + "dev": true, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "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==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "dev": true, + "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/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "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.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "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.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "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-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-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==", + "dev": true, + "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/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "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/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "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.", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "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-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "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==", + "dev": true, + "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-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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "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==", + "dev": true, + "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/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "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/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": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "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/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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/next/-/next-14.0.0.tgz", + "integrity": "sha512-J0jHKBJpB9zd4+c153sair0sz44mbaCHxggs8ryVXSFBuBqJ8XdE9/ozoV85xGh2VnSjahwntBZZgsihL9QznA==", + "license": "MIT", + "dependencies": { + "@next/env": "14.0.0", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.31", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.0.0", + "@next/swc-darwin-x64": "14.0.0", + "@next/swc-linux-arm64-gnu": "14.0.0", + "@next/swc-linux-arm64-musl": "14.0.0", + "@next/swc-linux-x64-gnu": "14.0.0", + "@next/swc-linux-x64-musl": "14.0.0", + "@next/swc-win32-arm64-msvc": "14.0.0", + "@next/swc-win32-ia32-msvc": "14.0.0", + "@next/swc-win32-x64-msvc": "14.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "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==", + "dev": true, + "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.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "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==", + "dev": true, + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.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==", + "dev": true, + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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/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==", + "dev": true, + "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/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "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==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "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/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "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/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "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/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "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==", + "dev": true, + "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/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..926cf13 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "lesion-analysis-demo", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "axios": "^1.13.1", + "next": "14.0.0", + "react": "^18", + "react-dom": "^18" + }, + "devDependencies": { + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.0.0", + "typescript": "^5" + } +} diff --git a/src/app/api/analyze/route.ts b/src/app/api/analyze/route.ts new file mode 100644 index 0000000..5e066c0 --- /dev/null +++ b/src/app/api/analyze/route.ts @@ -0,0 +1,157 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getLesionDataById } from '@/lib/lesion-info'; +import config from '@/lib/config'; +import axios from 'axios'; + +// Token management +let apiToken: string | null = null; +let tokenExpiration: number = 0; + +// Function to fetch a new API token +async function fetchToken() { + try { + console.log("Fetching new API token..."); + + const response = await axios.post(config.TOKEN_URL, { + client_id: process.env.CLIENT_ID, + client_secret: process.env.CLIENT_SECRET, + audience: config.AUDIENCE, + grant_type: "client_credentials", + }, { + headers: { + "Content-Type": "application/json", + "Authorization": `Basic ${Buffer.from(`${process.env.CLIENT_ID}:${process.env.CLIENT_SECRET}`).toString("base64")}` + } + }); + + const { access_token, expires_in } = response.data; + + apiToken = access_token; + tokenExpiration = Date.now() + expires_in * 1000; // Convert expiration to timestamp + console.log("Token obtained successfully: " + apiToken); + } catch (error) { + console.error("Error fetching token:", axios.isAxiosError(error) ? error.response?.data : error); + throw error; + } +} + +// Middleware to ensure a valid token +async function ensureToken() { + if (!apiToken || Date.now() >= tokenExpiration) { + await fetchToken(); + } +} + +export async function POST(request: NextRequest) { + try { + const formData = await request.formData(); + const image = formData.get('image') as File; + + if (!image) { + return NextResponse.json( + { error: 'No image provided' }, + { status: 400 } + ); + } + + // Validate file type and size + if (!image.type.match(/^image\/(png|jpeg|jpg)$/)) { + return NextResponse.json( + { error: 'Only .png and .jpg images smaller than 10MB are supported' }, + { status: 400 } + ); + } + + if (image.size > 10 * 1024 * 1024) { + return NextResponse.json( + { error: 'Only .png and .jpg images smaller than 10MB are supported' }, + { status: 400 } + ); + } + + // Call the VisualDx API + const analysisResult = await analyzeImage(image); + + //console.log('Analysis result:', analysisResult); + + // Extract the top finding (highest confidence) + const findings = analysisResult?.data?.findings || []; + + if (findings.length === 0) { + return NextResponse.json({ + lesionName: "I'm not sure what the condition of your skin is", + therapyMessage: "Just to be safe, get this checked out by a dermatologist." + }); + } + + // Sort by confidence (highest first) and get the top finding + const topFinding = findings.sort((a: any, b: any) => b.confidence - a.confidence)[0]; + console.log('Top finding:', topFinding); + + // Get lesion data based on the finding ID + const lesionData = getLesionDataById(topFinding.id); + + console.log('Lesion data:', lesionData); + return NextResponse.json({ + lesionName: lesionData.name, + therapyMessage: lesionData.therapyMessage + }); } catch (error) { + console.error('Analysis error:', error); + + if (error instanceof Error && error.message.includes('permission')) { + return NextResponse.json( + { error: 'This account lacks permission to analyze images' }, + { status: 403 } + ); + } + + return NextResponse.json( + { error: 'Failed to analyze image' }, + { status: 500 } + ); + } +} + +async function analyzeImage(image: File) { + const clientId = process.env.CLIENT_ID; + const clientSecret = process.env.CLIENT_SECRET; + + if (!clientId || !clientSecret) { + throw new Error('API configuration missing - CLIENT_ID and CLIENT_SECRET required'); + } + + // Ensure we have a valid token before making the request + await ensureToken(); + + // Construct the URL with audience parameter + const apiUrl = `${config.API_BASE_URL}/inferences/${config.AUDIENCE}/image`; + console.log('Making request to:', apiUrl); + + // Convert File to Buffer for axios + const arrayBuffer = await image.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + + try { + const response = await axios.post(apiUrl, buffer, { + headers: { + 'Authorization': `Bearer ${apiToken}`, + 'Content-Type': image.type, // Use the actual image MIME type (image/jpeg or image/png) + }, + }); + + return response.data; + } catch (error) { + if (axios.isAxiosError(error)) { + if (error.response?.status === 403) { + throw new Error('This account lacks permission to analyze images'); + } + if (error.response?.status === 401) { + // Token might be invalid, clear it and try again + apiToken = null; + throw new Error('Authentication failed'); + } + console.error('API request failed:', error.response?.data || error.message); + } + throw new Error('API request failed'); + } +} \ No newline at end of file diff --git a/src/app/globals.css b/src/app/globals.css new file mode 100644 index 0000000..0220399 --- /dev/null +++ b/src/app/globals.css @@ -0,0 +1,17 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + background-color: #f5f5f5; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx new file mode 100644 index 0000000..7f7d05b --- /dev/null +++ b/src/app/layout.tsx @@ -0,0 +1,19 @@ +import type { Metadata } from 'next' +import './globals.css' + +export const metadata: Metadata = { + title: 'VisualDx API - Lesion Analysis Example', + description: 'Analyze a picture of your skin to find cosmetic product recommendations.', +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} \ No newline at end of file diff --git a/src/app/page.module.css b/src/app/page.module.css new file mode 100644 index 0000000..d07e819 --- /dev/null +++ b/src/app/page.module.css @@ -0,0 +1,148 @@ +.container { + max-width: 800px; + margin: 0 auto; + padding: 2rem; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; +} + +.container h1 { + color: #333; + margin-bottom: 1rem; + font-size: 2.5rem; +} + +.container p { + margin-bottom: 1rem; + line-height: 1.6; + color: #666; + font-size: 1.1rem; +} + +.githubLink { + display: inline-block; + margin-bottom: 2rem; + color: #0070f3; + text-decoration: underline; + font-size: 1rem; +} + +.githubLink:hover { + color: #0056b3; +} + +.uploadForm { + background: #f9f9f9; + padding: 2rem; + border-radius: 8px; + margin-bottom: 2rem; + border: 1px solid #e0e0e0; +} + +.fileInput { + margin-bottom: 1rem; +} + +.fileInput input[type="file"] { + width: 100%; + padding: 1rem; + border: 2px dashed #ccc; + border-radius: 4px; + background: white; + font-size: 1rem; + cursor: pointer; +} + +.fileInput input[type="file"]:hover { + border-color: #0070f3; +} + +.submitButton { + background: #0070f3; + color: white; + border: none; + padding: 0.75rem 1.5rem; + border-radius: 4px; + cursor: pointer; + font-size: 1rem; + font-weight: 500; + transition: background-color 0.2s; +} + +.submitButton:hover:not(:disabled) { + background: #0056b3; +} + +.submitButton:disabled { + background: #ccc; + cursor: not-allowed; +} + +.spinner { + text-align: center; + padding: 2rem; +} + +.spinnerIcon { + width: 40px; + height: 40px; + margin: 0 auto 1rem; + border: 4px solid #f3f3f3; + border-top: 4px solid #0070f3; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.error { + background: #fee; + color: #c33; + padding: 1rem; + border-radius: 4px; + margin: 1rem 0; + border: 1px solid #fcc; +} + +.preview { + margin: 2rem 0; + padding: 1.5rem; + background: #f9f9f9; + border-radius: 8px; + border: 1px solid #e0e0e0; +} + +.preview h3 { + margin: 0 0 1rem 0; + color: #333; + font-size: 1.2rem; +} + +.previewImage { + max-width: 100%; + max-height: 400px; + border-radius: 4px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + display: block; + margin: 0 auto; +} + +.results { + background: #f0f8ff; + padding: 2rem; + border-radius: 8px; + border-left: 4px solid #0070f3; + margin-top: 2rem; +} + +.results p { + margin-bottom: 1rem; + color: #333; + font-size: 1.1rem; +} + +.results p:last-child { + margin-bottom: 0; +} \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx new file mode 100644 index 0000000..bd711a2 --- /dev/null +++ b/src/app/page.tsx @@ -0,0 +1,172 @@ +'use client'; + +import { useState } from 'react'; +import styles from './page.module.css'; + +interface AnalysisResult { + lesionName: string; + therapyMessage: string; +} + +export default function Home() { + const [selectedFile, setSelectedFile] = useState(null); + const [previewUrl, setPreviewUrl] = useState(''); + const [isAnalyzing, setIsAnalyzing] = useState(false); + const [result, setResult] = useState(null); + const [error, setError] = useState(''); + + const handleFileChange = (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (file) { + // Validate file type and size + if (!file.type.match(/^image\/(png|jpeg|jpg)$/)) { + setError('Only .png and .jpg images smaller than 10MB are supported'); + setPreviewUrl(''); + setResult(null); // Clear previous results + return; + } + + if (file.size > 10 * 1024 * 1024) { // 10MB + setError('Only .png and .jpg images smaller than 10MB are supported'); + setPreviewUrl(''); + setResult(null); // Clear previous results + return; + } + + setSelectedFile(file); + setError(''); + setResult(null); // Clear previous results when new image is selected + + // Create preview URL + const reader = new FileReader(); + reader.onloadend = () => { + setPreviewUrl(reader.result as string); + }; + reader.readAsDataURL(file); + } + }; + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (!selectedFile) { + setError('Please select an image file'); + return; + } + + setIsAnalyzing(true); + setError(''); + setResult(null); + + try { + const formData = new FormData(); + formData.append('image', selectedFile); + + const response = await fetch('/api/analyze', { + method: 'POST', + body: formData, + }); + + if (!response.ok) { + if (response.status === 403) { + throw new Error('This account lacks permission to analyze images'); + } + if (response.status === 400) { + const errorData = await response.json(); + throw new Error(errorData.error || 'Only .png and .jpg images smaller than 10MB are supported'); + } + throw new Error('Failed to analyze image'); + } + + const data = await response.json(); + setResult(data); + + // Clear previous results and scroll to results + setTimeout(() => { + const resultsElement = document.getElementById('lesion-analysis'); + if (resultsElement) { + resultsElement.scrollIntoView({ + behavior: 'smooth' + }); + } + }, 100); + + } catch (err) { + setError(err instanceof Error ? err.message : 'An error occurred during analysis'); + } finally { + setIsAnalyzing(false); + } + }; + + return ( +
+

VisualDx API - Lesion Analysis Example

+ +

Analyze a picture of your skin to find cosmetic product recommendations.

+ +
+ Click here to see the code + + +
+
+ +
+ + +
+ + {previewUrl && !isAnalyzing && ( +
+

Selected Image:

+ Preview +
+ )} + + {isAnalyzing && ( +
+
+

Analyzing your image...

+
+ )} + + {error && ( +
+

{error}

+
+ )} + + {result && ( +
+ {result.lesionName === "I'm not sure what the condition of your skin is" ? ( + <> +

I'm not sure what the condition of your skin is

+

{result.therapyMessage}

+ + ) : ( + <> +

It looks like you might have {result.lesionName}.

+

{result.therapyMessage}

+ + )} +
+ )} +
+ ); +} \ No newline at end of file diff --git a/src/lib/config.ts b/src/lib/config.ts new file mode 100644 index 0000000..296f7f6 --- /dev/null +++ b/src/lib/config.ts @@ -0,0 +1,10 @@ +export default { + API_BASE_URL: process.env.API_BASE_URL || "https://api-dev.visualdx.com", + TOKEN_URL: process.env.TOKEN_URL || "https://api-dev.visualdx.com/v1/auth/token", + + // Audience setting: "consumer" or "clinical" + AUDIENCE: process.env.AUDIENCE || "consumer", + + // Cache settings (time-to-live in seconds) + CACHE_TTL: process.env.CACHE_TTL || 259200, +}; diff --git a/src/lib/lesion-info.ts b/src/lib/lesion-info.ts new file mode 100644 index 0000000..e45f9bc --- /dev/null +++ b/src/lib/lesion-info.ts @@ -0,0 +1,50 @@ +import { lesionsData } from './lesions-data'; + +interface LesionInfo { + name: string; + therapyMessage: string; +} + +// Build lookup maps from the lesions data for faster access +const lesionDatabaseByName: Record = {}; +const lesionDatabaseById: Record = {}; + +lesionsData.forEach((lesion) => { + if (lesion.lesionName && lesion.therapyMessage) { + const lesionInfo: LesionInfo = { + name: lesion.lesionName, + therapyMessage: lesion.therapyMessage + }; + + // Index by name (normalized) + const normalizedName = lesion.lesionName.toLowerCase().trim(); + lesionDatabaseByName[normalizedName] = lesionInfo; + + // Index by finding ID + if (lesion.findingid) { + lesionDatabaseById[lesion.findingid] = lesionInfo; + } + } +}); + +const defaultResponse: LesionInfo = { + name: "I'm not sure what the condition of your skin is", + therapyMessage: "Just to be safe, get this checked out by a dermatologist." +}; + +export function getLesionData(lesionName: string | undefined): LesionInfo { + if (!lesionName) { + return defaultResponse; + } + + const normalizedName = lesionName.toLowerCase().trim(); + return lesionDatabaseByName[normalizedName] || defaultResponse; +} + +export function getLesionDataById(findingId: number | undefined): LesionInfo { + if (!findingId) { + return defaultResponse; + } + + return lesionDatabaseById[findingId] || defaultResponse; +} \ No newline at end of file diff --git a/src/lib/lesions-data.ts b/src/lib/lesions-data.ts new file mode 100644 index 0000000..d216729 --- /dev/null +++ b/src/lib/lesions-data.ts @@ -0,0 +1,722 @@ +export const lesionsData = [ + { + "findingid": 3017, + "lesionName": "Atrophic scar", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Silicone gels, scar creams, retinoids", + "therapyMessage": "We recommend trying silicone gels, scar creams, and retinoids.", + "therapyIds": NaN + }, + { + "findingid": 3002, + "lesionName": "Atrophy", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Retinol creams, peptides, hyaluronic acid serums", + "therapyMessage": "We recommend trying retinol creams, peptides, and hyaluronic acid serums.", + "therapyIds": NaN + }, + { + "findingid": 3269, + "lesionName": "Blanching macule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing balms, anti-inflammatory moisturizers", + "therapyMessage": "We recommend trying soothing balms and anti-inflammatory moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 3270, + "lesionName": "Blanching patch", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing balms, anti-inflammatory moisturizers", + "therapyMessage": "We recommend trying soothing balms and anti-inflammatory moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 24517, + "lesionName": "Bullae", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing creams with colloidal oatmeal, zinc oxide", + "therapyMessage": "We recommend trying soothing creams with colloidal oatmeal or zinc oxide.", + "therapyIds": NaN + }, + { + "findingid": 3116, + "lesionName": "Callus", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Exfoliating foot creams, occlusive balms", + "therapyMessage": "We recommend trying exfoliating foot creams or occlusive balms.", + "therapyIds": NaN + }, + { + "findingid": 3071, + "lesionName": "Cayenne pepper like purpura", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Gentle concealers, vitamin K creams (cosmetic use only)", + "therapyMessage": "We recommend trying gentle concealers and vitamin K creams.", + "therapyIds": NaN + }, + { + "findingid": 3117, + "lesionName": "Crust", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Exfoliating foot creams, occlusive balms", + "therapyMessage": "We recommend trying exfoliating foot creams or occlusive balms.", + "therapyIds": NaN + }, + { + "findingid": 3102, + "lesionName": "Cutaneous horn", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3265, + "lesionName": "Cyanosis", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing balms, anti-inflammatory moisturizers", + "therapyMessage": "We recommend trying soothing balms and anti-inflammatory moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 3077, + "lesionName": "Cyst", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3007, + "lesionName": "Deep skin fissures", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Barrier-repair creams, occlusive moisturizers", + "therapyMessage": "We recommend trying barrier-repair creams and occlusive moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 3008, + "lesionName": "Desquamation", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Exfoliating creams with urea, lactic acid, or salicylic acid", + "therapyMessage": "We recommend trying exfoliating creams with urea, lactic acid, or salicylic acid.", + "therapyIds": NaN + }, + { + "findingid": 3059, + "lesionName": "Dyshidrotic vesicle", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing creams with colloidal oatmeal, zinc oxide", + "therapyMessage": "We recommend trying soothing creams with colloidal oatmeal or zinc oxide.", + "therapyIds": NaN + }, + { + "findingid": 3072, + "lesionName": "Ecchymosis", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Gentle concealers, vitamin K creams (cosmetic use only)", + "therapyMessage": "We recommend trying gentle concealers and vitamin K creams.", + "therapyIds": NaN + }, + { + "findingid": 3026, + "lesionName": "Erythroderma", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing balms, anti-inflammatory moisturizers", + "therapyMessage": "We recommend trying soothing balms and anti-inflammatory moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 3118, + "lesionName": "Eschar", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure, but you might have something serious.", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3103, + "lesionName": "Excoriated skin lesion", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Barrier-repair creams, occlusive moisturizers", + "therapyMessage": "We recommend trying barrier-repair creams and occlusive moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 3013, + "lesionName": "Excoriation", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Barrier-repair creams, occlusive moisturizers", + "therapyMessage": "We recommend trying barrier-repair creams and occlusive moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 3104, + "lesionName": "Exudative, weeping", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure, but you might have something serious.", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3125, + "lesionName": "Fine scaly papule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Texture-smoothing serums, anti-inflammatory creams", + "therapyMessage": "We recommend trying texture-smoothing serums and anti-inflammatory creams.", + "therapyIds": NaN + }, + { + "findingid": 3107, + "lesionName": "Fine scaly plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Texture-smoothing serums, anti-inflammatory creams", + "therapyMessage": "We recommend trying texture-smoothing serums and anti-inflammatory creams.", + "therapyIds": NaN + }, + { + "findingid": 3014, + "lesionName": "Fine skin fissures", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Barrier-repair creams, occlusive moisturizers", + "therapyMessage": "We recommend trying barrier-repair creams and occlusive moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 3128, + "lesionName": "Flaccid bullae", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing creams with colloidal oatmeal, zinc oxide", + "therapyMessage": "We recommend trying soothing creams with colloidal oatmeal or zinc oxide.", + "therapyIds": NaN + }, + { + "findingid": 3050, + "lesionName": "Folliculitis", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Acne treatments with benzoyl peroxide, salicylic acid, niacinamide", + "therapyMessage": "We recommend trying acne treatments with benzoyl peroxide, salicylic acid, or niacinamide.", + "therapyIds": NaN + }, + { + "findingid": 20290, + "lesionName": "Friable papule", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3051, + "lesionName": "Furuncle", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3078, + "lesionName": "Gangrene", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure, but you might have something serious.", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 0, + "lesionName": "Healthy skin", + "inHeirarchyJson": "no", + "lesionMessage": "It looks like you've got healthy skin!", + "therapynames": "Cleansers, Moisturizers, Sun Screens", + "therapyMessage": "We recommend using gentle cleansers, moisturizers, and UV-protecting sun screens daily to maintain your healthy skin.", + "therapyIds": "31,32,33" + }, + { + "findingid": 3310, + "lesionName": "Hemorrhagic papule", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3266, + "lesionName": "Hyperpigmented macule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Brightening serums with niacinamide, vitamin C, hexylresorcinol", + "therapyMessage": "We recommend trying brightening serums with niacinamide, vitamin C, hexylresorcinol.", + "therapyIds": NaN + }, + { + "findingid": 3267, + "lesionName": "Hyperpigmented patch", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Brightening serums with niacinamide, vitamin C, hexylresorcinol", + "therapyMessage": "We recommend trying brightening serums with niacinamide, vitamin C, hexylresorcinol.", + "therapyIds": NaN + }, + { + "findingid": 3027, + "lesionName": "Hypopigmented macule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Brightening serums with niacinamide, vitamin C, hexylresorcinol", + "therapyMessage": "We recommend trying brightening serums with niacinamide, vitamin C, hexylresorcinol.", + "therapyIds": NaN + }, + { + "findingid": 3268, + "lesionName": "Hypopigmented patch", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Brightening serums with niacinamide, vitamin C, hexylresorcinol", + "therapyMessage": "We recommend trying brightening serums with niacinamide, vitamin C, hexylresorcinol.", + "therapyIds": NaN + }, + { + "findingid": 3111, + "lesionName": "Ichthyotic scaly plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Exfoliating creams with urea, lactic acid, or salicylic acid", + "therapyMessage": "We recommend trying exfoliating creams with urea, lactic acid, or salicylic acid.", + "therapyIds": NaN + }, + { + "findingid": 3119, + "lesionName": "Lichenified plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Emollients, keratolytics, urea-based creams", + "therapyMessage": "We recommend trying emollients, keratolytics, and urea-based creams.", + "therapyIds": NaN + }, + { + "findingid": 20223, + "lesionName": "Linear burrow", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 26335, + "lesionName": "Morbilliform rash", + "inHeirarchyJson": "no", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3318, + "lesionName": "Multicolored plaque", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 20255, + "lesionName": "Open comedone", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Acne treatments with benzoyl peroxide, salicylic acid, niacinamide", + "therapyMessage": "We recommend trying acne treatments with benzoyl peroxide, salicylic acid, or niacinamide.", + "therapyIds": NaN + }, + { + "findingid": 3074, + "lesionName": "Palpable purpura", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Gentle concealers, vitamin K creams (cosmetic use only)", + "therapyMessage": "We recommend trying gentle concealers and vitamin K creams.", + "therapyIds": NaN + }, + { + "findingid": 3306, + "lesionName": "Pedunculated papule", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 22440, + "lesionName": "Pigmented papule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Brightening serums with niacinamide, vitamin C, hexylresorcinol", + "therapyMessage": "We recommend trying brightening serums with niacinamide, vitamin C, hexylresorcinol.", + "therapyIds": NaN + }, + { + "findingid": 3317, + "lesionName": "Pigmented plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Brightening serums with niacinamide, vitamin C, hexylresorcinol", + "therapyMessage": "We recommend trying brightening serums with niacinamide, vitamin C, hexylresorcinol.", + "therapyIds": NaN + }, + { + "findingid": 3015, + "lesionName": "Pits", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Retinol creams, peptides, hyaluronic acid serums", + "therapyMessage": "We recommend trying retinol creams, peptides, and hyaluronic acid serums.", + "therapyIds": NaN + }, + { + "findingid": 3304, + "lesionName": "Plaque with ulcer", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Silicone gels, scar creams, retinoids", + "therapyMessage": "We recommend trying silicone gels, scar creams, and retinoids.", + "therapyIds": NaN + }, + { + "findingid": 3016, + "lesionName": "Poikilodermatous", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Gentle anti-redness creams, tinted moisturizers with SPF", + "therapyMessage": "We recommend trying gentle anti-redness creams and tinted moisturizers with SPF.", + "therapyIds": NaN + }, + { + "findingid": 3052, + "lesionName": "Pustule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Acne treatments with benzoyl peroxide, salicylic acid, niacinamide", + "therapyMessage": "We recommend trying acne treatments with benzoyl peroxide, salicylic acid, or niacinamide.", + "therapyIds": NaN + }, + { + "findingid": 3254, + "lesionName": "Raised scar", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Silicone gels, scar creams, retinoids", + "therapyMessage": "We recommend trying silicone gels, scar creams, and retinoids.", + "therapyIds": NaN + }, + { + "findingid": 3040, + "lesionName": "Reticular - netlike", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3133, + "lesionName": "Scaly papule", + "inHeirarchyJson": "no", + "lesionMessage": NaN, + "therapynames": "Exfoliating creams with urea, lactic acid, or salicylic acid", + "therapyMessage": "We recommend trying exfoliating creams with urea, lactic acid, or salicylic acid.", + "therapyIds": NaN + }, + { + "findingid": 3135, + "lesionName": "Scaly plaque", + "inHeirarchyJson": "no", + "lesionMessage": NaN, + "therapynames": "Exfoliating creams with urea, lactic acid, or salicylic acid", + "therapyMessage": "We recommend trying exfoliating creams with urea, lactic acid, or salicylic acid.", + "therapyIds": NaN + }, + { + "findingid": 3096, + "lesionName": "Sclerotic skin lesion", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Silicone gels, scar creams, retinoids", + "therapyMessage": "We recommend trying silicone gels, scar creams, and retinoids.", + "therapyIds": NaN + }, + { + "findingid": 3018, + "lesionName": "Sinus", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3044, + "lesionName": "Skin abscess", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Acne treatments with benzoyl peroxide, salicylic acid, niacinamide", + "therapyMessage": "We recommend trying acne treatments with benzoyl peroxide, salicylic acid, or niacinamide.", + "therapyIds": NaN + }, + { + "findingid": 3006, + "lesionName": "Skin cracks", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Barrier-repair creams, occlusive moisturizers", + "therapyMessage": "We recommend trying barrier-repair creams and occlusive moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 3011, + "lesionName": "Skin erosion", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Barrier-repair creams, occlusive moisturizers", + "therapyMessage": "We recommend trying barrier-repair creams and occlusive moisturizers.", + "therapyIds": NaN + }, + { + "findingid": 3073, + "lesionName": "Skin petechiae", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Gentle concealers, vitamin K creams (cosmetic use only)", + "therapyMessage": "We recommend trying gentle concealers and vitamin K creams.", + "therapyIds": NaN + }, + { + "findingid": 3020, + "lesionName": "Skin ulcer", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Silicone gels, scar creams, retinoids", + "therapyMessage": "We recommend trying silicone gels, scar creams, and retinoids.", + "therapyIds": NaN + }, + { + "findingid": 3080, + "lesionName": "Smooth nodule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Texture-smoothing serums, anti-inflammatory creams", + "therapyMessage": "We recommend trying texture-smoothing serums and anti-inflammatory creams.", + "therapyIds": NaN + }, + { + "findingid": 3083, + "lesionName": "Smooth papule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Texture-smoothing serums, anti-inflammatory creams", + "therapyMessage": "We recommend trying texture-smoothing serums and anti-inflammatory creams.", + "therapyIds": NaN + }, + { + "findingid": 3089, + "lesionName": "Smooth plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Texture-smoothing serums, anti-inflammatory creams", + "therapyMessage": "We recommend trying texture-smoothing serums and anti-inflammatory creams.", + "therapyIds": NaN + }, + { + "findingid": 3019, + "lesionName": "Striae", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Silicone gels, scar creams, retinoids", + "therapyMessage": "We recommend trying silicone gels, scar creams, and retinoids.", + "therapyIds": NaN + }, + { + "findingid": 3043, + "lesionName": "Telangiectasia", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Gentle anti-redness creams, tinted moisturizers with SPF", + "therapyMessage": "We recommend trying gentle anti-redness creams and tinted moisturizers with SPF.", + "therapyIds": NaN + }, + { + "findingid": 3055, + "lesionName": "Tense bullae", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing creams with colloidal oatmeal, zinc oxide", + "therapyMessage": "We recommend trying soothing creams with colloidal oatmeal or zinc oxide.", + "therapyIds": NaN + }, + { + "findingid": 3060, + "lesionName": "Tense vesicle", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing creams with colloidal oatmeal, zinc oxide", + "therapyMessage": "We recommend trying soothing creams with colloidal oatmeal or zinc oxide.", + "therapyIds": NaN + }, + { + "findingid": 3134, + "lesionName": "Thick scaly papule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Emollients, keratolytics, urea-based creams", + "therapyMessage": "We recommend trying emollients, keratolytics, and urea-based creams.", + "therapyIds": NaN + }, + { + "findingid": 3115, + "lesionName": "Thick scaly plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Emollients, keratolytics, urea-based creams", + "therapyMessage": "We recommend trying emollients, keratolytics, and urea-based creams.", + "therapyIds": NaN + }, + { + "findingid": 3309, + "lesionName": "Tiny papule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Texture-smoothing serums, anti-inflammatory creams", + "therapyMessage": "We recommend trying texture-smoothing serums and anti-inflammatory creams.", + "therapyIds": NaN + }, + { + "findingid": 3064, + "lesionName": "Tiny vesicle", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing creams with colloidal oatmeal, zinc oxide", + "therapyMessage": "We recommend trying soothing creams with colloidal oatmeal or zinc oxide.", + "therapyIds": NaN + }, + { + "findingid": 3097, + "lesionName": "Tumor", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Texture-smoothing serums, anti-inflammatory creams", + "therapyMessage": "We recommend trying texture-smoothing serums and anti-inflammatory creams.", + "therapyIds": NaN + }, + { + "findingid": 3088, + "lesionName": "Umbilicated papule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Texture-smoothing serums, anti-inflammatory creams", + "therapyMessage": "We recommend trying texture-smoothing serums and anti-inflammatory creams.", + "therapyIds": NaN + }, + { + "findingid": 3065, + "lesionName": "Umbilicated vesicle", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing creams with colloidal oatmeal, zinc oxide", + "therapyMessage": "We recommend trying soothing creams with colloidal oatmeal or zinc oxide.", + "therapyIds": NaN + }, + { + "findingid": 3311, + "lesionName": "Vascular plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Gentle anti-redness creams, tinted moisturizers with SPF", + "therapyMessage": "We recommend trying gentle anti-redness creams and tinted moisturizers with SPF.", + "therapyIds": NaN + }, + { + "findingid": 3123, + "lesionName": "Vegetative plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Emollients, keratolytics, urea-based creams", + "therapyMessage": "We recommend trying emollients, keratolytics, and urea-based creams.", + "therapyIds": NaN + }, + { + "findingid": 3126, + "lesionName": "Verrucous scaly papule", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Emollients, keratolytics, urea-based creams", + "therapyMessage": "We recommend trying emollients, keratolytics, and urea-based creams.", + "therapyIds": NaN + }, + { + "findingid": 3124, + "lesionName": "Verrucous scaly plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Emollients, keratolytics, urea-based creams", + "therapyMessage": "We recommend trying emollients, keratolytics, and urea-based creams.", + "therapyIds": NaN + }, + { + "findingid": 3058, + "lesionName": "Vesicle", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Soothing creams with colloidal oatmeal, zinc oxide", + "therapyMessage": "We recommend trying soothing creams with colloidal oatmeal or zinc oxide.", + "therapyIds": NaN + }, + { + "findingid": 3098, + "lesionName": "Wheal", + "inHeirarchyJson": "yes", + "lesionMessage": "I'm not sure what the condition of your skin is", + "therapynames": NaN, + "therapyMessage": "Just to be safe, get this checked out by a dermatologist.", + "therapyIds": NaN + }, + { + "findingid": 3121, + "lesionName": "White scaly plaque", + "inHeirarchyJson": "yes", + "lesionMessage": NaN, + "therapynames": "Emollients, keratolytics, urea-based creams", + "therapyMessage": "We recommend trying emollients, keratolytics, and urea-based creams.", + "therapyIds": NaN + } +]; diff --git a/src/lib/products-data.ts b/src/lib/products-data.ts new file mode 100644 index 0000000..161f2bc --- /dev/null +++ b/src/lib/products-data.ts @@ -0,0 +1,500 @@ +export const productsData = [ + { + "productId": 1, + "productName": "Alastin Daily Restorative Cream", + "description": "A peptide-powered anti-aging serum that improves skin texture, tone, hydration, and elasticity. Contains TriHex+™ technology and niacinamide.", + "purchaseLink": "https://alastin.com/products/restorative-skin-complex-with-trihex-plus" + }, + { + "productId": 2, + "productName": "AmLactin Foot Repair Cream", + "description": "A rich foot cream with 15% lactic acid to exfoliate and hydrate dry, cracked feet. Fragrance-free and fast-absorbing.", + "purchaseLink": "https://amlactin.com/products/foot-repair-cream-with-15-lactic-acid" + }, + { + "productId": 3, + "productName": "Aquaphor Healing Ointment", + "description": "A multi-purpose ointment for dry, cracked skin, lips, and minor wounds. Contains 41% petrolatum and glycerin.", + "purchaseLink": "https://www.aquaphorus.com/products/aquaphor-repairing-ointment/aquaphor-healing-ointment-14oz" + }, + { + "productId": 4, + "productName": "Aroamas Silicone Scar Sheets", + "description": "Medical-grade silicone sheets that soften and flatten scars from surgery, burns, and injuries. Reusable and hypoallergenic.", + "purchaseLink": "https://www.amazon.com/Aroamas-Scar-Medical-Grade-Silicone-Sheets/dp/B0F4DDRTBS" + }, + { + "productId": 5, + "productName": "Aveeno Eczema Therapy Moisturizing Cream", + "description": "Clinically proven to relieve eczema symptoms. Contains colloidal oatmeal and ceramide. Steroid-free and fragrance-free.", + "purchaseLink": "https://www.aveeno.com/products/eczema-therapy-daily-moisturizing-cream" + }, + { + "productId": 6, + "productName": "Aveeno Skin Relief Healing Ointment", + "description": "Repairs dry, cracked skin with Triple Oat Complex and shea butter. Non-greasy and fragrance-free.", + "purchaseLink": "https://www.aveeno.com/products/skin-relief-healing-ointment" + }, + { + "productId": 7, + "productName": "Avène Antirougeurs CALM Redness-Relief Soothing Mask", + "description": "A green-tinted mask that calms redness-prone skin. Contains Avène Thermal Spring Water and Ruscus extract.", + "purchaseLink": "https://www.aveneusa.com/antirougeurs-calm-soothing-repair-mask" + }, + { + "productId": 8, + "productName": "Avène Retrinal 0.1 Intensive Cream", + "description": "Anti-aging cream with retinaldehyde, vitamin E, and peptides. Reduces wrinkles and improves skin texture.", + "purchaseLink": "https://www.aveneusa.com/retrinal-intensive-cream" + }, + { + "productId": 9, + "productName": "bareMinerals Complexion Rescue Tinted Hydrating Gel Cream SPF 30", + "description": "A 3-in-1 moisturizer, skin tint, and SPF 30. Contains hyaluronic acid and squalane for hydration and glow.", + "purchaseLink": "https://www.bareminerals.com/products/complexion-rescuetinted-moisturizer-hydrating-gel-cream?variant=40493736394837" + }, + { + "productId": 10, + "productName": "BareMinerals Original Liquid Mineral Concealer", + "description": "A lightweight, creamy concealer with 90% naturally derived ingredients. Brightens dark circles and smooths fine lines.", + "purchaseLink": "https://www.bareminerals.com/products/original-liquid-mineral-concealer?variant=40500143816789" + }, + { + "productId": 11, + "productName": "Bio-Oil Skincare Oil", + "description": "A multi-use oil that helps reduce the appearance of scars, stretch marks, and uneven skin tone. Non-comedogenic and suitable for all skin types.", + "purchaseLink": "https://www.amazon.com/stores/Bio-Oil/page/F2530975-C205-426C-AFEA-A1049E6FB04C" + }, + { + "productId": 12, + "productName": "Blue Lizard Australian Sunscreen Sensitive SPF 30+", + "description": "Mineral-based sunscreen with zinc oxide and titanium dioxide. Free from parabens and fragrances. Reef-safe and ideal for sensitive skin.", + "purchaseLink": "https://bluelizardsunscreen.com/collections/sensitive" + }, + { + "productId": 13, + "productName": "CeraVe Acne Foaming Cream Cleanser (4%)", + "description": "Contains 4% benzoyl peroxide to treat acne. Includes ceramides, niacinamide, and hyaluronic acid to soothe and hydrate.", + "purchaseLink": "https://www.cerave.com/skincare/cleansers/acne-benzoyl-peroxide-cleanser" + }, + { + "productId": 14, + "productName": "CeraVe Healing Ointment", + "description": "Lanolin-free ointment with petrolatum, hyaluronic acid, and ceramides. Protects and soothes dry, cracked, or chafed skin.", + "purchaseLink": "https://www.cerave.com/skincare/moisturizers/healing-ointment" + }, + { + "productId": 15, + "productName": "CeraVe Hydrating Hyaluronic Acid Serum", + "description": "Gel-cream serum with hyaluronic acid, vitamin B5, and ceramides. Provides 24-hour hydration and supports the skin barrier.", + "purchaseLink": "https://www.cerave.com/skincare/facial-serums/hydrating-hyaluronic-acid-serum" + }, + { + "productId": 16, + "productName": "CeraVe Hydrating Mineral Sunscreen SPF 30", + "description": "100% mineral sunscreen with zinc oxide and titanium dioxide. Includes ceramides, niacinamide, and hyaluronic acid. Fragrance-free and non-comedogenic.", + "purchaseLink": "https://www.cerave.com/sunscreen/face/hydrating-mineral-sunscreen-face-lotion-spf-30" + }, + { + "productId": 17, + "productName": "CeraVe Moisturizing Cream", + "description": "Rich, non-greasy cream with ceramides and hyaluronic acid. Provides long-lasting hydration and helps restore the skin barrier.", + "purchaseLink": "https://www.cerave.com/skincare/moisturizers/moisturizing-cream" + }, + { + "productId": 18, + "productName": "CeraVe PM Facial Moisturizing Lotion", + "description": "Lightweight night moisturizer with niacinamide, hyaluronic acid, and ceramides. Oil-free and non-comedogenic.", + "purchaseLink": "https://www.cerave.com/skincare/moisturizers/pm-facial-moisturizing-lotion" + }, + { + "productId": 19, + "productName": "CeraVe SA Cleanser", + "description": "Salicylic acid cleanser that exfoliates and softens skin. Includes ceramides, niacinamide, and hyaluronic acid. Fragrance-free and non-comedogenic.", + "purchaseLink": "https://www.cerave.com/skincare/cleansers/renewing-sa-cleanser" + }, + { + "productId": 20, + "productName": "CeraVe SA Lotion for Rough & Bumpy Skin", + "description": "A lightweight, non-greasy hydrating and exfoliating lotion containing salicylic acid, lactic acid and hyaluronic acid.", + "purchaseLink": "https://www.cerave.com/skincare/moisturizers/sa-lotion-for-rough-and-bumpy-skin" + }, + { + "productId": 21, + "productName": "CeraVe SA Smoothing Cream for Rough & Bumpy Skin (10% Urea)", + "description": "Exfoliating cream with salicylic acid, lactic acid, and urea. Hydrates and smooths rough, bumpy skin. Fragrance-free and non-comedogenic.", + "purchaseLink": "https://www.cerave.com/skincare/moisturizers/sa-cream-for-rough-and-bumpy-skin" + }, + { + "productId": 22, + "productName": "Dermaceutic K Ceutic", + "description": "Restores and protects skin with essential nutrients and high SPF 50. Advanced formula to repair, nourish, protect, and soothe your skin.", + "purchaseLink": "https://www.amazon.com/Dermaceutic-Ceutic-Post-Treatment-Cream-SPF/dp/B0033YOTPW" + }, + { + "productId": 23, + "productName": "Dermal-K Clarifying Cream", + "description": "Dermal-K is a vitamin K cream designed to reduce the appearance of spider veins, bruises, burns, and scars. It contains aloe vera and is suitable for use on damaged skin, including areas affected by eczema and psoriasis.", + "purchaseLink": "https://www.amazon.com/Specialty-Products-Dermal-Clarifying-Cream/dp/B000IOJNTM" + }, + { + "productId": 24, + "productName": "Dermalogica BioLumin-C Serum", + "description": "A high-performance vitamin C serum that brightens, firms, and reduces fine lines. Features an ultra-stable vitamin C complex, peptides, and lactic acid.", + "purchaseLink": "https://www.dermalogica.com/products/biolumin-c-serum?variant=36070282166424" + }, + { + "productId": 25, + "productName": "Dr. Dennis Gross Advanced Retinol + Ferulic Texture Renewal Serum", + "description": "A gentle retinol serum with bakuchiol, rambutan, and ferulic acid. Smooths texture, reduces fine lines, and boosts radiance without irritation.", + "purchaseLink": "https://www.drdennisgross.com/advanced-retinol-ferulic-texture-renewal-serum/695866572213.html" + }, + { + "productId": 26, + "productName": "Dr. Jart+ Ceramidin Skin Barrier Moisturizing Cream", + "description": "A cushiony cream with 5 ceramides and panthenol to strengthen the skin barrier, boost elasticity, and deeply moisturize dry skin.", + "purchaseLink": "https://www.drjart.com/product/28258/111504/moisturizers/ceramidintm-skin-barrier-moisturizing-cream" + }, + { + "productId": 27, + "productName": "Dr. Scholl’s Dry, Cracked Foot Repair Cream", + "description": "A professional-strength foot cream with 25% urea, Epsom salt, and essential oils. Heals, moisturizes, and soothes dry, cracked feet.", + "purchaseLink": "https://www.drscholls.com/products/ultra-hydrating-foot-cream" + }, + { + "productId": 28, + "productName": "Drunk Elephant A-Passioni Retinol Cream", + "description": "A 1% vegan retinol cream with peptides and superfood oils. Targets fine lines, wrinkles, and uneven texture while restoring skin clarity.", + "purchaseLink": "https://www.drunkelephant.com/collections/masks/a-passioni-retinol-cream-999DE00000100.html" + }, + { + "productId": 29, + "productName": "Drunk Elephant C-Firma Fresh Day Serum", + "description": "A potent 15% vitamin C serum with ferulic acid and vitamin E. Brightens, firms, and improves signs of photoaging.", + "purchaseLink": "https://www.drunkelephant.com/collections/serums/c-firma-fresh-day-serum-812343034358.html" + }, + { + "productId": 30, + "productName": "Ebanel Urea Cream", + "description": "A 40% urea cream with 2% salicylic acid. Exfoliates, moisturizes, and repairs cracked heels, elbows, and knees. Dermatologist-tested.", + "purchaseLink": "https://ebanel.com/products/urea-cream" + }, + { + "productId": 31, + "productName": "EltaMD UV Physical Broad-Spectrum SPF 41", + "description": "A lightly tinted mineral sunscreen with zinc oxide and titanium dioxide. Water-resistant and ideal for sensitive or oily skin.", + "purchaseLink": "https://eltamd.com/products/eltamd-uv-physical-broad-spectrum-spf-41" + }, + { + "productId": 32, + "productName": "Erno Laszlo AHA Resurfacing Sleep Serum", + "description": "A 15% AHA blend with wild plum and goji berry. Gently exfoliates overnight to reduce fine lines, wrinkles, and discoloration.", + "purchaseLink": "https://www.revolve.com/erno-laszlo-aha-resurfacing-sleep-serum/dp/ERLZ-WU22/" + }, + { + "productId": 33, + "productName": "Eucerin Advanced Repair Cream", + "description": "A rich, fragrance-free cream that provides 48-hour moisture for very dry skin. Enriched with ceramides and urea to strengthen the skin barrier and smooth rough patches.", + "purchaseLink": "https://www.eucerinus.com/products/advanced-repair/advanced-repair-creme" + }, + { + "productId": 34, + "productName": "Eucerin Eczema Relief Cream", + "description": "Clinically proven to relieve dry, itchy, eczema-prone skin. Contains colloidal oatmeal, ceramide-3, and licorice root extract. Steroid-free and suitable for all ages.", + "purchaseLink": "https://www.eucerinus.com/products/eczema-relief" + }, + { + "productId": 35, + "productName": "Eucerin Roughness Relief Lotion", + "description": "A urea-enriched lotion that smooths rough, bumpy skin and provides 48-hour hydration. Fragrance-free and suitable for sensitive skin.", + "purchaseLink": "https://www.eucerinus.com/products/roughness-relief/roughness-relief-lotion" + }, + { + "productId": 36, + "productName": "First Aid Beauty Ultra Repair Cream", + "description": "A rich, fast-absorbing moisturizer that relieves dry, distressed skin and eczema. Contains colloidal oatmeal, shea butter, and ceramides. Clinically proven to strengthen the skin barrier in 7 days.", + "purchaseLink": "https://www.ulta.com/p/ultra-repair-cream-xlsImpprod13491031?sku=2567979" + }, + { + "productId": 37, + "productName": "Glow Recipe Guava Vitamin C Dark Spot Serum", + "description": "A brightening serum with 5 forms of vitamin C, guava extract, and tranexamic acid. Targets dark spots, dullness, and uneven tone. Vegan and cruelty-free.", + "purchaseLink": "https://www.glowrecipe.com/products/guava-vitamin-c-dark-spot-serum" + }, + { + "productId": 38, + "productName": "Gold Bond Rough & Bumpy Daily Skin Therapy", + "description": "A clinically tested cream with AHA, BHA, and PHA to exfoliate and smooth rough, bumpy skin. Contains 7 moisturizers and 3 vitamins. Fragrance-free and hypoallergenic.", + "purchaseLink": "https://www.goldbond.com/en-us/products/rough-bumpy" + }, + { + "productId": 39, + "productName": "ILIA Super Serum Skin Tint SPF 40", + "description": "A clean, tinted serum with mineral SPF 40, niacinamide, hyaluronic acid, and squalane. Provides light coverage and a dewy finish while improving skin texture and tone.", + "purchaseLink": "https://iliabeauty.com/products/super-serum-skin-tint-spf-40-tinted-moisturizer" + }, + { + "productId": 40, + "productName": "ILIA True Skin Serum Concealer", + "description": "A medium-coverage concealer with stabilized vitamin C, mastic, and Persian silk tree bark. Brightens and smooths skin while reducing dark circles and blemishes.", + "purchaseLink": "https://iliabeauty.com/products/true-skin-hydrating-serum-concealer" + }, + { + "productId": 41, + "productName": "Illiyoon Ceramide Ato Concentrate Cream", + "description": "A Korean moisturizer with a multi-ceramide complex that provides 100-hour hydration. Strengthens the skin barrier and soothes irritation. Suitable for all ages, including infants.", + "purchaseLink": "https://illiyoon.org/product/illiyoon-ceramide-ato-concentrate-cream-face-moisturizer-for-dry-sensitive-skin-100hr-lasting-hydration/" + }, + { + "productId": 42, + "productName": "Kelo-Cote Advanced Formula", + "description": "Clinically-tested silicone scar gel that reduces the appearance of old and new scars from surgery, burns, acne, and injuries. Self-drying, colorless, odorless, and water-resistant.", + "purchaseLink": "https://www.amazon.com/Kelo-Cote-Advanced-Formula-Scar-Grams/dp/B077HVLXZS" + }, + { + "productId": 43, + "productName": "La Roche-Posay Cicaplast Baume B5", + "description": "Multi-purpose soothing balm for dry, cracked, and irritated skin. Contains panthenol, shea butter, glycerin, and madecassoside. Suitable for adults, children, and babies.", + "purchaseLink": "https://www.laroche-posay.us/our-products/body/body-lotion/cicaplast-balm-b5-for-dry-skin-irritations-cicaplastbalmb5.html" + }, + { + "productId": 44, + "productName": "La Roche-Posay Lipikar Urea 10% Lotion", + "description": "Exfoliating and smoothing body lotion for flaky, rough, and bumpy skin. Contains 10% urea, shea butter, and allantoin. Provides 48-hour hydration.", + "purchaseLink": "https://www.laroche-posay.us/our-products/body/body-lotion/lipikar-urea-10-roughness-smoothing-lotion-3337875852302.html" + }, + { + "productId": 45, + "productName": "La Roche-Posay Pure Vitamin C Face Serum", + "description": "Anti-aging serum with 12% pure vitamin C, salicylic acid, and neurosensine. Visibly reduces wrinkles, boosts radiance, and smooths skin texture.", + "purchaseLink": "https://www.laroche-posay.us/our-products/face/face-serum/vitamin-c12-serum-3337875660570.html" + }, + { + "productId": 46, + "productName": "La Roche-Posay Rosaliac AR Serum", + "description": "Hydrating serum for visible facial redness. Soothes sensitive skin and visibly reduces redness. Formulated with ambophenol and thermal spring water.", + "purchaseLink": "https://www.laroche-posay.us/our-products/product-line/rosaliac" + }, + { + "productId": 47, + "productName": "La Roche-Posay Toleriane Double Repair Face Moisturizer", + "description": "Oil-free moisturizer with ceramide-3, niacinamide, glycerin, and prebiotic thermal water. Repairs skin barrier in 1 hour and provides 48-hour hydration.", + "purchaseLink": "https://www.laroche-posay.us/our-products/face/face-moisturizer/toleriane-double-repair-face-moisturizer-tolerianedoublerepair.html" + }, + { + "productId": 48, + "productName": "Laneige Radian-C Cream", + "description": "Korean moisturizer enriched with vitamins C and E. Brightens skin, reduces dark spots, and hydrates. Hypoallergenic and dermatologist-tested.", + "purchaseLink": "https://us.laneige.com/products/radian-c-cream" + }, + { + "productId": 49, + "productName": "Laura Mercier Tinted Moisturizer Natural Skin Perfector SPF 30", + "description": "Lightweight tinted moisturizer with SPF 30. Provides sheer coverage, hydration, and a natural dewy finish. Contains macadamia and kukui seed oils.", + "purchaseLink": "https://www.sephora.com/product/tinted-moisturizer-broad-spectrum-P109936" + }, + { + "productId": 50, + "productName": "Maelove Peptide Squad Collagen Renewal Serum", + "description": "Multi-action serum with copper peptides, Matrixyl 3000, Argireline, and rice peptides. Boosts collagen, firms skin, and reduces fine lines.", + "purchaseLink": "https://maelove.com/products/peptide-squad-collagen-renewal-serum" + }, + { + "productId": 51, + "productName": "Mederma Advanced Scar Gel", + "description": "Scar treatment gel with Cepalin botanical extract. Clinically shown to reduce the appearance of old and new scars. Use once daily.", + "purchaseLink": "https://www.mederma.com/product/mederma-advanced-scar-gel/" + }, + { + "productId": 52, + "productName": "Medik8 Crystal Retinal 3", + "description": "Medik8 Crystal Retinal 3 is a beginner-friendly, age-defying night serum formulated with 0.03% retinaldehyde—a next-generation form of vitamin A that works up to 11x faster than retinol.", + "purchaseLink": "https://us.medik8.com/products/crystal-retinal" + }, + { + "productId": 53, + "productName": "Murad InvisiScar Resurfacing Treatment", + "description": "A clinically proven scar treatment that minimizes the look of post-acne scar size, depth, texture, and discoloration in just 8 weeks.", + "purchaseLink": "https://www.murad.com/products/invisiscar-resurfacing-treatment" + }, + { + "productId": 54, + "productName": "Murad Retinal ReSculpt Overnight Treatment", + "description": "A next-generation anti-aging serum featuring encapsulated retinal (a potent form of vitamin A) that works 2.5x more effectively than free retinal", + "purchaseLink": "https://www.murad.com/products/retinal-resculpt-overnight-treatment" + }, + { + "productId": 55, + "productName": "Neutrogena Oil-Free Acne Wash", + "description": "A dermatologist-recommended cleanser with 2% salicylic acid. It penetrates deep into pores to remove excess oil and prevent breakouts. Non-comedogenic and suitable for daily use.", + "purchaseLink": "https://www.amazon.com/Neutrogena-Fragrance-Free-Salicylic-Treatment-Acne-Prone/dp/B0D47NZH59" + }, + { + "productId": 56, + "productName": "Neutrogena Rapid Clear Stubborn Acne Cleanser (10%)", + "description": "Maximum-strength cleanser with 10% benzoyl peroxide. Reduces size and redness of stubborn acne in just one day. Gentle enough for daily use.", + "purchaseLink": "https://www.amazon.com/Neutrogena-Stubborn-Acne-Cleanser-Peroxide/dp/B00S49XI6M" + }, + { + "productId": 57, + "productName": "PanOxyl Acne Foaming Wash (10%)", + "description": "A powerful daily cleanser with 10% benzoyl peroxide. Kills 99% of acne-causing bacteria in 15 seconds. Clears and prevents breakouts on face, chest, and back.", + "purchaseLink": "https://panoxyl.com/acne-products/acne-foaming-wash-benzoyl-peroxide/" + }, + { + "productId": 58, + "productName": "Paula’s Choice 10% Niacinamide Booster", + "description": "A concentrated serum with 10% niacinamide to minimize pores, refine texture, and brighten skin. Lightweight and suitable for all skin types.", + "purchaseLink": "https://www.paulaschoice.com/10pct-niacinamide-booster/798.html" + }, + { + "productId": 59, + "productName": "Paula’s Choice Clinical 1% Retinol Treatment", + "description": "A potent anti-aging serum with 1% retinol, peptides, and vitamin C. Reduces wrinkles, firms skin, and improves tone. Suitable for nightly use.", + "purchaseLink": "https://www.paulaschoice.com/clinical-1pct-retinol-treatment/801.html" + }, + { + "productId": 60, + "productName": "Paula’s Choice Skin Perfecting 2% BHA Liquid", + "description": "A leave-on exfoliant with salicylic acid. Unclogs pores, smooths texture, and reduces breakouts. Suitable for daily use.", + "purchaseLink": "https://www.paulaschoice.com/skin-perfecting-2pct-bha-liquid-exfoliant/201-2010.html" + }, + { + "productId": 61, + "productName": "Perricone MD Vitamin C Ester Brightening Serum", + "description": "A lightweight serum with vitamin C ester, squalane, and rosemary extract. Brightens, smooths, and minimizes discoloration.", + "purchaseLink": "https://www.perriconemd.com/p/vitamin-c-ester-brightening-serum/11833554/" + }, + { + "productId": 62, + "productName": "Prequel Urea Advanced Relief Moisturizing Milk (10%)", + "description": "A face and body lotion with 10% urea, niacinamide, and shea butter. Hydrates, smooths, and soothes dry, flaky skin.", + "purchaseLink": "https://prequelskin.com/products/urea-advanced-relief-moisturizing-milk?variant=45492825096504" + }, + { + "productId": 63, + "productName": "PurOrganica Urea 40% Foot Cream", + "description": "Maximum-strength foot cream with 40% urea, aloe vera, and tea tree oil. Repairs cracked heels, calluses, and rough skin.", + "purchaseLink": "https://www.amazon.com/PurOrganica-Urea-Foot-Cream-Dermatologist/dp/B0FS24VRHR" + }, + { + "productId": 64, + "productName": "Regimen Lab Level Serum", + "description": "A hyperpigmentation serum with 11 actives including niacinamide, tranexamic acid, alpha arbutin, and hexylresorcinol. Brightens, firms, and smooths skin.", + "purchaseLink": "https://regimenlab.com/products/level-serum" + }, + { + "productId": 65, + "productName": "Reviva Labs Vitamin K Cream", + "description": "A cream with 2% vitamin K and fruit extracts to reduce the appearance of bruises and dark circles. Suitable for under-eye use and sensitive skin.", + "purchaseLink": "https://www.revivalabs.com/shop/vitamin-k-creme/" + }, + { + "productId": 66, + "productName": "Saie Hydrabeam Under Eye Concealer", + "description": "A hydrating and concealing under-eye brightener with light coverage. Formulated with cucumber, tomato, and licorice root extracts to soothe, brighten, and hydrate. Vegan and clean.", + "purchaseLink": "https://www.sephora.com/product/saie-hydrabeam-brightening-hydrating-under-eye-concealer-P483685" + }, + { + "productId": 67, + "productName": "ScarAway Silicone Scar Gel", + "description": "Medical-grade silicone gel for treating old and new scars, including hypertrophic and keloid scars. Transparent, odorless, and suitable for sensitive skin.", + "purchaseLink": "https://scaraway.com/products/scaraway-silicone-scar-gel/" + }, + { + "productId": 68, + "productName": "SkinBetter Science Even Tone Correcting Serum", + "description": "A lightweight serum that improves the appearance of brown patches, sun damage, and discoloration. Features patented b.r.y.t. technology and hexylresorcinol.", + "purchaseLink": "https://www.skinbetter.com/shop-skincare/product-category/serums/even-skin-tone-correcting-serum-M018.html" + }, + { + "productId": 69, + "productName": "SkinCeuticals C E Ferulic", + "description": "A daytime antioxidant serum with 15% vitamin C, 1% vitamin E, and 0.5% ferulic acid. Protects against environmental damage and improves signs of aging.", + "purchaseLink": "https://www.skinceuticals.com/skincare/vitamin-c-serums/c-e-ferulic-with-15-l-ascorbic-acid/S17.html" + }, + { + "productId": 70, + "productName": "SkinCeuticals Hyaluronic Acid Intensifier", + "description": "A volumizing serum with 1.3% hyaluronic acid, 12% Proxylane™, and post-biotic ferment. Plumps skin, fills fine lines, and boosts hydration.", + "purchaseLink": "https://www.skinceuticals.com/skincare/hyaluronic-acid-serums/hyaluronic-acid-intensifier-multi-glycan/S122.html" + }, + { + "productId": 71, + "productName": "SkinCeuticals Hydra Balm", + "description": "An occlusive balm for very dry or compromised skin. Contains aloe vera and squalene to soothe and protect. Ideal for post-procedure care.", + "purchaseLink": "https://www.skinceuticals.com/skincare/moisturizers/hydra-balm/S38.html" + }, + { + "productId": 72, + "productName": "SkinCeuticals Retexturing Activator", + "description": "A resurfacing serum that exfoliates and hydrates. Contains hydroxyethyl urea, kombucha, and hyaluronic acid. Suitable for all skin types.", + "purchaseLink": "https://www.skinceuticals.com/skincare/exfoliating-serums/retexturing-activator/S67.html" + }, + { + "productId": 73, + "productName": "SkinCeuticals Retinol 1.0 Cream", + "description": "A high-strength retinol cream for experienced users. Improves fine lines, discoloration, and pores. Non-comedogenic and fragrance-free.", + "purchaseLink": "https://www.skinceuticals.com/skincare/retinol-creams/retinol-1.0/S70.html" + }, + { + "productId": 74, + "productName": "Skinfix Barrier+ Triple Lipid-Peptide Cream", + "description": "A rich moisturizer with ceramides, peptides, and hyaluronic acid. Clinically proven to improve hydration, firmness, and radiance.", + "purchaseLink": "https://skinfix.com/products/lipid-peptide-cream" + }, + { + "productId": 75, + "productName": "Sunday Riley Good Genes All-In-One Lactic Acid Treatment", + "description": "A lactic acid serum that exfoliates, brightens, and plumps skin. Reduces fine lines and discoloration. Suitable for all skin types.", + "purchaseLink": "https://sundayriley.com/products/good-genes-lactic-acid-treatmentformatted for printing.

" + }, + { + "productId": 76, + "productName": "The Ordinary Hyaluronic Acid 2% + B5", + "description": "A second-generation hydrating serum with five forms of hyaluronic acid and ceramides. Provides multi-depth hydration and barrier support for smoother, plumper skin.", + "purchaseLink": "https://theordinary.com/en-us/hyaluronic-acid-2-b5-serum-with-ceramides-100637.html" + }, + { + "productId": 77, + "productName": "The Ordinary Niacinamide 10% + Zinc 1%", + "description": "A high-strength vitamin and mineral blemish formula that visibly improves skin texture, reduces excess oil, and minimizes the appearance of pores.", + "purchaseLink": "https://theordinary.com/en-us/niacinamide-10-zinc-1-serum-100436.html" + }, + { + "productId": 78, + "productName": "Tower 28 SOS Daily Skin Barrier Redness Recovery Moisturizer", + "description": "A dermatologist-approved moisturizer with ceramides, hyaluronic acid, and allantoin. Clinically proven to reduce redness, improve hydration, and support the skin barrier.", + "purchaseLink": "https://www.tower28beauty.com/products/sos-daily-barrier-recovery-cream?variant=40179231653943" + }, + { + "productId": 79, + "productName": "TULA Resurfacing Gel", + "description": "A resurfacing toner with 10% glycolic acid, probiotic extracts, and hyaluronic acid. Gently exfoliates, balances pH, and improves skin texture and tone.", + "purchaseLink": "https://tula.com/products/secret-solution" + }, + { + "productId": 80, + "productName": "Vanicream Moisturizing Cream", + "description": "A non-greasy, fragrance-free cream for dry, sensitive skin. Soothes irritation and restores moisture. Free of dyes, parabens, and common irritants.", + "purchaseLink": "https://www.vanicream.com/product/vanicream-moisturizing-cream" + }, + { + "productId": 81, + "productName": "Vaseline Original Petroleum Jelly", + "description": "A triple-purified, hypoallergenic skin protectant that locks in moisture and helps heal dry, cracked skin. Suitable for sensitive skin and eczema.", + "purchaseLink": "https://www.target.com/p/vaseline-original-petroleum-jelly-13oz/-/A-92401254" + }, + { + "productId": 82, + "productName": "WOWMD 10% Niacinamide Serum", + "description": "A vegan, cruelty-free serum with niacinamide and hyaluronic acid. Targets acne, dark spots, and uneven tone while hydrating and calming the skin.", + "purchaseLink": "https://skinsort.com/products/wow-skin-science/10-niacinamide-face-serum" + }, + { + "productId": 83, + "productName": "CeraVe Hydrating Facial Cleanser", + "description": "Gentle, non-comedogenic, and packed with ceramides and hyaluronic acid to support the skin barrier and maintain hydration.", + "purchaseLink": "https://www.amazon.com/CeraVe-Hydrating-Facial-Cleanser-Fragrance/dp/B01MSSDEPK?th=1" + } +]; diff --git a/src/lib/skincare-data.ts b/src/lib/skincare-data.ts new file mode 100644 index 0000000..efa68cf --- /dev/null +++ b/src/lib/skincare-data.ts @@ -0,0 +1,29 @@ +import { lesionsData } from "./lesions-data"; +import { therapiesData } from "./therapies-data"; +import { productsData } from "./products-data"; +import type { SkincareDataset, LesionData, TherapyData } from "@/types/skincare-data.types"; + +/** + * Centralized dataset combining lesions, therapies, and products. + * Used to power lookups, recommendations, and condition mappings. + */ +export const skincareData: SkincareDataset = { + lesions: lesionsData.map((item: any): LesionData => ({ + findingId: item.findingid, + lesionName: item.lesionName, + inHeirarchyJson: item.inHeirarchyJson, + lesionMessage: item.lesionMessage, + therapyNames: item.therapynames, + therapyMessage: item.therapyMessage, + therapyIds: item.therapyIds, + })), + therapies: therapiesData.map((item: any): TherapyData => ({ + therapyId: item.therapyid, + therapyName: item.therapy, + therapyMessage: item.therapyMessage, + productIds: item.productIds, + })), + products: productsData, +}; + +export default skincareData; diff --git a/src/lib/skincare_product_examples.xlsx b/src/lib/skincare_product_examples.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fe8bddcafe8cb405523cb8746bf065c77024769e GIT binary patch literal 27062 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