From c82aca379e76e75dddb89ec1f9e5cc8c6a044f68 Mon Sep 17 00:00:00 2001 From: Romil Bijarnia Date: Thu, 29 Jan 2026 18:39:18 +0530 Subject: [PATCH 01/20] Merge conflicts go away --- backend-api/alembic/env.py | 1 + .../j2k3l4m5n678_add_user_settings_table.py | 56 +++ backend-api/app/api/v1/router.py | 5 +- backend-api/app/api/v1/scans.py | 25 +- backend-api/app/api/v1/settings.py | 56 +++ backend-api/app/models/__init__.py | 2 + backend-api/app/models/user.py | 7 + backend-api/app/models/user_settings.py | 41 ++ backend-api/app/schemas/user_settings.py | 25 + .../apps_and_services_settings.py | 62 ++- .../entra/applications/forms_settings.py | 5 +- .../1.3.4_user_owned_apps_restricted.rego | 46 +- ....5_forms_internal_phishing_protection.rego | 3 +- .../v6.0.0/metadata.json | 4 +- engine/worker/config.py | 4 + engine/worker/tasks.py | 20 + frontend/package-lock.json | 15 +- frontend/src/api/client.js | 29 ++ frontend/src/components/ComplianceChart.jsx | 288 +++++++++--- frontend/src/components/Dropdown.css | 10 +- frontend/src/components/Dropdown.jsx | 37 +- frontend/src/main.jsx | 5 + frontend/src/pages/Dashboard.css | 325 ++++++++++++- frontend/src/pages/Dashboard.jsx | 430 +++++++++++++++--- frontend/src/pages/Scans/ScansPage.css | 17 + frontend/src/pages/Scans/ScansPage.jsx | 85 +++- frontend/src/pages/SettingsPage.css | 116 +++++ frontend/src/pages/SettingsPage.jsx | 131 +++++- frontend/src/styles/global.css | 18 + frontend/src/utils/helpers.js | 1 - 30 files changed, 1674 insertions(+), 195 deletions(-) create mode 100644 backend-api/alembic/versions/j2k3l4m5n678_add_user_settings_table.py create mode 100644 backend-api/app/api/v1/settings.py create mode 100644 backend-api/app/models/user_settings.py create mode 100644 backend-api/app/schemas/user_settings.py diff --git a/backend-api/alembic/env.py b/backend-api/alembic/env.py index e7ab362f..b94188d8 100644 --- a/backend-api/alembic/env.py +++ b/backend-api/alembic/env.py @@ -19,6 +19,7 @@ from app.models.azure_connection import AzureConnection # noqa from app.models.gcp_connection import GCPConnection # noqa from app.models.aws_connection import AWSConnection # noqa +from app.models.user_settings import UserSettings # noqa from app.core.config import get_settings # this is the Alembic Config object, which provides diff --git a/backend-api/alembic/versions/j2k3l4m5n678_add_user_settings_table.py b/backend-api/alembic/versions/j2k3l4m5n678_add_user_settings_table.py new file mode 100644 index 00000000..3715524b --- /dev/null +++ b/backend-api/alembic/versions/j2k3l4m5n678_add_user_settings_table.py @@ -0,0 +1,56 @@ +"""Add user_settings table. + +Revision ID: j2k3l4m5n678 +Revises: h1i2j3k4l567 +Create Date: 2026-01-18 +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + + +# revision identifiers, used by Alembic. +revision: str = "j2k3l4m5n678" +down_revision: Union[str, Sequence[str], None] = "h1i2j3k4l567" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + op.create_table( + "user_settings", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("user_id", sa.Integer(), nullable=False), + sa.Column( + "confirm_delete_enabled", + sa.Boolean(), + nullable=False, + server_default=sa.text("true"), + ), + sa.Column( + "created_at", sa.DateTime(), server_default=sa.text("now()"), nullable=False + ), + sa.Column( + "updated_at", sa.DateTime(), server_default=sa.text("now()"), nullable=False + ), + sa.ForeignKeyConstraint(["user_id"], ["user.id"], ondelete="CASCADE"), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("user_id", name="uq_user_settings_user_id"), + ) + + op.create_index( + op.f("ix_user_settings_user_id"), + "user_settings", + ["user_id"], + unique=True, + ) + + +def downgrade() -> None: + """Downgrade schema.""" + op.drop_index(op.f("ix_user_settings_user_id"), table_name="user_settings") + op.drop_table("user_settings") + diff --git a/backend-api/app/api/v1/router.py b/backend-api/app/api/v1/router.py index 0a06f296..8bb1c4ba 100644 --- a/backend-api/app/api/v1/router.py +++ b/backend-api/app/api/v1/router.py @@ -1,5 +1,5 @@ from fastapi import APIRouter -from app.api.v1 import auth, test, evidence, m365_connections, scans, benchmarks, platforms, contact +from app.api.v1 import auth, test, evidence, m365_connections, scans, benchmarks, platforms, contact, settings api_router = APIRouter() @@ -26,3 +26,6 @@ # Contact routes api_router.include_router(contact.router) + +# User settings routes +api_router.include_router(settings.router) diff --git a/backend-api/app/api/v1/scans.py b/backend-api/app/api/v1/scans.py index 5282d064..f48c7933 100644 --- a/backend-api/app/api/v1/scans.py +++ b/backend-api/app/api/v1/scans.py @@ -1,7 +1,7 @@ """Scan API endpoints.""" from fastapi import APIRouter, Depends, HTTPException, status -from sqlalchemy import select +from sqlalchemy import delete, select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload @@ -184,3 +184,26 @@ async def get_scan_results( results = await db.execute(query) return list(results.scalars().all()) + + +@router.delete("/{scan_id}", status_code=status.HTTP_204_NO_CONTENT) +async def delete_scan( + scan_id: int, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_async_session), +) -> None: + """Delete a scan (hard delete) and its results.""" + result = await db.execute( + select(Scan).where(Scan.id == scan_id, Scan.user_id == current_user.id) + ) + scan = result.scalar_one_or_none() + if not scan: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Scan {scan_id} not found", + ) + + # Delete dependent results first (FK is not ON DELETE CASCADE). + await db.execute(delete(ScanResult).where(ScanResult.scan_id == scan_id)) + await db.delete(scan) + await db.commit() diff --git a/backend-api/app/api/v1/settings.py b/backend-api/app/api/v1/settings.py new file mode 100644 index 00000000..85c508cb --- /dev/null +++ b/backend-api/app/api/v1/settings.py @@ -0,0 +1,56 @@ +"""User settings API endpoints.""" + +from fastapi import APIRouter, Depends, status +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.core.auth import get_current_user +from app.db.session import get_async_session +from app.models.user import User +from app.models.user_settings import UserSettings +from app.schemas.user_settings import UserSettingsRead, UserSettingsUpdate + +router = APIRouter(prefix="/settings", tags=["Settings"]) + + +async def _get_or_create_settings( + db: AsyncSession, + user_id: int, +) -> UserSettings: + result = await db.execute(select(UserSettings).where(UserSettings.user_id == user_id)) + settings = result.scalar_one_or_none() + if settings: + return settings + + settings = UserSettings(user_id=user_id) + db.add(settings) + await db.commit() + await db.refresh(settings) + return settings + + +@router.get("/", response_model=UserSettingsRead) +async def get_my_settings( + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_async_session), +) -> UserSettings: + """Get settings for the current user (creates defaults on first access).""" + return await _get_or_create_settings(db, current_user.id) + + +@router.patch("/", response_model=UserSettingsRead) +async def update_my_settings( + update: UserSettingsUpdate, + current_user: User = Depends(get_current_user), + db: AsyncSession = Depends(get_async_session), +) -> UserSettings: + """Update settings for the current user.""" + settings = await _get_or_create_settings(db, current_user.id) + + if update.confirm_delete_enabled is not None: + settings.confirm_delete_enabled = update.confirm_delete_enabled + + await db.commit() + await db.refresh(settings) + return settings + diff --git a/backend-api/app/models/__init__.py b/backend-api/app/models/__init__.py index 004d1684..27c476e4 100644 --- a/backend-api/app/models/__init__.py +++ b/backend-api/app/models/__init__.py @@ -11,6 +11,7 @@ from app.models.compliance import Scan from app.models.evidence_validation import EvidenceValidation from app.models.contact import ContactSubmission, SubmissionNote, SubmissionHistory +from app.models.user_settings import UserSettings __all__ = [ "User", @@ -27,4 +28,5 @@ "ContactSubmission", "SubmissionNote", "SubmissionHistory", + "UserSettings", ] diff --git a/backend-api/app/models/user.py b/backend-api/app/models/user.py index 211d3689..7db3b99f 100644 --- a/backend-api/app/models/user.py +++ b/backend-api/app/models/user.py @@ -13,6 +13,7 @@ from app.models.m365_connection import M365Connection from app.models.contact import ContactSubmission, SubmissionHistory, SubmissionNote from app.models.oauth_account import OAuthAccount + from app.models.user_settings import UserSettings class Role(str, Enum): @@ -49,6 +50,12 @@ class User(SQLAlchemyBaseUserTable[int], Base): cascade="all, delete-orphan", lazy="selectin", ) + settings: Mapped["UserSettings"] = relationship( + back_populates="user", + uselist=False, + cascade="all, delete-orphan", + lazy="selectin", + ) m365_connections: Mapped[list["M365Connection"]] = relationship( back_populates="user" ) diff --git a/backend-api/app/models/user_settings.py b/backend-api/app/models/user_settings.py new file mode 100644 index 00000000..a3338820 --- /dev/null +++ b/backend-api/app/models/user_settings.py @@ -0,0 +1,41 @@ +from datetime import datetime + +from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, text +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from app.db.base import Base + + +class UserSettings(Base): + """Per-user application settings. + + One row per user (enforced via unique constraint on user_id). + """ + + __tablename__ = "user_settings" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int] = mapped_column( + Integer, + ForeignKey("user.id", ondelete="CASCADE"), + nullable=False, + unique=True, + index=True, + ) + + # UI preference: show confirmation dialog before destructive deletes. + confirm_delete_enabled: Mapped[bool] = mapped_column( + Boolean, + nullable=False, + server_default=text("true"), + ) + + created_at: Mapped[datetime] = mapped_column( + DateTime, nullable=False, server_default=text("now()") + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime, nullable=False, server_default=text("now()") + ) + + user = relationship("User", back_populates="settings") + diff --git a/backend-api/app/schemas/user_settings.py b/backend-api/app/schemas/user_settings.py new file mode 100644 index 00000000..6bcb3e0d --- /dev/null +++ b/backend-api/app/schemas/user_settings.py @@ -0,0 +1,25 @@ +"""Pydantic schemas for per-user settings.""" + +from datetime import datetime + +from pydantic import BaseModel + + +class UserSettingsRead(BaseModel): + """Schema for reading user settings.""" + + id: int + user_id: int + confirm_delete_enabled: bool + created_at: datetime + updated_at: datetime + + class Config: + from_attributes = True + + +class UserSettingsUpdate(BaseModel): + """Schema for updating user settings.""" + + confirm_delete_enabled: bool | None = None + diff --git a/engine/collectors/entra/applications/apps_and_services_settings.py b/engine/collectors/entra/applications/apps_and_services_settings.py index 43b00837..fed92ba9 100644 --- a/engine/collectors/entra/applications/apps_and_services_settings.py +++ b/engine/collectors/entra/applications/apps_and_services_settings.py @@ -5,7 +5,7 @@ Connection Method: Microsoft Graph API Required Scopes: OrgSettings-AppsAndServices.Read.All -Graph Endpoint: /admin/serviceAnnouncement/messages (or organization settings) +Graph Endpoint: /admin/appsAndServices (beta) """ from typing import Any @@ -27,18 +27,60 @@ async def collect(self, client: GraphClient) -> dict[str, Any]: Returns: Dict containing: - apps_and_services_settings: Apps and services configuration - - user_owned_apps_enabled: Whether users can own apps + - is_office_store_enabled: Whether users can access the Office Store + - is_app_and_services_trial_enabled: Whether users can start trials + - user_owned_apps_enabled: Back-compat derived signal (best-effort) """ - # Get organization settings for apps and services - # This uses the admin/microsoft365Apps settings endpoint + # Prefer the documented Apps & Services admin settings endpoint. + # Keep a fallback to the older path for compatibility with older tenants. + collector_error: str | None = None try: - settings = await client.get("/admin/microsoft365Apps/settings", beta=True) - except Exception: - # Fallback if endpoint not available - settings = {} + resp = await client.get("/admin/appsAndServices", beta=True) + raw_settings: dict[str, Any] | None = None + + # Handle a few plausible response shapes defensively. + if isinstance(resp, dict): + if isinstance(resp.get("settings"), dict): + raw_settings = resp.get("settings") + else: + value = resp.get("value") + if isinstance(value, dict) and isinstance(value.get("settings"), dict): + raw_settings = value.get("settings") + elif isinstance(value, list) and value and isinstance(value[0], dict): + if isinstance(value[0].get("settings"), dict): + raw_settings = value[0].get("settings") + + settings = raw_settings if raw_settings is not None else (resp or {}) + except Exception as exc: + collector_error = str(exc) + try: + settings = await client.get("/admin/microsoft365Apps/settings", beta=True) + except Exception as exc2: + collector_error = f"{collector_error} | fallback_error={exc2}" + settings = {} + + office_store_enabled = ( + settings.get("isOfficeStoreEnabled") if isinstance(settings, dict) else None + ) + trial_enabled = ( + settings.get("isAppAndServicesTrialEnabled") if isinstance(settings, dict) else None + ) + + # Best-effort derived signal used by the old policy implementation. + derived_user_owned_apps_enabled: bool | None + if isinstance(settings, dict) and "isUserAppsAndServicesEnabled" in settings: + derived_user_owned_apps_enabled = settings.get("isUserAppsAndServicesEnabled") + elif office_store_enabled is False and trial_enabled is False: + derived_user_owned_apps_enabled = False + elif office_store_enabled is True or trial_enabled is True: + derived_user_owned_apps_enabled = True + else: + derived_user_owned_apps_enabled = None return { "apps_and_services_settings": settings, - "user_owned_apps_enabled": settings.get("isUserAppsAndServicesEnabled"), - "is_office_store_enabled": settings.get("isOfficeStoreEnabled"), + "is_office_store_enabled": office_store_enabled, + "is_app_and_services_trial_enabled": trial_enabled, + "user_owned_apps_enabled": derived_user_owned_apps_enabled, + "collector_error": collector_error, } diff --git a/engine/collectors/entra/applications/forms_settings.py b/engine/collectors/entra/applications/forms_settings.py index 56452289..65fec04a 100644 --- a/engine/collectors/entra/applications/forms_settings.py +++ b/engine/collectors/entra/applications/forms_settings.py @@ -31,9 +31,11 @@ async def collect(self, client: GraphClient) -> dict[str, Any]: - external_sharing_enabled: External sharing status """ # Get Microsoft Forms admin settings + collector_error: str | None = None try: settings = await client.get("/admin/forms/settings", beta=True) - except Exception: + except Exception as exc: + collector_error = str(exc) settings = {} return { @@ -56,4 +58,5 @@ async def collect(self, client: GraphClient) -> dict[str, Any]: "record_identity_by_default_enabled": settings.get( "isRecordIdentityByDefaultEnabled" ), + "collector_error": collector_error, } diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/1.3.4_user_owned_apps_restricted.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/1.3.4_user_owned_apps_restricted.rego index 0b0308a9..c55b2cb9 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/1.3.4_user_owned_apps_restricted.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/1.3.4_user_owned_apps_restricted.rego @@ -15,7 +15,7 @@ # severity: medium # service: EntraID # requires_permissions: -# - Policy.Read.All +# - OrgSettings-AppsAndServices.Read.All package cis.microsoft_365_foundations.v6_0_0.control_1_3_4 @@ -27,25 +27,45 @@ default result := { "details": {} } +has_modern := true if { + input.is_office_store_enabled != null + input.is_app_and_services_trial_enabled != null +} else := false if { true } + +unknown := true if { input.user_owned_apps_enabled == null; input.is_office_store_enabled == null } else := true if { input.user_owned_apps_enabled == null; input.is_app_and_services_trial_enabled == null } else := false if { true } + +compliant := true if { + has_modern + input.is_office_store_enabled == false + input.is_app_and_services_trial_enabled == false +} else := true if { + not has_modern + input.user_owned_apps_enabled == false +} else := false if { true } + result := output if { - enabled := input.user_owned_apps_enabled + office := input.is_office_store_enabled + trial := input.is_app_and_services_trial_enabled + legacy_enabled := input.user_owned_apps_enabled output := { # CIS intent: restricted => disabled - "compliant": enabled == false, - "message": generate_message(enabled), - "affected_resources": generate_affected(enabled), + "compliant": compliant, + "message": generate_message(compliant, unknown), + "affected_resources": generate_affected(compliant, unknown), "details": { - "user_owned_apps_enabled": enabled, - "is_office_store_enabled": input.is_office_store_enabled + "is_office_store_enabled": office, + "is_app_and_services_trial_enabled": trial, + "user_owned_apps_enabled": legacy_enabled, + "collector_error": input.collector_error } } } -generate_message(true) := "User owned apps and services are not restricted (enabled)" -generate_message(false) := "User owned apps and services are restricted (disabled)" -generate_message(null) := "Unable to determine whether user owned apps and services are restricted" +generate_message(true, false) := "User owned apps and services are restricted (disabled)" +generate_message(false, false) := "User owned apps and services are not restricted (enabled)" +generate_message(_, true) := "Unable to determine whether user owned apps and services are restricted" -generate_affected(false) := [] -generate_affected(true) := ["User owned apps and services are enabled"] -generate_affected(null) := ["User owned apps and services setting unknown"] +generate_affected(true, false) := [] +generate_affected(false, false) := ["User owned apps and services are enabled"] +generate_affected(_, true) := ["User owned apps and services setting unknown"] diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/1.3.5_forms_internal_phishing_protection.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/1.3.5_forms_internal_phishing_protection.rego index 17342aa2..09d2282a 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/1.3.5_forms_internal_phishing_protection.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/1.3.5_forms_internal_phishing_protection.rego @@ -42,7 +42,8 @@ result := output if { "external_share_template_enabled": input.external_share_template_enabled, "external_share_result_enabled": input.external_share_result_enabled, "bing_search_enabled": input.bing_search_enabled, - "record_identity_by_default_enabled": input.record_identity_by_default_enabled + "record_identity_by_default_enabled": input.record_identity_by_default_enabled, + "collector_error": input.collector_error } } } diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/metadata.json b/engine/policies/cis/microsoft-365-foundations/v6.0.0/metadata.json index 6f611a82..c83f28ef 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/metadata.json +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/metadata.json @@ -154,7 +154,7 @@ "automation_status": "ready", "data_collector_id": "entra.applications.apps_and_services_settings", "policy_file": "1.3.4_user_owned_apps_restricted.rego", - "requires_permissions": ["Policy.Read.All"], + "requires_permissions": ["OrgSettings-AppsAndServices.Read.All"], "notes": null }, { @@ -169,7 +169,7 @@ "automation_status": "ready", "data_collector_id": "entra.applications.forms_settings", "policy_file": "1.3.5_forms_internal_phishing_protection.rego", - "requires_permissions": ["Policy.Read.All"], + "requires_permissions": ["OrgSettings-Forms.Read.All"], "notes": null }, { diff --git a/engine/worker/config.py b/engine/worker/config.py index b82ded1c..4ebe4927 100644 --- a/engine/worker/config.py +++ b/engine/worker/config.py @@ -26,6 +26,10 @@ class WorkerSettings(BaseSettings): # PowerShell service URL (optional - if set, uses HTTP instead of Docker) POWERSHELL_SERVICE_URL: str | None = None + # Performance mode: PowerShell-based controls (Exchange/Compliance/Teams) are much slower + # than Graph-based controls. Default is True to preserve full scan coverage. + ENABLE_POWERSHELL_CONTROLS: bool = True + class Config: env_file = ".env" diff --git a/engine/worker/tasks.py b/engine/worker/tasks.py index 421f0c2b..94811146 100644 --- a/engine/worker/tasks.py +++ b/engine/worker/tasks.py @@ -126,8 +126,28 @@ def run_scan(scan_id: int) -> dict: # Check automation_status before dispatching status = control.get("automation_status", "ready") + collector_id = control.get("data_collector_id") or "" if status == "ready": + # Optional fast-scan mode: allow skipping slow PowerShell-based controls only when + # explicitly disabled via ENABLE_POWERSHELL_CONTROLS=false. + if ( + settings.ENABLE_POWERSHELL_CONTROLS is False + and collector_id.startswith(("exchange.", "compliance.", "teams.")) + and not collector_id.startswith("exchange.dns.") + ): + with get_db_session() as session: + update_scan_result( + session, + result_id=result["id"], + status="skipped", + message="Skipped (fast scan): PowerShell-based controls disabled (ENABLE_POWERSHELL_CONTROLS=false).", + ) + increment_scan_skipped_count(session, scan_id) + session.commit() + skipped += 1 + continue + # Verify collector exists before dispatching if not control.get("data_collector_id"): with get_db_session() as session: diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 64ee2005..d482bbd6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -17,10 +17,12 @@ "react": "^19.1.1", "react-dom": "^19.1.1", "react-router-dom": "^7.9.1" + "react-router-dom": "^7.9.1" }, "devDependencies": { "@vitejs/plugin-react": "^5.1.2", "tailwindcss": "^4.1.18", + "tailwindcss": "^4.1.18", "vite": "^7.3.0" } }, @@ -1716,6 +1718,17 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -1894,8 +1907,6 @@ }, "node_modules/tailwindcss": { "version": "4.1.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", - "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", "dev": true, "license": "MIT" }, diff --git a/frontend/src/api/client.js b/frontend/src/api/client.js index 2f100907..8db31aa1 100644 --- a/frontend/src/api/client.js +++ b/frontend/src/api/client.js @@ -156,6 +156,18 @@ export async function getContactHistory(token, id) { return fetchWithAuth(`/v1/contact/submissions/${id}/history`, token); } +// Settings endpoints +export async function getSettings(token) { + return fetchWithAuth('/v1/settings', token); +} + +export async function updateSettings(token, data) { + return fetchWithAuth('/v1/settings', token, { + method: 'PATCH', + body: JSON.stringify(data), + }); +} + // Platform endpoints export async function getPlatforms(token) { return fetchWithAuth('/v1/platforms', token); @@ -224,6 +236,23 @@ export async function createScan(token, data) { }); } +export async function deleteScan(token, id) { + const response = await fetch(`${API_BASE_URL}/v1/scans/${id}`, { + method: 'DELETE', + headers: { + 'Authorization': `Bearer ${token}`, + }, + }); + + if (!response.ok) { + const error = await response.json().catch(() => ({ detail: response.statusText })); + throw new Error(error.detail || 'Failed to delete scan'); + } + + // DELETE returns 204 No Content, so don't try to parse JSON + return; +} + // Evidence scanner endpoints export async function getEvidenceStrategies() { // Frontend -> Backend diff --git a/frontend/src/components/ComplianceChart.jsx b/frontend/src/components/ComplianceChart.jsx index 4cf73807..9faa0cae 100644 --- a/frontend/src/components/ComplianceChart.jsx +++ b/frontend/src/components/ComplianceChart.jsx @@ -12,134 +12,274 @@ //'doughnut' and 'pie' are current options for selectedChartType import React, { useRef, useEffect } from 'react'; -import '@fontsource/league-spartan'; // Imports only the minimum required components below import { Chart as ChartJS, ArcElement, + BarController, + BarElement, + CategoryScale, + LinearScale, Tooltip, Legend, Title, DoughnutController, } from 'chart.js'; +// Plugin: draw center text for doughnut charts (e.g. "40%" / "COMPLIANCE") +const CenterTextPlugin = { + id: 'centerText', + beforeDraw(chart, _args, options) { + const opts = options || {}; + if (!opts.display) return; + if (!chart || !chart.ctx) return; + const { ctx, chartArea } = chart; + if (!chartArea) return; + + const text = String(opts.text || '').trim(); + const subtext = String(opts.subtext || '').trim(); + if (!text && !subtext) return; + + const cx = (chartArea.left + chartArea.right) / 2; + const cy = (chartArea.top + chartArea.bottom) / 2; + + ctx.save(); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + // Main text + if (text) { + ctx.fillStyle = opts.color || '#ffffff'; + ctx.font = `700 ${opts.fontSize || 34}px "League Spartan", system-ui, -apple-system, "Segoe UI", Arial`; + ctx.fillText(text, cx, cy - (subtext ? 8 : 0)); + } + + // Subtext + if (subtext) { + ctx.fillStyle = opts.subColor || 'rgba(148,163,184,0.95)'; + ctx.font = `600 ${opts.subFontSize || 12}px system-ui, -apple-system, "Segoe UI", Arial`; + ctx.fillText(subtext.toUpperCase(), cx, cy + (text ? 18 : 0)); + } + + ctx.restore(); + }, +}; + +// Plugin: draw a uniform background behind the chart within the canvas. +// This reduces visible aliasing/noise on arc edges when the UI behind the canvas is a gradient / blurred surface. +const CanvasBackgroundPlugin = { + id: 'canvasBackground', + beforeDraw(chart, _args, options) { + const color = options?.color; + if (!color) return; + const { ctx, width, height } = chart; + if (!ctx || !width || !height) return; + ctx.save(); + // Draw behind everything already drawn. + ctx.globalCompositeOperation = 'destination-over'; + ctx.fillStyle = color; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + }, +}; + ChartJS.register( ArcElement, + BarController, + BarElement, + CategoryScale, + LinearScale, Tooltip, Legend, DoughnutController, - Title + Title, + CenterTextPlugin, + CanvasBackgroundPlugin ); //Accepts chartType and dataInput as parameters. ChartType currently supports doughnut and pie chart, more to be added later. //Also needs to be provided with isDarkMode to copy theming from parent. -//dataInput should be an array of 3 numbers, being, in order, number of High Priority Items, Medium Priority Items, and Passed Items. +//dataInput can be: +// - [issues, pass] (preferred) //This should be made more robust in future. For now, since the graph is only used for one very consistent thing, this is functional. //Fallback to 1,1,1 as array if error in data. -const ComplianceChart = ({ chartType = 'doughnut', dataInput = [1, 1, 1] , isDarkMode = true}) => { +// For bar charts: +// - Provide `labelsInput` (x-axis labels) and `dataInput` (numbers). +const ComplianceChart = ({ chartType = 'doughnut', dataInput = [1, 1], labelsInput = [], isDarkMode = true }) => { const chartRef = useRef(null); const chartInstanceRef = useRef(null); - const getTextColor = (darkMode) => { + const getTextColor = (darkMode) => { return darkMode ? '#ffffff' : '#1e293b'; }; useEffect(() => { + if (!chartRef.current) return; const ctx = chartRef.current.getContext('2d'); const textColor = getTextColor(isDarkMode); + const mutedText = isDarkMode ? 'rgba(160,165,175,0.95)' : 'rgba(71,85,105,0.95)'; + // Match the dashboard "card" surface so canvas edges blend consistently. + const canvasBg = isDarkMode ? 'rgba(255, 255, 255, 0.03)' : '#ffffff'; if (chartInstanceRef.current) { chartInstanceRef.current.destroy(); } - // Data styling - const data = { - labels: ['High Priority Issues', 'Medium Priority Issues', 'Pass'], + const normalized = Array.isArray(dataInput) ? dataInput.map(n => Number(n || 0)) : [1, 1]; + + const isBar = chartType === 'bar'; + + // ------------------------- + // Doughnut / Pie (2 slices: Issues vs Pass) + // ------------------------- + const pieLabels = ['Issues', 'Pass']; + const pieColors = ['#ef4444', '#10b981']; + const pieValues = normalized.length >= 2 ? [normalized[0], normalized[1]] : [1, 1]; + + // Handle "no data" (avoid empty chart / NaN %) + const sum = (isBar ? normalized : pieValues).reduce((a, b) => a + b, 0); + const hasData = sum > 0; + const safePieValues = hasData ? pieValues : [1, 0]; + const safePieLabels = hasData ? pieLabels : ['No data', '']; + const safePieColors = hasData ? pieColors : [isDarkMode ? 'rgba(148,163,184,0.25)' : 'rgba(71,85,105,0.25)', 'rgba(0,0,0,0)']; + + // Center text: show compliance % for 2-slice (issues/pass) view + const pass = Number(pieValues[1] || 0); + const totalForPct = Number(pieValues[0] || 0) + Number(pieValues[1] || 0); + const pct = totalForPct > 0 ? Math.round((pass / totalForPct) * 100) : null; + const centerText = pct === null ? '—' : `${pct}%`; + const centerSubtext = 'compliance'; + + // ------------------------- + // Data blocks (pie vs bar) + // ------------------------- + const pieData = { + labels: safePieLabels, datasets: [{ - data: dataInput, - backgroundColor: [ - '#ef4444', - '#f97316', - '#10b981', - ], - borderColor: [ - '#ef4444', - '#f97316', - '#10b981', - ], - borderWidth: 2, - hoverOffset: 20 + data: safePieValues, + backgroundColor: safePieColors, + // Use a subtle border in the same color as the canvas background. + borderColor: canvasBg, + borderWidth: chartType === 'doughnut' ? 3 : 2, + hoverOffset: 0, + spacing: chartType === 'doughnut' ? 2 : 0, + borderRadius: chartType === 'doughnut' ? 10 : 0, + }] + }; + + const barLabels = Array.isArray(labelsInput) && labelsInput.length > 0 + ? labelsInput.map(x => String(x)) + : normalized.map((_, i) => `#${i + 1}`); + + const barData = { + labels: barLabels, + datasets: [{ + label: 'Compliance %', + data: hasData ? normalized : [0], + backgroundColor: 'rgba(16,185,129,0.55)', + borderColor: 'rgba(16,185,129,0.95)', + borderWidth: 1, + borderRadius: 10, + maxBarThickness: 44, }] }; //CONFIG AREA //Main chart area config - const config = { + const commonPlugins = { + canvasBackground: { + color: canvasBg, + }, + tooltip: { + position: 'nearest', + backgroundColor: isDarkMode ? 'rgba(2, 6, 23, 0.92)' : 'rgba(255, 255, 255, 0.92)', + titleColor: textColor, + bodyColor: textColor, + borderColor: isDarkMode ? 'rgba(59,130,246,0.25)' : 'rgba(15,23,42,0.15)', + borderWidth: 1, + padding: 10, + }, + legend: { + display: true, + position: 'bottom', + align: 'center', + labels: { + padding: 18, + color: mutedText, + usePointStyle: true, + pointStyle: 'circle', + boxWidth: 10, + boxHeight: 10, + font: { + size: 12, + weight: '600', + }, + } + }, + }; + + const config = isBar ? { + type: 'bar', + data: barData, + options: { + responsive: true, + maintainAspectRatio: false, + devicePixelRatio: (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1, + layout: { + padding: { top: 18, bottom: 14, left: 18, right: 18 } + }, + scales: { + x: { + ticks: { color: mutedText, font: { size: 12, weight: '600' } }, + grid: { color: isDarkMode ? 'rgba(148,163,184,0.12)' : 'rgba(15,23,42,0.08)' }, + }, + y: { + min: 0, + max: 100, + ticks: { color: mutedText, font: { size: 12, weight: '600' }, stepSize: 10 }, + grid: { color: isDarkMode ? 'rgba(148,163,184,0.12)' : 'rgba(15,23,42,0.08)' }, + }, + }, + plugins: { + ...commonPlugins, + }, + animation: { duration: 650 }, + } + } : { type: 'doughnut', - data: data, + data: pieData, options: { responsive: true, - maintainAspectRatio: false, //Note: the graph will break the card system and expand the card even beyond !important limits if this is set to true! - - //This is a very placeholder chart switch system. - //If its a doughnut chart, cut out a 60% hole. If its a pie chart, don't cut a hole (so yes, technically the pie chart is a doughnut chart in disguise) - //This should definitely be replaced with a switch case in future to allow more diverse chart types like bar charts! - cutout: chartType === 'doughnut' ? '60%' : '0%', - - //This padding below is required so that the hovered section (which expands on hover) doesn't clip out of frame - //If you adjust the hover offset, increase this padding as well to give spare room + maintainAspectRatio: false, + devicePixelRatio: (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1, + cutout: chartType === 'doughnut' ? '70%' : '0%', + radius: '92%', layout: { - padding: { - top: 25, - bottom: 25, - left: 25, - right: 25, - } + padding: { top: 18, bottom: 14, left: 18, right: 18 } }, - plugins: { - - /* Code for a title. Re-enable title here if you want to use this independently. Currently the card system provides a title so we don't need it. - title: { - display: true, - text: 'Compliance Scan Results', - color: 'white', - font: { - size: 18, - weight: 'bold', - }, - padding: 20 - }, - */ - - //Legend configuration - legend: { - position: 'bottom', - labels: { - padding: 45, - color: textColor, - usePointStyle: true, - font: { - size: 16, - /*family: '"League Spartan", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',*/ - }, - } + ...commonPlugins, + centerText: { + display: chartType === 'doughnut', + text: hasData ? centerText : '—', + subtext: hasData ? centerSubtext : 'no results', + color: textColor, + subColor: mutedText, + fontSize: 34, + subFontSize: 12, }, - - - //Tooltip configuration - //The tooltip will display when you hover over a section of the chart tooltip: { - position: 'nearest', + ...commonPlugins.tooltip, callbacks: { label: function(context) { const label = context.label || ''; const value = context.parsed; const total = context.dataset.data.reduce((a, b) => a + b, 0); - const percentage = ((value / total) * 100).toFixed(1); - return ` ${label}: ${value} items (${percentage}%)`; + const percentage = total > 0 ? ((value / total) * 100).toFixed(1) : '0.0'; + if (!label) return ''; + return ` ${label}: ${value} (${percentage}%)`; } } } @@ -163,12 +303,12 @@ const ComplianceChart = ({ chartType = 'doughnut', dataInput = [1, 1, 1] , isDar chartInstanceRef.current.destroy(); } }; - }, [chartType, dataInput]); //Re-render if the chartType or data is changed + }, [chartType, dataInput, labelsInput, isDarkMode]); //Re-render if the chartType or data is changed //Scale to fit the max size provided with the card return (
- +
); }; diff --git a/frontend/src/components/Dropdown.css b/frontend/src/components/Dropdown.css index 05f1ac74..6b786499 100644 --- a/frontend/src/components/Dropdown.css +++ b/frontend/src/components/Dropdown.css @@ -44,6 +44,7 @@ Updated with theme support while preserving original design */ display: inline-block; min-width: 0; flex-shrink: 1; + isolation: isolate; } .chart-dropdown-trigger { @@ -52,7 +53,7 @@ Updated with theme support while preserving original design */ border-radius: 8px; color: var(--dropdown-text-primary); padding: 8px 12px; - font-size: 18px; + font-size: 14px; font-weight: bold; cursor: pointer; display: flex; @@ -108,12 +109,13 @@ Updated with theme support while preserving original design */ right: 0; left: 0; margin-top: 4px; - background: var(--dropdown-bg-primary); + background-color: var(--dropdown-bg-primary); border: 1px solid var(--dropdown-border-color); border-radius: 8px; box-shadow: 0 10px 25px var(--dropdown-shadow); - z-index: 1000; + z-index: 1100; overflow: hidden; + opacity: 1; transition: all 0.3s ease; } @@ -147,4 +149,4 @@ Updated with theme support while preserving original design */ /* if user hovers over already selected option */ .chart-dropdown-option.selected:hover { background: var(--dropdown-selected-hover); -} \ No newline at end of file +} diff --git a/frontend/src/components/Dropdown.jsx b/frontend/src/components/Dropdown.jsx index 157843ef..0245e736 100644 --- a/frontend/src/components/Dropdown.jsx +++ b/frontend/src/components/Dropdown.jsx @@ -11,6 +11,8 @@ import './Dropdown.css'; const Dropdown = ({ value, onChange, options, isDarkMode = true }) => { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); + const safeOptions = Array.isArray(options) ? options : []; + const hasOptions = safeOptions.length > 0; useEffect(() => { // Closes dropdown if clicks anywhere outside of the dropdown @@ -20,8 +22,18 @@ const Dropdown = ({ value, onChange, options, isDarkMode = true }) => { } }; + const handleKeyDown = (event) => { + if (event.key === 'Escape') { + setIsOpen(false); + } + }; + document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside); + document.addEventListener('keydown', handleKeyDown); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + document.removeEventListener('keydown', handleKeyDown); + }; }, []); const handleSelect = (option) => { @@ -30,28 +42,37 @@ const Dropdown = ({ value, onChange, options, isDarkMode = true }) => { }; //Set option state to provided option from function call. Fall back to first possible option if any errors. - const selectedOption = options.find(opt => opt.value === value) || options[0]; + const selectedOption = safeOptions.find(opt => opt.value === value) || safeOptions[0]; + const selectedLabel = selectedOption?.label ?? 'No options'; return (
{/* we use this ref to detect if we've clicked outside of the dropdown (to close it)*/} {/* render only if isOpen is true */} - {isOpen && ( -
- {options.map((option) => ( //loop through the array to map the options to the list + {isOpen && hasOptions && ( +
+ {safeOptions.map((option) => ( //loop through the array to map the options to the list @@ -62,4 +83,4 @@ const Dropdown = ({ value, onChange, options, isDarkMode = true }) => { ); }; -export default Dropdown; \ No newline at end of file +export default Dropdown; diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index 02949254..4f4d0c6f 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -3,6 +3,11 @@ import ReactDOM from 'react-dom/client'; import { BrowserRouter as Router } from 'react-router-dom'; import { AuthProvider } from './context/AuthContext'; +// Fonts (load once at app startup to reduce layout shifts) +import '@fontsource/league-spartan/400.css'; +import '@fontsource/league-spartan/600.css'; +import '@fontsource/league-spartan/700.css'; + // Tailwind + tokens + base (includes tokens.css & components.css) import './styles/global.css'; diff --git a/frontend/src/pages/Dashboard.css b/frontend/src/pages/Dashboard.css index 152cd3a1..50c7bcd2 100644 --- a/frontend/src/pages/Dashboard.css +++ b/frontend/src/pages/Dashboard.css @@ -40,7 +40,10 @@ --teal: #3b82f6; min-height: 100vh; - background: var(--bg-primary); + background: + radial-gradient(1200px 650px at 280px 0px, rgba(59, 130, 246, 0.22), transparent 60%), + radial-gradient(900px 540px at calc(100% - 260px) 80px, rgba(16, 185, 129, 0.14), transparent 65%), + var(--bg-primary); padding: clamp(16px, 2vw, 28px); transition: background-color 0.3s ease; } @@ -102,6 +105,8 @@ /* Styles for top toolbar */ .top-toolbar { + position: relative; + z-index: 50; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; @@ -112,6 +117,7 @@ padding: 16px 24px; margin-bottom: 0; transition: all 0.3s ease; + overflow: visible; } .toolbar-left { @@ -120,6 +126,8 @@ gap: 12px; min-width: 0; flex: 1; + flex-wrap: wrap; + overflow: visible; } .nav-icon { @@ -167,6 +175,30 @@ transform: translateY(-1px); } +.dashboard-banner { + display: flex; + align-items: center; + gap: 10px; + padding: 12px 16px; + border-radius: 12px; + background: var(--bg-secondary); + border: 1px solid var(--border-color); + color: var(--text-primary); +} + +.dashboard-banner.error { + border-left: 4px solid var(--red); +} + +.dashboard-banner .spinning { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + /* Updated primary button to use teal */ .toolbar-button.primary { background: linear-gradient(135deg, var(--teal), var(--teal)); @@ -260,9 +292,11 @@ input:checked + .slider:before { .stats-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 20px; margin-bottom: 0; + align-items: stretch; + grid-auto-rows: 1fr; } .stat-card { @@ -274,6 +308,7 @@ input:checked + .slider:before { overflow: hidden; transition: all 0.3s ease; min-height: 112px; + height: 100%; } .stat-card.emerald { @@ -382,6 +417,13 @@ input:checked + .slider:before { align-items: start; } +.left-stack { + display: flex; + flex-direction: column; + gap: 24px; + min-width: 0; +} + .compliance-graph-card { background: var(--bg-secondary); border-radius: 12px; @@ -390,13 +432,28 @@ input:checked + .slider:before { border-left: 4px solid var(--text-secondary); min-height: 0; max-height: 100% !important; - overflow: hidden; + overflow: visible; + position: relative; display: flex; flex-direction: column; gap: 16px; transition: all 0.3s ease; } +.compliance-graph-card .issue-header { + position: relative; + z-index: 5; +} + +.chart-surface { + position: relative; + width: 100%; + height: clamp(300px, 34vh, 380px); + min-height: 300px; + overflow: hidden; + z-index: 1; +} + .compliance-graph-card .issue-icon { color: #94a3b8; background: rgba(100, 116, 139, 0.2); @@ -438,6 +495,15 @@ input:checked + .slider:before { border-left-color: var(--emerald); } +.issue-card.muted { + border-left-color: rgba(59, 130, 246, 0.4); +} + +.issue-card.muted .issue-icon { + color: rgba(148, 163, 184, 0.95); + background: rgba(148, 163, 184, 0.15); +} + .issue-header { display: flex; align-items: center; @@ -514,7 +580,257 @@ input:checked + .slider:before { transition: color 0.3s ease; } +/* Recent scans panel (table) */ +.dashboard-panel { + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: 12px; + padding: 18px; +} + +.panel-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; + margin-bottom: 12px; +} + +.panel-title h3 { + margin: 0; + font-size: 16px; + font-weight: 700; + color: var(--text-primary); +} + +.panel-title p { + margin: 4px 0 0 0; + font-size: 12px; + color: var(--text-secondary); +} + +.panel-empty { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 14px 12px; + border-radius: 10px; + background: var(--bg-tertiary); + border: 1px solid var(--border-color); +} + +.panel-empty p { + margin: 0; + color: var(--text-secondary); + font-size: 13px; +} + +.dashboard-table-wrap { + border-radius: 10px; + overflow: hidden; + border: 1px solid var(--border-color); +} + +.dashboard-table { + width: 100%; + border-collapse: collapse; +} + +.dashboard-table thead th { + text-align: left; + padding: 12px 14px; + font-size: 12px; + font-weight: 700; + color: var(--text-secondary); + background: var(--bg-tertiary); + border-bottom: 1px solid var(--border-color); +} + +.dashboard-table tbody td { + padding: 12px 14px; + border-bottom: 1px solid var(--border-color); + color: var(--text-primary); + font-size: 13px; +} + +.dashboard-table tbody tr:hover td { + background: rgba(255, 255, 255, 0.02); +} + +.dashboard-table .right { + text-align: right; +} + +.status-pill { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 999px; + padding: 4px 10px; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.3px; + border: 1px solid var(--border-color); + background: var(--bg-tertiary); + color: var(--text-primary); +} + +.status-pill.success { + border-color: rgba(16, 185, 129, 0.35); + background: rgba(16, 185, 129, 0.12); + color: var(--emerald); +} + +.status-pill.error { + border-color: rgba(239, 68, 68, 0.35); + background: rgba(239, 68, 68, 0.12); + color: var(--red); +} + +.status-pill.running { + border-color: rgba(59, 130, 246, 0.35); + background: rgba(59, 130, 246, 0.12); + color: #93c5fd; +} + +.status-pill.pending { + border-color: rgba(249, 115, 22, 0.35); + background: rgba(249, 115, 22, 0.12); + color: var(--orange); +} + +.dt { + display: flex; + flex-direction: column; + gap: 2px; + line-height: 1.2; +} + +.dt .date { + font-weight: 700; + font-size: 12px; +} + +.dt .time { + color: var(--text-tertiary); + font-size: 12px; +} + +.result-pills { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.pill { + display: inline-flex; + align-items: center; + border-radius: 999px; + padding: 3px 8px; + font-size: 12px; + border: 1px solid var(--border-color); + background: var(--bg-tertiary); +} + +.pill.good { + color: var(--emerald); + border-color: rgba(16, 185, 129, 0.35); + background: rgba(16, 185, 129, 0.10); +} + +.pill.bad { + color: var(--red); + border-color: rgba(239, 68, 68, 0.35); + background: rgba(239, 68, 68, 0.10); +} + +.pill.warn { + color: var(--orange); + border-color: rgba(249, 115, 22, 0.35); + background: rgba(249, 115, 22, 0.10); +} + +.link-button { + background: transparent; + border: 1px solid var(--border-color); + color: var(--text-primary); + padding: 6px 10px; + border-radius: 8px; + cursor: pointer; + font-weight: 600; +} + +.link-button:hover { + border-color: rgba(59, 130, 246, 0.45); + background: rgba(59, 130, 246, 0.10); +} + +.fix-list { + display: flex; + flex-direction: column; + gap: 10px; + margin-top: 12px; +} + +.fix-item { + width: 100%; + display: grid; + grid-template-columns: 72px minmax(0, 1fr); + gap: 10px; + align-items: start; + text-align: left; + padding: 10px 12px; + border-radius: 12px; + border: 1px solid var(--border-color); + background: var(--bg-tertiary); + color: var(--text-primary); + cursor: pointer; + transition: all 0.2s ease; +} + +.fix-item:hover { + border-color: rgba(59, 130, 246, 0.45); + background: rgba(59, 130, 246, 0.10); +} + +.fix-id { + font-variant-numeric: tabular-nums; + font-weight: 800; + font-size: 12px; + color: rgba(147, 197, 253, 0.95); +} + +.fix-msg { + font-size: 12px; + line-height: 1.35; + color: var(--text-secondary); + overflow: hidden; + display: -webkit-box; + line-clamp: 2; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +.fix-empty { + padding: 12px; + border-radius: 10px; + background: var(--bg-tertiary); + border: 1px solid var(--border-color); + margin-top: 12px; +} + +.fix-empty p { + margin: 0; + color: var(--text-secondary); + font-size: 13px; + line-height: 1.4; +} + @media (max-width: 1024px) { + .stats-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } .main-grid { grid-template-columns: 1fr; } @@ -525,6 +841,9 @@ input:checked + .slider:before { } @media (max-width: 640px) { + .stats-grid { + grid-template-columns: 1fr; + } .main-grid { grid-template-columns: 1fr; } diff --git a/frontend/src/pages/Dashboard.jsx b/frontend/src/pages/Dashboard.jsx index 3bcf794f..a8ea778c 100644 --- a/frontend/src/pages/Dashboard.jsx +++ b/frontend/src/pages/Dashboard.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useEffect, useMemo, useState } from "react"; import "./Dashboard.css"; import ComplianceChart from "../components/ComplianceChart"; import Dropdown from "../components/Dropdown"; @@ -8,43 +8,249 @@ import { AlertTriangle, Clock3, Shield, - AlertOctagon, Sun, Moon, } from "lucide-react"; - +import { Loader2, AlertCircle } from "lucide-react"; +import { useAuth } from "../context/AuthContext"; +import { getBenchmarks, getConnections, getScans, getScan } from "../api/client"; +import { formatDateTimePartsAEST } from "../utils/helpers"; export default function Dashboard({ sidebarWidth = 220, isDarkMode, onThemeToggle }) { const navigate = useNavigate(); - - const stats = [ - { label: "Compliance Score", value: "85%", className: "emerald", subtitle: "Overall security posture", icon: CheckCircle2 }, - { label: "Failed Checks", value: "12", className: "orange", subtitle: "Requiring immediate attention", icon: AlertTriangle }, - { label: "Last Scan", value: "2h ago", className: "gray", subtitle: "Monday, August 14, 2025", icon: Clock3 }, - { label: "Total Controls", value: "97", className: "gray", subtitle: "CIS Rules Benchmark", icon: Shield } - ]; + const { token } = useAuth(); - const benchmarkOptions = [ - { value: 'cis-google-cloud', label: 'CIS Google Cloud Platform Foundation' }, - { value: 'cis-microsoft-365', label: 'CIS Microsoft 365 Foundation' }, - { value: 'nist-cybersecurity', label: 'NIST Cybersecurity Framework' }, - { value: 'iso-27001', label: 'ISO 27001' }, - ]; + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + const [scans, setScans] = useState([]); + const [connections, setConnections] = useState([]); + const [benchmarks, setBenchmarksState] = useState([]); + + const [scanDetailsById, setScanDetailsById] = useState({}); + const [scanDetailsError, setScanDetailsError] = useState(null); const chartTypeOptions = [ { value: 'doughnut', label: 'Doughnut Chart' }, { value: 'pie', label: 'Pie Chart' }, + { value: 'bar', label: 'Compliance Trend (Bar)' }, ]; const [selectedChartType, setSelectedChartType] = useState('doughnut'); - const [selectedBenchmark, setSelectedBenchmark] = useState('cis-google-cloud'); + const [selectedConnectionId, setSelectedConnectionId] = useState('all'); + const [selectedBenchmarkKey, setSelectedBenchmarkKey] = useState('all'); - const handleExportReport = () => { - console.log('Exporting report...'); - }; + useEffect(() => { + async function loadDashboard() { + if (!token) return; + setIsLoading(true); + setError(null); + try { + const [scansData, connectionsData, benchmarksData] = await Promise.all([ + getScans(token), + getConnections(token), + getBenchmarks(token), + ]); + setScans(scansData || []); + setConnections(connectionsData || []); + setBenchmarksState(benchmarksData || []); + + // Prefer the latest completed scan as the default context. + const completed = (scansData || []).filter(s => s.status === 'completed'); + const latestCompleted = completed.length > 0 ? completed[0] : null; // API sorts started_at desc + if (latestCompleted) { + if (latestCompleted.m365_connection_id) { + setSelectedConnectionId(String(latestCompleted.m365_connection_id)); + } + if (latestCompleted.framework && latestCompleted.benchmark && latestCompleted.version) { + setSelectedBenchmarkKey(`${latestCompleted.framework}|${latestCompleted.benchmark}|${latestCompleted.version}`); + } + } + } catch (err) { + setError(err?.message || 'Failed to load dashboard'); + } finally { + setIsLoading(false); + } + } + + loadDashboard(); + }, [token]); + + const benchmarkOptions = useMemo(() => { + const m365 = (benchmarks || []).filter(b => String(b.platform || '').toLowerCase() === 'm365'); + const opts = m365.map(b => ({ + value: `${b.framework}|${b.slug}|${b.version}`, + label: `${b.name} (${b.version})`, + })); + return [{ value: 'all', label: 'All benchmarks' }, ...opts]; + }, [benchmarks]); + + const connectionOptions = useMemo(() => { + const opts = (connections || []).map(c => ({ value: String(c.id), label: c.name || `Connection #${c.id}` })); + return [{ value: 'all', label: 'All connections' }, ...opts]; + }, [connections]); + + const filteredScans = useMemo(() => { + let out = scans || []; + if (selectedConnectionId !== 'all') { + out = out.filter(s => String(s.m365_connection_id || '') === selectedConnectionId); + } + if (selectedBenchmarkKey !== 'all') { + out = out.filter(s => `${s.framework}|${s.benchmark}|${s.version}` === selectedBenchmarkKey); + } + return out; + }, [scans, selectedConnectionId, selectedBenchmarkKey]); + + const latestRelevantScan = useMemo(() => { + if (!filteredScans || filteredScans.length === 0) return null; + const completed = filteredScans.filter(s => s.status === 'completed'); + if (completed.length > 0) return completed[0]; + return filteredScans[0]; + }, [filteredScans]); + + const chartModel = useMemo(() => { + const s = latestRelevantScan; + const passed = Number(s?.passed_count || 0); + const failed = Number(s?.failed_count || 0); + const errors = Number(s?.error_count || 0); + const issues = failed + errors; + + if (selectedChartType === 'bar') { + const completed = (filteredScans || []) + .filter(x => String(x.status || '').toLowerCase() === 'completed') + .slice(0, 8) + .slice() + .reverse(); + + const labels = completed.map(x => `#${x.id}`); + const values = completed.map(x => { + const total = Number(x.total_controls || 0); + const pass = Number(x.passed_count || 0); + return total > 0 ? Math.round((pass / total) * 100) : 0; + }); + + return { chartType: 'bar', labels, values }; + } + + // Default: issues vs pass (doughnut or pie) + return { chartType: selectedChartType, labels: ['Issues', 'Pass'], values: [issues, passed] }; + }, [selectedChartType, latestRelevantScan, filteredScans]); + + const latestScanDetails = useMemo(() => { + const id = latestRelevantScan?.id; + if (!id) return null; + return scanDetailsById[id] || null; + }, [latestRelevantScan?.id, scanDetailsById]); + + useEffect(() => { + async function loadScanDetails() { + if (!token) return; + const id = latestRelevantScan?.id; + if (!id) return; + + // Cache scan details in-memory to avoid refetching on minor UI changes. + if (scanDetailsById[id]) return; + + setScanDetailsError(null); + try { + const detail = await getScan(token, id); + setScanDetailsById(prev => ({ ...prev, [id]: detail })); + } catch (err) { + setScanDetailsError(err?.message || 'Failed to load scan details'); + } + } + + loadScanDetails(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [token, latestRelevantScan?.id]); + + const stats = useMemo(() => { + const s = latestRelevantScan; + const total = s ? Number(s.total_controls || 0) : 0; + const passed = s ? Number(s.passed_count || 0) : 0; + const failed = s ? Number(s.failed_count || 0) : 0; + const errors = s ? Number(s.error_count || 0) : 0; + const issues = failed + errors; + const pct = total > 0 ? Math.round((passed / total) * 100) : 0; + + const connectionLabel = s?.connection_name || (s?.m365_connection_id ? `Connection #${s.m365_connection_id}` : '—'); + const lastScanLabel = s?.finished_at || s?.started_at || null; + const dt = lastScanLabel ? formatDateTimePartsAEST(lastScanLabel) : { date: '-', time: '-' }; + const lastText = dt.date !== '-' ? `${dt.date}, ${dt.time}` : '—'; + const benchmarkLabel = s?.benchmark && s?.version ? `${s.benchmark} ${s.version}` : '—'; + + return [ + { + label: "Compliance Score", + value: total > 0 ? `${pct}%` : '—', + className: "orange", + subtitle: "Latest completed scan", + icon: CheckCircle2, + }, + { + label: "Failed Controls", + value: String(issues), + className: "orange", + subtitle: "Failed + errors", + icon: AlertTriangle, + }, + { + label: "Last Updated", + value: lastText, + className: "gray", + subtitle: connectionLabel, + icon: Clock3, + }, + { + label: "Total Controls", + value: total > 0 ? String(total) : '—', + className: "gray", + subtitle: benchmarkLabel, + icon: Shield, + }, + ]; + }, [latestRelevantScan]); + + const nextFixes = useMemo(() => { + const results = latestScanDetails?.results || []; + const failed = results.filter(r => (r?.status || '').toLowerCase() === 'failed'); + const errors = results.filter(r => (r?.status || '').toLowerCase() === 'error'); + const byControlId = (a, b) => String(a?.control_id || '').localeCompare(String(b?.control_id || ''), undefined, { numeric: true }); + return { + failedCount: failed.length, + errorCount: errors.length, + topItems: failed.slice().sort(byControlId).slice(0, 6).concat(errors.slice().sort(byControlId).slice(0, 2)), + }; + }, [latestScanDetails]); + + const recentScans = useMemo(() => { + return (filteredScans || []).slice(0, 6); + }, [filteredScans]); + + function statusTone(status) { + switch (String(status || '').toLowerCase()) { + case 'completed': + return 'success'; + case 'failed': + return 'error'; + case 'running': + return 'running'; + default: + return 'pending'; + } + } const handleRunNewScan = () => { - console.log('Running scan...'); + const preselect = { + m365_connection_id: selectedConnectionId !== 'all' ? Number(selectedConnectionId) : undefined, + benchmark_key: selectedBenchmarkKey !== 'all' ? selectedBenchmarkKey : undefined, + }; + navigate('/scans', { state: { openNewScan: true, preselect } }); + }; + + const handleExportReport = () => { + if (!latestRelevantScan?.id) return; + navigate(`/scans/${latestRelevantScan.id}`); }; const handleEvidenceScanner = () => { @@ -96,17 +302,24 @@ export default function Dashboard({ sidebarWidth = 220, isDarkMode, onThemeToggl
+ Connection + Benchmark
-
+ {isLoading && ( +
+ + Loading latest results… +
+ )} + + {error && !isLoading && ( +
+ + {error} +
+ )} +
{stats.map((stat, index) => { const Icon = stat.icon; // uppercase component so React renders the imported icon @@ -141,60 +368,147 @@ export default function Dashboard({ sidebarWidth = 220, isDarkMode, onThemeToggl
-
-
-
- -

Scan Results

-
+
+
+
+
+ +

Scan Results

+
+
+
+ +
- -
-
-
-
-
- -

High Priority Issues

+
+
+
+

Recent Scans

+

Latest activity for your selected connection/benchmark

- 3 +
-

Critical security gaps

-
-
-
-
- -

Medium Priority Issues

+ {recentScans.length === 0 ? ( +
+

No scans found for the current filters.

+
- 9 -
-

Important improvements needed

+ ) : ( +
+ + + + + + + + + + + {recentScans.map(s => { + const dt = formatDateTimePartsAEST(s.started_at || s.finished_at); + const passed = Number(s.passed_count || 0); + const failed = Number(s.failed_count || 0); + const errors = Number(s.error_count || 0); + return ( + + + + + + + ); + })} + +
StatusStartedResultsOpen
+ + {String(s.status || 'pending').toUpperCase()} + + +
+
{dt.date}
+
{dt.time}
+
+
+
+ {passed} pass + {failed} fail + {errors > 0 && {errors} err} +
+
+ +
+
+ )}
+
-
+
+
-

Scan Status

+

What you should change next

- Complete + + {latestRelevantScan ? Number(latestRelevantScan.failed_count || 0) + Number(latestRelevantScan.error_count || 0) : '—'} +
-

Ready for next scan

+

Top failing controls from the latest scan

+ {scanDetailsError ? ( +
+

{scanDetailsError}

+
+ ) : !latestRelevantScan?.id ? ( +
+

No scan selected.

+
+ ) : !latestScanDetails ? ( +
+

Loading control results…

+
+ ) : nextFixes.topItems.length === 0 ? ( +
+

No failed/error controls in this scan.

+
+ ) : ( +
+ {nextFixes.topItems.map((r, idx) => ( + + ))} +
+ )}
+ +
diff --git a/frontend/src/pages/Scans/ScansPage.css b/frontend/src/pages/Scans/ScansPage.css index 969763df..20eeef93 100644 --- a/frontend/src/pages/Scans/ScansPage.css +++ b/frontend/src/pages/Scans/ScansPage.css @@ -168,6 +168,23 @@ border-bottom: 1px solid var(--border-color); } +.scans-table th.actions-header { + text-align: right; + width: 1%; + white-space: nowrap; +} + +.scans-table td.actions-cell { + text-align: right; + width: 1%; + white-space: nowrap; +} + +.scans-table td.actions-cell .toolbar-button { + padding: 6px 10px; + font-size: 13px; +} + .scan-row { cursor: pointer; transition: background-color 0.2s ease; diff --git a/frontend/src/pages/Scans/ScansPage.jsx b/frontend/src/pages/Scans/ScansPage.jsx index b6a97981..e005d423 100644 --- a/frontend/src/pages/Scans/ScansPage.jsx +++ b/frontend/src/pages/Scans/ScansPage.jsx @@ -1,25 +1,29 @@ -import React, { useState, useEffect, useCallback } from 'react'; -import { useNavigate } from 'react-router-dom'; -import { Search, Plus, CheckCircle, XCircle, Clock, Loader2, AlertCircle, PlayCircle } from 'lucide-react'; +import React, { useState, useEffect, useCallback, useRef } from 'react'; +import { useNavigate, useLocation } from 'react-router-dom'; +import { Search, Plus, CheckCircle, XCircle, Clock, Loader2, AlertCircle, PlayCircle, Trash2 } from 'lucide-react'; import { useAuth } from '../../context/AuthContext'; -import { getScans, getConnections, getBenchmarks, createScan } from '../../api/client'; +import { getScans, getConnections, getBenchmarks, createScan, deleteScan, getSettings } from '../../api/client'; import { formatDateTimePartsAEST } from '../../utils/helpers'; import './ScansPage.css'; const ScansPage = ({ sidebarWidth = 220, isDarkMode = true }) => { const navigate = useNavigate(); + const location = useLocation(); const { token } = useAuth(); const [scans, setScans] = useState([]); const [connections, setConnections] = useState([]); const [benchmarks, setBenchmarks] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); - const [showForm, setShowForm] = useState(false); + const [deletingId, setDeletingId] = useState(null); + const [confirmDeleteEnabled, setConfirmDeleteEnabled] = useState(true); + const [showForm, setShowForm] = useState(!!location?.state?.openNewScan); const [formData, setFormData] = useState({ - m365_connection_id: '', - benchmark_key: '', + m365_connection_id: location?.state?.preselect?.m365_connection_id ? String(location.state.preselect.m365_connection_id) : '', + benchmark_key: location?.state?.preselect?.benchmark_key || '', }); const [isSubmitting, setIsSubmitting] = useState(false); + const appliedNavStateRef = useRef(false); const loadScans = useCallback(async () => { try { @@ -53,6 +57,38 @@ const ScansPage = ({ sidebarWidth = 220, isDarkMode = true }) => { loadData(); }, [token]); + // Allow Dashboard (or other pages) to deep-link into "/scans" with the "New Scan" form opened + preselected. + useEffect(() => { + if (appliedNavStateRef.current) { + return; + } + const nav = location?.state; + if (!nav?.openNewScan) { + return; + } + appliedNavStateRef.current = true; + setShowForm(true); + setFormData(prev => ({ + ...prev, + m365_connection_id: nav?.preselect?.m365_connection_id ? String(nav.preselect.m365_connection_id) : prev.m365_connection_id, + benchmark_key: nav?.preselect?.benchmark_key || prev.benchmark_key, + })); + }, [location]); + + useEffect(() => { + async function loadSettings() { + try { + const settings = await getSettings(token); + setConfirmDeleteEnabled(settings?.confirm_delete_enabled ?? true); + } catch { + // Fail-safe: default to showing confirmations. + setConfirmDeleteEnabled(true); + } + } + + loadSettings(); + }, [token]); + // Poll for scan updates every 5 seconds useEffect(() => { const hasPendingScans = scans.some( @@ -126,6 +162,26 @@ const ScansPage = ({ sidebarWidth = 220, isDarkMode = true }) => { return formatDateTimePartsAEST(dateString); } + async function handleDelete(scanId) { + if (confirmDeleteEnabled) { + const ok = window.confirm( + 'Are you sure you want to delete this scan? This action cannot be undone.' + ); + if (!ok) return; + } + + setDeletingId(scanId); + setError(null); + try { + await deleteScan(token, scanId); + setScans(prev => prev.filter(s => s.id !== scanId)); + } catch (err) { + setError(err.message || 'Failed to delete scan'); + } finally { + setDeletingId(null); + } + } + if (isLoading) { return (
{ Connection Started Results + Actions @@ -331,6 +388,20 @@ const ScansPage = ({ sidebarWidth = 220, isDarkMode = true }) => { '-' )} + e.stopPropagation()}> + + ))} diff --git a/frontend/src/pages/SettingsPage.css b/frontend/src/pages/SettingsPage.css index 94931dd3..d4bd4a81 100644 --- a/frontend/src/pages/SettingsPage.css +++ b/frontend/src/pages/SettingsPage.css @@ -75,3 +75,119 @@ line-height: 1.5; } +.error-banner { + display: flex; + align-items: center; + gap: 8px; + padding: 12px 16px; + background: rgba(239, 68, 68, 0.1); + border: 1px solid rgba(239, 68, 68, 0.3); + border-radius: 8px; + color: #ef4444; +} + +.loading-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 60px 20px; + color: var(--text-secondary); +} + +.loading-state p { + margin-top: 16px; +} + +.spinning { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +.setting-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; +} + +.setting-text { + display: flex; + flex-direction: column; + gap: 4px; +} + +.setting-title { + color: var(--text-primary); + font-size: 14px; + font-weight: 600; +} + +.setting-description { + color: var(--text-secondary); + font-size: 13px; + line-height: 1.4; +} + +.settings-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 16px; +} + +/* Reuse the dashboard toggle-switch pattern locally */ +.toggle-switch { + position: relative; + display: inline-block; + width: 50px; + height: 26px; + flex-shrink: 0; +} + +.toggle-switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + transition: 0.3s; + border-radius: 26px; +} + +.slider:before { + position: absolute; + content: ""; + height: 20px; + width: 20px; + left: 3px; + bottom: 3px; + background-color: white; + transition: 0.3s; + border-radius: 50%; +} + +.toggle-switch input:checked + .slider { + background-color: var(--teal, #64dfdf); +} + +.toggle-switch input:checked + .slider:before { + transform: translateX(24px); +} + diff --git a/frontend/src/pages/SettingsPage.jsx b/frontend/src/pages/SettingsPage.jsx index 890ca2f4..84ba6ad5 100644 --- a/frontend/src/pages/SettingsPage.jsx +++ b/frontend/src/pages/SettingsPage.jsx @@ -1,8 +1,69 @@ -import React from "react"; -import { Settings } from "lucide-react"; +import React, { useEffect, useState } from "react"; +import { AlertCircle, Loader2, Settings } from "lucide-react"; import "./SettingsPage.css"; +import { useAuth } from "../context/AuthContext"; +import { getSettings, updateSettings } from "../api/client"; export default function SettingsPage({ sidebarWidth = 220, isDarkMode = true }) { + const { token } = useAuth(); + const [confirmDeleteEnabled, setConfirmDeleteEnabled] = useState(true); + const [draftConfirmDeleteEnabled, setDraftConfirmDeleteEnabled] = useState(true); + const [isLoading, setIsLoading] = useState(true); + const [isSaving, setIsSaving] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + async function load() { + setIsLoading(true); + setError(null); + try { + const settings = await getSettings(token); + const enabled = settings?.confirm_delete_enabled ?? true; + setConfirmDeleteEnabled(enabled); + setDraftConfirmDeleteEnabled(enabled); + } catch (err) { + // Fail-safe: default to showing confirmations. + setConfirmDeleteEnabled(true); + setDraftConfirmDeleteEnabled(true); + setError(err?.message || "Failed to load settings"); + } finally { + setIsLoading(false); + } + } + + load(); + }, [token]); + + const hasChanges = draftConfirmDeleteEnabled !== confirmDeleteEnabled; + + function handleToggleConfirmDelete(e) { + setDraftConfirmDeleteEnabled(!!e.target.checked); + } + + async function handleSave() { + if (!hasChanges || isSaving) { + return; + } + setIsSaving(true); + setError(null); + try { + const updated = await updateSettings(token, { + confirm_delete_enabled: draftConfirmDeleteEnabled, + }); + const enabled = updated?.confirm_delete_enabled ?? draftConfirmDeleteEnabled; + setConfirmDeleteEnabled(enabled); + setDraftConfirmDeleteEnabled(enabled); + } catch (err) { + setError(err?.message || "Failed to update settings"); + } finally { + setIsSaving(false); + } + } + + function handleReset() { + setDraftConfirmDeleteEnabled(confirmDeleteEnabled); + } + return (
-
-

Coming soon

-

- This page is a placeholder so the sidebar doesn't route you back - to the public landing page. We can add real settings here next. -

-
+ {error ? ( +
+ + {error} +
+ ) : null} + + {isLoading ? ( +
+ +

Loading settings...

+
+ ) : ( +
+
+
+
Confirm before delete
+
+ Show a confirmation dialog before deleting scans. +
+
+ +
+ +
+ + +
+
+ )}
); diff --git a/frontend/src/styles/global.css b/frontend/src/styles/global.css index ba929a73..8f6d775b 100644 --- a/frontend/src/styles/global.css +++ b/frontend/src/styles/global.css @@ -70,6 +70,20 @@ html, body, #root { height: 100%; } + /* Prevent horizontal "jumps" between pages with/without a vertical scrollbar. */ + html { + overflow-y: scroll; + scrollbar-gutter: stable; + } + + /* Stop CSS transitions during viewport resizing (e.g., browser side panel opening). + This prevents the whole UI from "gliding" because computed widths change. */ + body.is-resizing *, + body.is-resizing *::before, + body.is-resizing *::after { + transition: none !important; + } + #root { border-radius: 999px; border-top-left-radius: 999px; @@ -83,6 +97,10 @@ color: rgb(var(--text-strong)); font-family: ui-sans-serif, system-ui, "Segoe UI", Inter, Arial; line-height: 1.5; + /* Improve perceived sharpness across macOS browsers (esp. with thin weights / dark UI). */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: geometricPrecision; } /* Visible keyboard focus (a11y) */ diff --git a/frontend/src/utils/helpers.js b/frontend/src/utils/helpers.js index efc74385..17cb7aac 100644 --- a/frontend/src/utils/helpers.js +++ b/frontend/src/utils/helpers.js @@ -87,7 +87,6 @@ export const formatTimeAEST = (dateString) => { hour: 'numeric', minute: '2-digit', second: '2-digit', - fractionalSecondDigits: 3, hour12: true, timeZone: AEST_IANA_TZ, }).format(d); From f70f2bba5d6bca14cc33be91284b55c20b03ca0f Mon Sep 17 00:00:00 2001 From: Tina Relucio Date: Tue, 20 Jan 2026 00:35:05 +0800 Subject: [PATCH 02/20] added all controls for section 2 --- ...ehensive_Attachment_Filtering_Applied.rego | 66 ++++++++ ...ConnectionFilter_IPAllowList_not_used.rego | 72 +++++---- ...2.1.13_Connection_Filter_SafeList_Off.rego | 54 +++++-- ...ntiSpam_Policies_DoNot_AllowedDomains.rego | 46 +++--- ...tbound_AntiSpam_MessageLimits_InPlace.rego | 136 +++++----------- ..._SafeLinks_OfficeApplications_Enabled.rego | 129 +++++---------- ...Common_AttachmentTypes_Filter_Enabled.rego | 58 +++++++ ..._InternalUsers_sendingMalware_Enabled.rego | 96 +++++------ ...2.1.4_Safe_AttachementsPolicy_Enabled.rego | 116 +++++--------- ...s_SharePoint_OneDrive_MSTeams_Enabled.rego | 71 +++------ ...neSpam_Policies_Notify_Administrators.rego | 90 +++++------ .../2.1.7_AntiPhishing_Policy_is_created.rego | 149 +++++++++--------- .../v6.0.0/2.1.9_DKIM_is_enabled.rego | 6 +- ...4.4_Zero_hour_AutoPurge_MSTeams_is_On.rego | 25 ++- .../v6.0.0/metadata.json | 27 +++- 15 files changed, 574 insertions(+), 567 deletions(-) create mode 100644 engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.2_Common_AttachmentTypes_Filter_Enabled.rego diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.11_Comprehensive_Attachment_Filtering_Applied.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.11_Comprehensive_Attachment_Filtering_Applied.rego index 0986dc9c..c550dcbe 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.11_Comprehensive_Attachment_Filtering_Applied.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.11_Comprehensive_Attachment_Filtering_Applied.rego @@ -20,7 +20,11 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_11 +<<<<<<< HEAD import rego.v1 +======= +default result := {"compliant": false, "message": "Evaluation failed"} +>>>>>>> c645864 (added all controls for section 2) attach_exts := [ "7z","a3x","ace","ade","adp","ani","app","appinstaller","applescript","application", @@ -44,23 +48,68 @@ passing_value := 0.9 missing_exts[policy_identity] = missing if { policy := input.malware_filter_policies[_] +<<<<<<< HEAD policy_identity := policy.Identity missing := [ext | ext := attach_exts[_] not ext in policy.FileTypes +======= + policy_identity := policy.identity + + missing := [ext | + ext := attach_exts[_] + not ext in policy.file_types +>>>>>>> c645864 (added all controls for section 2) ] } is_compliant[policy_identity] if { policy := input.malware_filter_policies[_] +<<<<<<< HEAD policy_identity := policy.Identity +======= + policy_identity := policy.identity + + rule := input.malware_filter_rules[_] + rule.malware_filter_policy == policy.id +>>>>>>> c645864 (added all controls for section 2) missing := missing_exts[policy_identity] fail_threshold := count(attach_exts) * (1 - passing_value) count(missing) <= fail_threshold +<<<<<<< HEAD policy.EnableFileFilter == true +======= + policy.enable_file_filter == true + rule.state == "Enabled" +} + +policy_report[report] if { + policy := input.malware_filter_policies[_] + rule := input.malware_filter_rules[_] + rule.malware_filter_policy == policy.id + + missing := missing_exts[policy.identity] + compliant := is_compliant[policy.identity] + + report := { + "policy_name": policy.identity, + "is_cis_compliant": compliant, + "enable_file_filter": policy.enable_file_filter, + "state": rule.state, + "missing_count": count(missing), + "missing_extensions": missing, + "extension_count": count(policy.file_types) + } +} + +any_policy_compliant if { + some i + compliant := is_compliant[input.malware_filter_policies[i].identity] + compliant == true +>>>>>>> c645864 (added all controls for section 2) } generate_message(true) := "Attachment filtering policy is correctly configured and enforced" @@ -69,6 +118,7 @@ generate_message(false) := "Attachment filtering policy is misconfigured or not generate_affected_resources(true, _) := [] generate_affected_resources(false, data_input) := [ +<<<<<<< HEAD pol.Identity | pol := data_input.malware_filter_policies[_] ] @@ -107,4 +157,20 @@ result := { } } if { has_policies +======= + pol.identity | + pol := data_input.malware_filter_policies[_] +] + +result := { + "compliant": any_policy_compliant, + "message": generate_message(any_policy_compliant), + "affected_resources": generate_affected_resources(any_policy_compliant, input), + "details": { + "malware_filter_policies_evaluated": count(input.malware_filter_policies), + "malware_filter_rules_evaluated": count(input.malware_filter_rules), + "passing_threshold": passing_value, + "total_known_extensions": count(attach_exts) + } +>>>>>>> c645864 (added all controls for section 2) } diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.12_ConnectionFilter_IPAllowList_not_used.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.12_ConnectionFilter_IPAllowList_not_used.rego index 582482a6..a71457cb 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.12_ConnectionFilter_IPAllowList_not_used.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.12_ConnectionFilter_IPAllowList_not_used.rego @@ -2,11 +2,12 @@ # title: Ensure the connection filter IP allow list is not used # description: | # In Microsoft 365 organizations with Exchange Online mailboxes or standalone -# Exchange Online Protection organizations without Exchange Online mailboxes, +# Exchange Online Protection organizations without Exchange Online mailboxes # connection filtering and the default connection filter policy identify good or # bad source email servers by IP addresses. The key components of the default connection # filter policy are IP Allow List, IP Block List and Safe list. # The recommended state is IP Allow List empty or undefined. +# # related_resources: # - ref: https://www.cisecurity.org/benchmark/microsoft_365 # description: CIS Microsoft 365 Foundations Benchmark @@ -22,39 +23,50 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_12 -import rego.v1 - default result := {"compliant": false, "message": "Evaluation failed"} -policies := object.get(input, "connection_filter_policies", []) - -non_compliant_policies := [ - { - "identity": object.get(p, "Identity", object.get(p, "Name", null)), - "ip_allow_list": object.get(p, "IPAllowList", []) - } | - p := policies[_] - count(object.get(p, "IPAllowList", [])) > 0 -] - -compliant := count(non_compliant_policies) == 0 - -result := { - "compliant": compliant, - "message": messages[compliant], - "affected_resources": affected_resources[compliant], - "details": { - "policies_evaluated": count(policies), - "non_compliant_policies": non_compliant_policies - } +# Required IPAllowList setting +required_fields := { + "IPAllowList": [] +} + +ip_allow_list_is_empty := true if { + input.IPAllowList == [] # empty array +} + +ip_allow_list_is_empty := true if { + input.IPAllowList == {} # empty object +} + +ip_allow_list_is_empty := false if { + input.IPAllowList != [] # non-empty array } -messages := { - true: "IPAllowList is empty for all Exchange Online Hosted Connection Filter policies", - false: "IPAllowList is not empty for one or more Exchange Online Hosted Connection Filter policies" +ip_allow_list_is_empty := false if { + input.IPAllowList != {} # non-empty object } -affected_resources := { - true: [], - false: ["HostedConnectionFilterPolicy"] +ip_allow_list_is_empty := null if { + not input.IPAllowList # field is missing } + +result := output if { + compliant := ip_allow_list_is_empty == true + + output := { + "compliant": compliant, + "message": generate_message(ip_allow_list_is_empty), + "affected_resources": generate_affected_resources(ip_allow_list_is_empty), + "details": { + "IPAllowList": input.IPAllowList + } + } +} + +generate_message(true) := "IPAllowList is empty or {} in Exchange Online Hosted Connection Filter" +generate_message(false) := "IPAllowList is not empty or is not {} in Exchange Online Hosted Connection Filter" +generate_message(null) := "Unable to determine the IPAllowList status in Exchange Online Hosted Connection Filter" + +generate_affected_resources(true) := [] +generate_affected_resources(false) := ["HostedConnectionFilterPolicy"] +generate_affected_resources(null) := ["HostedConnectionFilterPolicy status unknown"] diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.13_Connection_Filter_SafeList_Off.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.13_Connection_Filter_SafeList_Off.rego index 6718c79c..3ec314d4 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.13_Connection_Filter_SafeList_Off.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.13_Connection_Filter_SafeList_Off.rego @@ -24,22 +24,42 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_13 -import rego.v1 - default result := {"compliant": false, "message": "Evaluation failed"} -enable_safe_list := object.get(input, "enable_safe_list", false) - -result := { - "compliant": true, - "message": "EnableSafeList is False for Exchange Online Hosted Connection Filter", - "affected_resources": [], - "details": {"EnableSafeList": enable_safe_list} -} if enable_safe_list == false - -result := { - "compliant": false, - "message": "EnableSafeList is not False for Exchange Online Hosted Connection Filter", - "affected_resources": ["HostedConnectionFilterPolicy"], - "details": {"EnableSafeList": enable_safe_list} -} if enable_safe_list == true +# Required EnableSafeList setting +required_fields := { + "EnableSafeList": false +} + +enable_safe_list_is_false := true if { + input.EnableSafeList == false # Ensure EnableSafeList is False +} + +enable_safe_list_is_false := false if { + input.EnableSafeList == true # If EnableSafeList is True, it's non-compliant +} + +enable_safe_list_is_false := null if { + not input.EnableSafeList # If EnableSafeList is missing, return null +} + +result := output if { + compliant := enable_safe_list_is_false == true + + output := { + "compliant": compliant, + "message": generate_message(enable_safe_list_is_false), + "affected_resources": generate_affected_resources(enable_safe_list_is_false), + "details": { + "EnableSafeList": input.EnableSafeList + } + } +} + +generate_message(true) := "EnableSafeList is False for Exchange Online Hosted Connection Filter" +generate_message(false) := "EnableSafeList is not False for Exchange Online Hosted Connection Filter" +generate_message(null) := "Unable to determine the EnableSafeList status in Exchange Online Hosted Connection Filter" + +generate_affected_resources(true) := [] +generate_affected_resources(false) := ["HostedConnectionFilterPolicy"] +generate_affected_resources(null) := ["HostedConnectionFilterPolicy status unknown"] diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.14_Inbound_AntiSpam_Policies_DoNot_AllowedDomains.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.14_Inbound_AntiSpam_Policies_DoNot_AllowedDomains.rego index ecf75ec9..7180add7 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.14_Inbound_AntiSpam_Policies_DoNot_AllowedDomains.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.14_Inbound_AntiSpam_Policies_DoNot_AllowedDomains.rego @@ -25,30 +25,38 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_14 -import rego.v1 - default result := {"compliant": false, "message": "Evaluation failed"} -allowed_sender_domains := object.get(input, "allowed_sender_domains", []) - -allowed_sender_domains_undefined := true if count(allowed_sender_domains) == 0 -allowed_sender_domains_undefined := false if count(allowed_sender_domains) > 0 +allowed_sender_domains_undefined := true if { + not input.AllowedSenderDomains # AllowedSenderDomains is undefined +} -result := { - "compliant": allowed_sender_domains_undefined, - "message": messages[allowed_sender_domains_undefined], - "affected_resources": affected_resources[allowed_sender_domains_undefined], - "details": { - "allowed_sender_domains": allowed_sender_domains - } +allowed_sender_domains_undefined := false if { + input.AllowedSenderDomains != null # If AllowedSenderDomains is defined } -messages := { - true: "AllowedSenderDomains is undefined or empty for the policy", - false: "AllowedSenderDomains is defined for the policy" +allowed_sender_domains_undefined := null if { + not input.AllowedSenderDomains # If AllowedSenderDomains is missing entirely } -affected_resources := { - true: [], - false: ["HostedContentFilterPolicy"] +result := output if { + # Ensure all inbound policies pass + compliant := allowed_sender_domains_undefined == true + + output := { + "compliant": compliant, + "message": generate_message(allowed_sender_domains_undefined), + "affected_resources": generate_affected_resources(allowed_sender_domains_undefined), + "details": { + "AllowedSenderDomains": input.AllowedSenderDomains + } + } } + +generate_message(true) := "AllowedSenderDomains is undefined for the policy" +generate_message(false) := "AllowedSenderDomains is defined for the policy" +generate_message(null) := "Unable to determine the AllowedSenderDomains status for the policy" + +generate_affected_resources(true) := [] +generate_affected_resources(false) := ["HostedContentFilterPolicy"] +generate_affected_resources(null) := ["HostedContentFilterPolicy status unknown"] diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.15_Outbound_AntiSpam_MessageLimits_InPlace.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.15_Outbound_AntiSpam_MessageLimits_InPlace.rego index 38b06b8d..38fdca6b 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.15_Outbound_AntiSpam_MessageLimits_InPlace.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.15_Outbound_AntiSpam_MessageLimits_InPlace.rego @@ -24,121 +24,61 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_15 -import rego.v1 +default result := {"compliant": false, "message": "Evaluation failed"} -# Expected policy values required_policy_fields := { - "RecipientLimitExternalPerHour": 500, - "RecipientLimitInternalPerHour": 1000, - "RecipientLimitPerDay": 1000, + "RecipientLimitExternalPerHour": 500, + "RecipientLimitInternalPerHour": 1000, + "RecipientLimitPerDay": 1000, + "ActionWhenThresholdReached": "BlockUser", + "NotifyOutboundSpamRecipients": {"monitored@example.com"} } -valid_actions := {"BlockUser", "RestrictUser", "Restrict"} -missing_sentinel := "__missing__" - -limits_compliant if { - policy != null - - all_keys_correct := {k | k in required_policy_fields; policy[k] == required_policy_fields[k]} - count(all_keys_correct) == count(required_policy_fields) - - # Action must match one of the valid options - policy.ActionWhenThresholdReached in valid_actions -} - -limits_compliant := false if { - policy != null - some k - required_policy_fields[k] - object.get(policy, k, missing_sentinel) == missing_sentinel -} - -limits_compliant := false if { - policy != null - object.get(policy, "ActionWhenThresholdReached", missing_sentinel) == missing_sentinel -} - -limits_compliant := false if { - policy != null - some k - required_policy_fields[k] - object.get(policy, k, missing_sentinel) != missing_sentinel - policy[k] != required_policy_fields[k] +# Function to validate individual policy settings +validate_policy_setting(setting_name, setting_value) if { + required_policy_fields[setting_name] == setting_value } -limits_compliant := false if { - policy != null - object.get(policy, "ActionWhenThresholdReached", missing_sentinel) != missing_sentinel - not policy.ActionWhenThresholdReached in valid_actions +validate_notify_outbound_spam_recipients if { + count(input.NotifyOutboundSpamRecipients) > 0 } -policy := value if { - input != null - value := object.get(input, "default_policy", null) -} else = null -has_policy := policy != null - -safe_get(obj, key) = value if { - obj != null - value := object.get(obj, key, null) -} else = null - -policy_detail_fields := { - "RecipientLimitExternalPerHour", - "RecipientLimitInternalPerHour", - "RecipientLimitPerDay", - "ActionWhenThresholdReached", +compliant if { + # Validate that all required policy fields match + count({ + k | + required_policy_fields[k] == input[k] + }) == count(required_policy_fields) } -add_if_not_null(obj, key, value) = out if { - value != null - out := object.union(obj, {key: value}) -} else = obj - -details := out if { - base := { - "required_policy_settings": required_policy_fields, - "valid_actions": valid_actions, - } +compliant_message := "Outbound spam filter policy is correctly configured and meets required standards" - v_external := safe_get(policy, "RecipientLimitExternalPerHour") - d1 := add_if_not_null(base, "RecipientLimitExternalPerHour", v_external) +non_compliant_message := "Outbound spam filter policy settings are misconfigured or incomplete" - v_internal := safe_get(policy, "RecipientLimitInternalPerHour") - d2 := add_if_not_null(d1, "RecipientLimitInternalPerHour", v_internal) +unknown_message := "Unable to determine outbound spam filter policy configuration" - v_day := safe_get(policy, "RecipientLimitPerDay") - d3 := add_if_not_null(d2, "RecipientLimitPerDay", v_day) - - v_action := safe_get(policy, "ActionWhenThresholdReached") - out := add_if_not_null(d3, "ActionWhenThresholdReached", v_action) -} - -compliant := true if { - has_policy - limits_compliant -} - -compliant := false if { - has_policy - not limits_compliant -} - -compliant := false if { - not has_policy -} - -compliant_message := "Outbound spam filter policy is correctly configured for message limits and over-limit action" -non_compliant_message := "Outbound spam filter policy settings for message limits or over-limit action are misconfigured" generate_message(true) := compliant_message generate_message(false) := non_compliant_message +generate_message(null) := unknown_message generate_affected_resources(true, _) := [] -generate_affected_resources(false, _) := ["Outbound Spam Filter Policy"] + +generate_affected_resources(false, data_input) := [ + "Outbound Spam Filter Policy" +] + +generate_affected_resources(null, _) := ["Outbound Spam Filter Policy configuration status unknown"] result := { - "compliant": compliant, - "message": generate_message(compliant), - "affected_resources": generate_affected_resources(compliant, input), - "details": details + "compliant": compliant == true, + "message": generate_message(compliant), + "affected_resources": generate_affected_resources(compliant, input), + "details": { + "RecipientLimitExternalPerHour": input.RecipientLimitExternalPerHour, + "RecipientLimitInternalPerHour": input.RecipientLimitInternalPerHour, + "RecipientLimitPerDay": input.RecipientLimitPerDay, + "ActionWhenThresholdReached": input.ActionWhenThresholdReached, + "NotifyOutboundSpamRecipients": input.NotifyOutboundSpamRecipients, + "required_policy_settings": required_policy_fields + } } diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.1_SafeLinks_OfficeApplications_Enabled.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.1_SafeLinks_OfficeApplications_Enabled.rego index 930f55d0..220afcf4 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.1_SafeLinks_OfficeApplications_Enabled.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.1_SafeLinks_OfficeApplications_Enabled.rego @@ -20,104 +20,61 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_1 -import rego.v1 - default result := {"compliant": false, "message": "Evaluation failed"} required_fields := { - "EnableSafeLinksForEmail": true, - "EnableSafeLinksForTeams": true, - "EnableSafeLinksForOffice": true, - "TrackClicks": true, - "AllowClickThrough": false, - "ScanUrls": true, - "EnableForInternalSenders": true, - "DeliverMessageAfterScan": true, - "DisableUrlRewrite": false + "ZapEnabled": true, + "ExceptIfConditions": "valid_condition" } -missing_sentinel := "__missing__" - -field_non_compliant(p, f) if { - object.get(p, f, missing_sentinel) == missing_sentinel +# Identify non-compliant fields in a policy +non_compliant_fields(p) := {f | + # Manually check each required field + f := "ZapEnabled" + not p[f] = required_fields[f] +} + +non_compliant_fields(p) := {f | + # Manually check each required field + f := "ExceptIfConditions" + not p[f] = required_fields[f] } -field_non_compliant(p, f) if { - object.get(p, f, missing_sentinel) != missing_sentinel - p[f] != required_fields[f] -} - -non_compliant_fields(p) := fields if { - fields := {f | - some f - required_fields[f] = _ # f is a key in required_fields (even if value is false) - field_non_compliant(p, f) - } -} - -policy_compliant(p) := true if { - count(non_compliant_fields(p)) == 0 -} - -policy_compliant(p) := false if { - count(non_compliant_fields(p)) > 0 -} - -generate_message(true, _) := "All Safe Links policies for Office applications are compliant" -generate_message_no_policies := "No Safe Links policies found for Office applications" +# Check if a policy is compliant +policy_compliant(p) := true if count(non_compliant_fields(p)) == 0 +policy_compliant(p) := false if count(non_compliant_fields(p)) > 0 +# Generate a message based on compliance status +generate_message(true, _) := "All Teams Protection policies are configured according to CIS recommendations" generate_message(false, non_compliant) := sprintf( - "%d Safe Links policy(ies) for Office applications are not compliant", + "%d Teams Protection policy(ies) are not compliant with CIS recommendations", [count(non_compliant)] ) +# Generate list of affected resources generate_affected_resources(true, _) := [] - -generate_affected_resources(false, non_compliant) := resources if { - resources := [ - { - "identity": object.get(p, "Identity", object.get(p, "Name", null)), - "non_compliant_fields": [f | f := non_compliant_fields(p)[_]] - } | - p := non_compliant[_] - ] -} - -no_policies_result := { - "compliant": false, - "message": generate_message_no_policies, - "affected_resources": [{"identity": "Safe Links policy", "non_compliant_fields": ["missing_policy"]}], - "details": { - "policies_checked": [], - "required_fields": required_fields - } -} - -with_policies_result(policies, non_compliant) := { - "compliant": count(non_compliant) == 0, - "message": generate_message(count(non_compliant) == 0, non_compliant), - "affected_resources": generate_affected_resources(count(non_compliant) == 0, non_compliant), - "details": { - "policies_checked": [object.get(p, "Identity", object.get(p, "Name", null)) | p := policies[_]], - "required_fields": required_fields - } -} - +generate_affected_resources(false, non_compliant) := [ + { + "identity": p.identity, + "non_compliant_fields": [f | f := non_compliant_fields(p)[_]] + } | p := non_compliant[_] +] + +# Main evaluation result := output if { - policies := object.get(input, "safe_links_policies", []) - count(policies) == 0 - output := no_policies_result -} - -result := output if { - policies := object.get(input, "safe_links_policies", []) - count(policies) > 0 - - non_compliant := [ - p | - p := policies[_] - not policy_compliant(p) - ] - - output := with_policies_result(policies, non_compliant) + policies := input.teams_protection_policies + + # Identify non-compliant policies + non_compliant := [p | p := policies[_]; not policy_compliant(p)] + compliant := count(non_compliant) == 0 + + output := { + "compliant": compliant, + "message": generate_message(compliant, non_compliant), + "affected_resources": generate_affected_resources(compliant, non_compliant), + "details": { + "policies_checked": [p.identity | p := policies[_]], + "required_fields": required_fields + } + } } diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.2_Common_AttachmentTypes_Filter_Enabled.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.2_Common_AttachmentTypes_Filter_Enabled.rego new file mode 100644 index 00000000..82198d37 --- /dev/null +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.2_Common_AttachmentTypes_Filter_Enabled.rego @@ -0,0 +1,58 @@ +# METADATA +# title: Ensure the Common Attachment Types Filter is enabled +# description: | +# Common Attachment Types Filter lets a user block known and +# custom malicious file types from being attached to emails +# +# related_resources: +# - ref: https://www.cisecurity.org/benchmark/microsoft_365 +# description: CIS Microsoft 365 Foundations Benchmark +# custom: +# control_id: CIS-2.1.2 +# framework: cis +# benchmark: microsoft-365-foundations +# version: v6.0.0 +# severity: high +# service: Exchange +# requires_permissions: +# - Exchange.Manage + +package cis.microsoft_365_foundations.v6_0_0.control_2_1_2 + +default result := {"compliant": false, "message": "Evaluation failed"} + +file_filter_enabled := true if input.data.enable_file_filter == true +file_filter_enabled := false if input.data.enable_file_filter != true +file_filter_enabled := null if input.data.enable_file_filter == null + +result := output if { + compliant := file_filter_enabled == true + + output := { + "compliant": compliant, + "message": generate_message(file_filter_enabled), + "affected_resources": generate_affected_resources(file_filter_enabled, input), + "details": { + "enable_file_filter": file_filter_enabled + } + } +} + +generate_message(file_filter_enabled) := msg if { + file_filter_enabled == true + msg := "The 'Enable the common attachments filter' is On." +} + +generate_message(file_filter_enabled) := msg if { + file_filter_enabled == false + msg := "The 'Enable the common attachments filter' is Off." +} + +generate_message(file_filter_enabled) := msg if { + file_filter_enabled == null + msg := "Unable to determine the 'Enable the common attachments filter' status." +} + +generate_affected_resources(true, _) := [] +generate_affected_resources(false, data_input) := ["Common attachments filter is disabled"] +generate_affected_resources(null, _) := ["Common attachments filter status unknown"] diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.3_Notifications_InternalUsers_sendingMalware_Enabled.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.3_Notifications_InternalUsers_sendingMalware_Enabled.rego index 9c67cc3a..23717291 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.3_Notifications_InternalUsers_sendingMalware_Enabled.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.3_Notifications_InternalUsers_sendingMalware_Enabled.rego @@ -1,8 +1,10 @@ # METADATA -# title: Ensure Notifications for Internal Users Sending Malware is Enabled +# title: Ensure notifications for internal users sending malware is Enabled # description: | -# This control ensures that administrators are notified when internal users send malware. -# It helps security teams respond promptly to malware incidents. +# Exchange Online Protection is Microsoft's cloud-based filtering service +# that protects organizations against spam, malware, and other email threats. +# EOP is included in all Microsoft 365 organizations with Exchange Online mailboxes. +# # related_resources: # - ref: https://www.cisecurity.org/benchmark/microsoft_365 # description: CIS Microsoft 365 Foundations Benchmark @@ -11,74 +13,62 @@ # framework: cis # benchmark: microsoft-365-foundations # version: v6.0.0 -# severity: high +# severity: medium # service: Exchange # requires_permissions: # - Exchange.Manage package cis.microsoft_365_foundations.v6_0_0.control_2_1_3 -import rego.v1 +default result = {"compliant": false, "message": "Evaluation failed"} -default result := {"compliant": false, "message": "Evaluation failed"} - -required_values := { - "EnableInternalSenderAdminNotifications": true, - "InternalSenderAdminAddress": "" # empty value considered compliant +notifications_enabled if { + count(input.policies) > 0 } -missing_sentinel := "__missing__" - -field_non_compliant(p, f) if { - object.get(p, f, missing_sentinel) == missing_sentinel +violating_policies[policy.Identity] if { + some i + policy := input.policies[i] + not policy.EnableInternalSenderAdminNotifications } -field_non_compliant(p, f) if { - object.get(p, f, missing_sentinel) != missing_sentinel - p[f] != required_values[f] +violating_policies[policy.Identity] if { + some i + policy := input.policies[i] + policy.EnableInternalSenderAdminNotifications + policy.InternalSenderAdminAddress == "" } -policy_compliant(p) if { - invalid_fields := {f | - some f - required_values[f] - field_non_compliant(p, f) - } - count(invalid_fields) == 0 +notifications_configured if { + count(violating_policies) == 0 } -policy := input.default_policy -policies := [policy] if policy != null -policies := [] if policy == null - -non_compliant_policies := [ - {"policy": p.Name, "failed_fields": [f | - some f - required_values[f] - field_non_compliant(p, f) - ]} | - p := policies[_] - not policy_compliant(p) -] +compliant if { + notifications_enabled + notifications_configured +} -result := { - "compliant": true, - "message": sprintf("All %d notification policies are compliant", [count(policies)]) -} if { - count(policies) > 0 - count(non_compliant_policies) == 0 +result = output if { + message := generate_message + affected_resources := {v | some i; v = violating_policies[i]} + output := { + "compliant": compliant, + "message": message, + "affected_resources": [v | v = affected_resources[_]], + "details": { + "notifications_enabled": notifications_enabled, + "notifications_configured": notifications_configured, + "policies_count": count(input.policies) + } + } } -result := { - "compliant": false, - "message": sprintf("Non-compliant policies detected: %v", [non_compliant_policies]) -} if { - count(non_compliant_policies) > 0 +generate_message = msg if { + compliant + msg := "Internal sender admin notifications are enabled and configured correctly." } -result := { - "compliant": false, - "message": "No notification policies found" -} if { - count(policies) == 0 +generate_message = msg if { + not compliant + msg := "Internal sender admin notifications are not properly configured." } diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.4_Safe_AttachementsPolicy_Enabled.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.4_Safe_AttachementsPolicy_Enabled.rego index 48d5fc1c..a5d3549e 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.4_Safe_AttachementsPolicy_Enabled.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.4_Safe_AttachementsPolicy_Enabled.rego @@ -19,49 +19,13 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_4 -import rego.v1 - default result := {"compliant": false, "message": "Evaluation failed"} -target_policy_candidate(p) if { - p.Identity == "Built-In Protection Policy" -} - -target_policy_candidate(p) if { - p.Name == "Built-In Protection Policy" -} - -target_policies := [p | - p := input.safe_attachment_policies[_] - target_policy_candidate(p) -] - -target_policy := target_policies[0] if count(target_policies) > 0 - -policy_identity := target_policy.Identity if target_policy.Identity -policy_identity := target_policy.Name if target_policy.Name - -has_policy := target_policy != null - -policy_matches if { - target_policy.Enable == true - target_policy.Action == "Block" - target_policy.QuarantineTag == "AdminOnlyAccessPolicy" - policy_identity == "Built-In Protection Policy" -} - -compliant := true if { - has_policy - policy_matches -} - -compliant := false if { - has_policy - not policy_matches -} - -compliant := null if { - not has_policy +compliant if { + input.data.enable == true + input.data.action == "Block" + input.data.quarantine_tag == "AdminOnlyAccessPolicy" + input.data.identity == "Built-In Protection Policy" } result := { @@ -69,54 +33,52 @@ result := { "message": message, "affected_resources": affected_resources, "details": { - "identity": policy_identity, - "enable": target_policy.Enable, - "action": target_policy.Action, - "quarantine_tag": target_policy.QuarantineTag + "identity": input.data.identity, + "enable": input.data.enable, + "action": input.data.action, + "quarantine_tag": input.data.quarantine_tag } } if { - has_policy + true +} + +message := "Safe Attachments Built-In Protection Policy is enabled, blocking threats, and correctly configured." if { + compliant } -message := "Safe Attachments Built-In Protection Policy is enabled, blocking threats, and correctly configured." if compliant == true -message := "Unable to determine Safe Attachments policy configuration." if compliant == null message := "Safe Attachments Built-In Protection Policy is disabled." if { - compliant == false - target_policy.Enable == false + input.data.enable == false } + message := "Safe Attachments policy action is not set to 'Block'." if { - compliant == false - target_policy.Enable == true - target_policy.Action != "Block" + input.data.enable == true + input.data.action != "Block" } + message := "Safe Attachments policy does not use the 'AdminOnlyAccessPolicy' quarantine tag." if { - compliant == false - target_policy.Enable == true - target_policy.Action == "Block" - target_policy.QuarantineTag != "AdminOnlyAccessPolicy" + input.data.enable == true + input.data.quarantine_tag != "AdminOnlyAccessPolicy" } -affected_resources := [] if compliant == true -affected_resources := ["Safe Attachments policy status unknown"] if compliant == null -affected_resources := [sprintf("Non-compliant Safe Attachments policy: %v", [policy_identity])] if { - compliant == false - policy_identity +message := "Safe Attachments policy identity is not set to 'Built-In Protection Policy'." if { + input.data.identity != "Built-In Protection Policy" } -affected_resources := ["Non-compliant Safe Attachments policy: Built-In Protection Policy"] if { - compliant == false - not policy_identity + +message := "Unable to determine Safe Attachments policy configuration." if { + not input.data } -result := { - "compliant": false, - "message": "Unable to determine Safe Attachments policy configuration.", - "affected_resources": ["Safe Attachments policy status unknown"], - "details": { - "identity": null, - "enable": null, - "action": null, - "quarantine_tag": null - } -} if { - not has_policy +affected_resources := [] if { + compliant +} + +affected_resources := [ + sprintf("Non-compliant Safe Attachments policy: %v", [input.data.identity]) +] if { + not compliant + input.data.identity +} + +affected_resources := ["Safe Attachments policy status unknown"] if { + not input.data.identity } diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.5_Safe_Attachments_SharePoint_OneDrive_MSTeams_Enabled.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.5_Safe_Attachments_SharePoint_OneDrive_MSTeams_Enabled.rego index ff8aae1d..19f4b2e6 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.5_Safe_Attachments_SharePoint_OneDrive_MSTeams_Enabled.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.5_Safe_Attachments_SharePoint_OneDrive_MSTeams_Enabled.rego @@ -18,67 +18,38 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_5 -import rego.v1 - default result := {"compliant": false, "message": "Evaluation failed"} -required_values := { - "EnableATPForSPOTeamsODB": true, - "EnableSafeDocs": true, - "AllowSafeDocsOpen": false -} - -missing_sentinel := "__missing__" +non_compliant_policies = [policy.Name | + policy := input.policies[_] + policy.EnableATPForSPOTeamsODB == false + policy.EnableSafeDocs == false + policy.AllowSafeDocsOpen == true +] -field_non_compliant(p, f) if { - object.get(p, f, missing_sentinel) == missing_sentinel -} +compliant := count(non_compliant_policies) == 0 -field_non_compliant(p, f) if { - object.get(p, f, missing_sentinel) != missing_sentinel - p[f] != required_values[f] +message_text := "Safe Attachments for SharePoint, OneDrive, and Teams is configured securely" if { + compliant == true } -policy_compliant(p) if { - invalid_fields := {f | - some f - required_values[f] = _ - field_non_compliant(p, f) - } - count(invalid_fields) == 0 +message_text := "Safe Attachments for SharePoint, OneDrive, or Teams is not configured securely" if { + compliant == false } -policy := input.atp_policy -policies := [policy] if policy != null -policies := [] if policy == null - -non_compliant_policies := [ {"policy": p.Name, "failed_fields": [f | - some f - required_values[f] = _ - field_non_compliant(p, f) -]} | - p := policies[_] - not policy_compliant(p) -] - -result := { - "compliant": true, - "message": sprintf("All %d Safe Attachments policies are compliant", [count(policies)]) -} if { - count(policies) > 0 - count(non_compliant_policies) == 0 +affected_list := [] if { + compliant == true } -result := { - "compliant": false, - "message": sprintf("Non-compliant policies detected: %v", [non_compliant_policies]) -} if { - count(non_compliant_policies) > 0 +affected_list := non_compliant_policies if { + compliant == false } result := { - "compliant": false, - "message": "No Safe Attachments policies found" -} if { - count(policies) == 0 + "compliant": compliant, + "message": message_text, + "affected_resources": affected_list, + "details": { + "policies_evaluated": input.policies + } } diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.6_Exchange_OnlineSpam_Policies_Notify_Administrators.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.6_Exchange_OnlineSpam_Policies_Notify_Administrators.rego index 250af297..9c414251 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.6_Exchange_OnlineSpam_Policies_Notify_Administrators.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.6_Exchange_OnlineSpam_Policies_Notify_Administrators.rego @@ -3,15 +3,16 @@ # description: | # In Microsoft 365 organizations with mailboxes in Exchange Online or # standalone Exchange Online Protection organizations without Exchange -# Online mailboxes, email messages are automatically protected against spam by EOP. +# Online mailboxes, email messages are automatically protected against spam (junk email) by EOP. +# # related_resources: # - ref: https://www.cisecurity.org/benchmark/microsoft_365 -# description: CIS Microsoft 365 Foundations benchmark +# description: CIS Microsoft 365 Foundations Benchmark # custom: # control_id: CIS-2.1.6 # framework: cis # benchmark: microsoft-365-foundations -# version: v6.0 +# version: v6.0.0 # severity: medium # service: Exchange # requires_permissions: @@ -19,61 +20,52 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_6 -import rego.v1 +default result := {"compliant": false, "message": "Evaluation failed"} -bcc_suspicious_outbound_mail := object.get(input, "bcc_suspicious_outbound_mail", false) -notify_outbound_spam := object.get(input, "notify_outbound_spam", false) -auto_forwarding_mode := object.get(input, "auto_forwarding_mode", null) - -missing_bcc if { - not bcc_suspicious_outbound_mail +outbound_spam_monitoring_enabled := true if { + input.BccSuspiciousOutboundMail == true + input.NotifyOutboundSpam == true + count(input.BccSuspiciousOutboundAdditionalRecipients) > 0 + count(input.NotifyOutboundSpamRecipients) > 0 } -missing_notify if { - not notify_outbound_spam +outbound_spam_monitoring_enabled := false if { + input.BccSuspiciousOutboundMail != true +} else := false if { + input.NotifyOutboundSpam != true +} else := false if { + count(input.BccSuspiciousOutboundAdditionalRecipients) == 0 +} else := false if { + count(input.NotifyOutboundSpamRecipients) == 0 } -missing_settings := array.concat( - [s | s := "bcc_suspicious_outbound_mail"; missing_bcc], - [s | s := "notify_outbound_spam"; missing_notify] -) - -outbound_spam_monitoring_enabled if { - count(missing_settings) == 0 +outbound_spam_monitoring_enabled := null if { + not input.BccSuspiciousOutboundMail + not input.NotifyOutboundSpam + not input.BccSuspiciousOutboundAdditionalRecipients + not input.NotifyOutboundSpamRecipients } -scan_result = { - "compliant": true, - "message": "Outbound spam BCC and notification settings are enabled", - "affected_resources": [], - "details": { - "bcc_suspicious_outbound_mail": bcc_suspicious_outbound_mail, - "notify_outbound_spam": notify_outbound_spam, - "auto_forwarding_mode": auto_forwarding_mode - } -} if { - outbound_spam_monitoring_enabled -} +result := output if { + compliant := outbound_spam_monitoring_enabled == true -scan_result = { - "compliant": false, - "message": generate_message_missing, - "affected_resources": ["HostedOutboundSpamFilterPolicy"], - "details": { - "bcc_suspicious_outbound_mail": bcc_suspicious_outbound_mail, - "notify_outbound_spam": notify_outbound_spam, - "auto_forwarding_mode": auto_forwarding_mode + output := { + "compliant": compliant, + "message": generate_message(outbound_spam_monitoring_enabled), + "affected_resources": generate_affected_resources(outbound_spam_monitoring_enabled), + "details": { + "bcc_suspicious_outbound_mail": input.BccSuspiciousOutboundMail, + "bcc_additional_recipients": input.BccSuspiciousOutboundAdditionalRecipients, + "notify_outbound_spam": input.NotifyOutboundSpam, + "notify_outbound_spam_recipients": input.NotifyOutboundSpamRecipients + } } -} if { - not outbound_spam_monitoring_enabled } -result := scan_result +generate_message(true) := "Outbound spam Bcc and notification settings are enabled and recipients are configured" +generate_message(false) := "Outbound spam Bcc or notification settings are disabled or missing recipients" +generate_message(null) := "Unable to determine outbound spam Bcc or notification configuration" -generate_message_missing := msg if { - count(missing_settings) > 0 - msg := sprintf( - "Outbound spam settings disabled or misconfigured: %v", - missing_settings - ) -} +generate_affected_resources(true) := [] +generate_affected_resources(false) := ["HostedOutboundSpamFilterPolicy"] +generate_affected_resources(null) := ["HostedOutboundSpamFilterPolicy status unknown"] diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.7_AntiPhishing_Policy_is_created.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.7_AntiPhishing_Policy_is_created.rego index 69d4b4b1..d795e0fe 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.7_AntiPhishing_Policy_is_created.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.7_AntiPhishing_Policy_is_created.rego @@ -2,7 +2,7 @@ # title: Ensure that an anti-phishing policy has been created # description: | # By default, Office 365 includes built-in features that help protect users from phishing attacks. -# Set up anti-phishing policies to increase this protection, for example by refining settings +# Set up anti-phishing polices to increase this protection, for example by refining settings # to better detect and prevent impersonation and spoofing attacks. The default policy applies # to all users within the organization and is a single view to fine-tune anti-phishing protection. # Custom policies can be created and configured for specific users, groups or domains within the organization @@ -23,96 +23,91 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_1_7 -import rego.v1 - -required_values := { - "Enabled": true, - "PhishThresholdLevel": 3, - "EnableTargetedUserProtection": true, - "EnableOrganizationDomainsProtection": true, - "EnableMailboxIntelligence": true, - "EnableMailboxIntelligenceProtection": true, - "EnableSpoofIntelligence": true, - "TargetedUserProtectionAction": "Quarantine", - "TargetedDomainProtectionAction": "Quarantine", - "MailboxIntelligenceProtectionAction": "Quarantine", - "EnableFirstContactSafetyTips": true, - "EnableSimilarUsersSafetyTips": true, - "EnableSimilarDomainsSafetyTips": true, - "EnableUnusualCharactersSafetyTips": true, - "HonorDmarcPolicy": true +default result := {"compliant": false, "message": "Evaluation failed"} + +required_policy_fields := { + "Enabled": true, + "PhishThresholdLevel": 3, + "EnableTargetedUserProtection": true, + "EnableOrganizationDomainsProtection": true, + "EnableMailboxIntelligence": true, + "EnableMailboxIntelligenceProtection": true, + "EnableSpoofIntelligence": true, + "TargetedUserProtectionAction": "Quarantine", + "TargetedDomainProtectionAction": "Quarantine", + "MailboxIntelligenceProtectionAction": "Quarantine", + "EnableFirstContactSafetyTips": true, + "EnableSimilarUsersSafetyTips": true, + "EnableSimilarDomainsSafetyTips": true, + "EnableUnusualCharactersSafetyTips": true, + "HonorDmarcPolicy": true } -missing_sentinel := "__missing__" +matching_policy[policy_obj] if { + idx := input.antiPhishPolicies[_] + policy_obj := input.antiPhishPolicies[idx] + + # All required fields must match + count({k | required_policy_fields[k] == policy_obj[k]}) == count(required_policy_fields) -field_non_compliant(p, f) if { - object.get(p, f, missing_sentinel) == missing_sentinel + # Targeted users must be within limits + count(policy_obj.TargetedUsersToProtect) > 0 + count(policy_obj.TargetedUsersToProtect) <= 350 } -field_non_compliant(p, f) if { - object.get(p, f, missing_sentinel) != missing_sentinel - p[f] != required_values[f] +matching_rule[rule_obj] if { + j := input.antiPhishRules[_] + rule_obj := input.antiPhishRules[j] + rule_obj.State == "Enabled" + + matching_policy[policy_obj] # ✅ unique variable name + rule_obj.AntiPhishPolicy == policy_obj.Name } -policy_compliant(p) if { - invalid_fields := {f | - some f - required_values[f] - field_non_compliant(p, f) - } - count(invalid_fields) == 0 +targets_majority(rule_obj) if { + count(rule_obj.RecipientDomainIs) > 0 + count(rule_obj.SentToMemberOf) > 0 } -policies := object.get(input, "anti_phish_policies", []) +# Compliant: matching policy + enabled rule + targets majority +antiphish_configured if { + matching_rule[rule_obj] + targets_majority(rule_obj) +} -non_compliant_policies := [ - {"policy": p.Name, "failed_fields": [f | - some f - required_values[f] - field_non_compliant(p, f) - ]} | - p := policies[_] - not policy_compliant(p) -] +# Non-compliant: policies exist but none match requirements +antiphish_configured if { + count(input.antiPhishPolicies) > 0 + count({p | matching_policy[p]}) == 0 +} -targeted_users := [user | - p := policies[_] - policy_compliant(p) - users := object.get(p, "TargetedUsersToProtect", []) - user := users[_] -] +antiphish_configured = null if { + count(input.antiPhishPolicies) == 0 + count(input.antiPhishRules) == 0 +} -global_compliant_policies := [p | - p := policies[_] - policy_compliant(p) - count(object.get(p, "TargetedUsersToProtect", [])) == 0 -] +generate_message(true) := "Anti-Phish policy and rules are correctly configured and enabled" +generate_message(false) := "Anti-Phish policy or rules are misconfigured or not enforced" +generate_message(null) := "Unable to determine Anti-Phish policy or rule configuration" -result := { - "compliant": false, - "message": "No anti-phishing policies found" -} if { - count(policies) == 0 -} +generate_affected_resources(true, _) := [] -result := { - "compliant": false, - "message": sprintf( - "Non-compliant policies detected: %v", - [non_compliant_policies] - ) -} if { - count(policies) > 0 - count(non_compliant_policies) > 0 -} +generate_affected_resources(false, data_input) := [ + pol.Name | + idx := data_input.antiPhishPolicies[_] + pol := data_input.antiPhishPolicies[idx] +] + +generate_affected_resources(null, _) := ["Anti-Phish configuration status unknown"] result := { - "compliant": true, - "message": sprintf( - "Found %d user(s) protected by compliant anti-phishing policy (including global/default)", - [count(targeted_users) + count(global_compliant_policies)] - ) -} if { - count(policies) > 0 - count(non_compliant_policies) == 0 + "compliant": antiphish_configured == true, + "message": generate_message(antiphish_configured), + "affected_resources": generate_affected_resources(antiphish_configured, input), + "details": { + "anti_phish_policies_evaluated": count(input.antiPhishPolicies), + "anti_phish_rules_evaluated": count(input.antiPhishRules), + "targeted_user_limit": 350, + "required_policy_settings": required_policy_fields + } } diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.9_DKIM_is_enabled.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.9_DKIM_is_enabled.rego index a4da6a8c..97cf4c63 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.9_DKIM_is_enabled.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.1.9_DKIM_is_enabled.rego @@ -1,9 +1,9 @@ # METADATA # title: Ensure that DKIM is enabled for all Exchange Online Domains # description: | -# DKIM is one of the trio of Authentication methods (SPF, DKIM and DMARC) that help -# prevent attackers from sending messages that look like they come from your domain. -# +# DKIM is one of the trio of authentication methods (SPF, DKIM, and DMARC) that help +# prevent attackers from sending messages that look like they come from your domain. +# # related_resources: # - ref: https://www.cisecurity.org/benchmark/microsoft_365 # description: CIS Microsoft 365 Foundations Benchmark diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.4.4_Zero_hour_AutoPurge_MSTeams_is_On.rego b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.4.4_Zero_hour_AutoPurge_MSTeams_is_On.rego index b83d0f57..499cfe14 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.4.4_Zero_hour_AutoPurge_MSTeams_is_On.rego +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/2.4.4_Zero_hour_AutoPurge_MSTeams_is_On.rego @@ -21,13 +21,23 @@ package cis.microsoft_365_foundations.v6_0_0.control_2_4_4 -import rego.v1 +default result := {"compliant": false, "message": "Evaluation failed"} -zap_enabled := object.get(input, "zap_enabled", null) +required_fields := { + "ZeroHourAutoPurgeEnabled": true +} + +zero_hour_auto_purge_enabled := true if { + input.ZeroHourAutoPurgeEnabled == true +} -zero_hour_auto_purge_enabled := true if zap_enabled == true -zero_hour_auto_purge_enabled := false if zap_enabled == false -zero_hour_auto_purge_enabled := null if zap_enabled == null +zero_hour_auto_purge_enabled := false if { + input.ZeroHourAutoPurgeEnabled != true +} + +zero_hour_auto_purge_enabled := null if { + not input.ZeroHourAutoPurgeEnabled +} result := output if { compliant := zero_hour_auto_purge_enabled == true @@ -37,14 +47,15 @@ result := output if { "message": generate_message(zero_hour_auto_purge_enabled), "affected_resources": generate_affected_resources(zero_hour_auto_purge_enabled), "details": { - "zap_enabled": zap_enabled + "ZeroHourAutoPurgeEnabled": input.ZeroHourAutoPurgeEnabled } } } generate_message(true) := "Zero-hour auto purge is enabled for Microsoft Teams" generate_message(false) := "Zero-hour auto purge is not enabled for Microsoft Teams" -generate_message(null) := "Unable to determine Zero-hour auto purge status for Microsoft Teams" +generate_message(null) := "Unable to determine if Zero-hour auto purge is enabled for Microsoft Teams" + generate_affected_resources(true) := [] generate_affected_resources(false) := ["TeamsProtectionPolicy"] generate_affected_resources(null) := ["TeamsProtectionPolicy status unknown"] diff --git a/engine/policies/cis/microsoft-365-foundations/v6.0.0/metadata.json b/engine/policies/cis/microsoft-365-foundations/v6.0.0/metadata.json index c83f28ef..dfb125b8 100644 --- a/engine/policies/cis/microsoft-365-foundations/v6.0.0/metadata.json +++ b/engine/policies/cis/microsoft-365-foundations/v6.0.0/metadata.json @@ -242,8 +242,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.safe_links_policy", "policy_file": "2.1.1_SafeLinks_OfficeApplications_Enabled.rego", + "policy_file": "2.1.1_SafeLinks_OfficeApplications_Enabled.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -257,8 +259,9 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.malware_filter_policy", - "policy_file": "2.1.2_Common_AttachmentTypes_Enabled.rego", + "policy_file": "2.1.2_Common_AttachmentTypes_Filter_Enabled.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -272,8 +275,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.malware_filter_policy", "policy_file": "2.1.3_Notifications_InternalUsers_sendingMalware_Enabled.rego", + "policy_file": "2.1.3_Notifications_InternalUsers_sendingMalware_Enabled.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -287,8 +292,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.safe_attachment_policy", "policy_file": "2.1.4_Safe_AttachementsPolicy_Enabled.rego", + "policy_file": "2.1.4_Safe_AttachementsPolicy_Enabled.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -302,8 +309,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.atp_policy_o365", "policy_file": "2.1.5_Safe_Attachments_SharePoint_OneDrive_MSTeams_Enabled.rego", + "policy_file": "2.1.5_Safe_Attachments_SharePoint_OneDrive_MSTeams_Enabled.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -317,8 +326,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.hosted_outbound_spam_filter", "policy_file": "2.1.6_Exchange_OnlineSpam_Policies_Notify_Administrators.rego", + "policy_file": "2.1.6_Exchange_OnlineSpam_Policies_Notify_Administrators.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -332,8 +343,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.anti_phish_policy", "policy_file": "2.1.7_AntiPhishing_Policy_is_created.rego", + "policy_file": "2.1.7_AntiPhishing_Policy_is_created.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -392,8 +405,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.malware_filter_policy", "policy_file": "2.1.11_Comprehensive_Attachment_Filtering_Applied.rego", + "policy_file": "2.1.11_Comprehensive_Attachment_Filtering_Applied.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -407,8 +422,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.hosted_connection_filter", "policy_file": "2.1.12_ConnectionFilter_IPAllowList_not_used.rego", + "policy_file": "2.1.12_ConnectionFilter_IPAllowList_not_used.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -422,8 +439,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.hosted_connection_filter", "policy_file": "2.1.13_Connection_Filter_SafeList_Off.rego", + "policy_file": "2.1.13_Connection_Filter_SafeList_Off.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -437,8 +456,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.hosted_content_filter", "policy_file": "2.1.14_Inbound_AntiSpam_Policies_DoNot_AllowedDomains.rego", + "policy_file": "2.1.14_Inbound_AntiSpam_Policies_DoNot_AllowedDomains.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -452,8 +473,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.hosted_outbound_spam_filter", "policy_file": "2.1.15_Outbound_AntiSpam_MessageLimits_InPlace.rego", + "policy_file": "2.1.15_Outbound_AntiSpam_MessageLimits_InPlace.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, @@ -527,8 +550,10 @@ "is_manual": false, "benchmark_audit_type": "Automated", "automation_status": "ready", + "automation_status": "ready", "data_collector_id": "exchange.protection.teams_protection_policy", "policy_file": "2.4.4_Zero_hour_AutoPurge_MSTeams_is_On.rego", + "policy_file": "2.4.4_Zero_hour_AutoPurge_MSTeams_is_On.rego", "requires_permissions": ["Exchange.Manage"], "notes": null }, From cfe2417e2d9cdcf70172f278b9976a1afd48cc33 Mon Sep 17 00:00:00 2001 From: Romil Bijarnia Date: Thu, 29 Jan 2026 18:50:32 +0530 Subject: [PATCH 03/20] conflicts addressed --- backend-api/app/Contact-ER-Diagram.jpg | Bin 0 -> 172441 bytes backend-api/app/api/v1/contact.py | 27 +- backend-api/app/api/v1/router.py | 3 + .../app/contactus api flow AutoAudit.jpg | Bin 0 -> 41983 bytes backend-api/app/main.py | 11 + backend-api/app/models/__init__.py | 4 + backend-api/app/models/user.py | 1 + backend-api/app/schemas/contact.py | 4 +- frontend/package-lock.json | 10350 +++++++++++++--- frontend/src/App.jsx | 1 + frontend/src/api/client.js | 52 + frontend/src/pages/Admin/ContactAdminPage.css | 463 +- frontend/src/pages/Admin/ContactAdminPage.js | 277 + .../pages/Contact/components/ContactForm.jsx | 40 +- 14 files changed, 9429 insertions(+), 1804 deletions(-) create mode 100644 backend-api/app/Contact-ER-Diagram.jpg create mode 100644 backend-api/app/contactus api flow AutoAudit.jpg create mode 100644 frontend/src/pages/Admin/ContactAdminPage.js diff --git a/backend-api/app/Contact-ER-Diagram.jpg b/backend-api/app/Contact-ER-Diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..908e195dbfdc69ade0fb62d8ede6eb80666f5810 GIT binary patch literal 172441 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

$3lxX; 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 None: ) ) - if "status" in payload.model_fields_set: - if payload.status is None: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="status cannot be null") + if "status" in payload.__fields_set__: track_change("status", submission.status, payload.status) - new_status = payload.status.lower() submission.status = payload.status - if new_status == "resolved": + if payload.status and payload.status.lower() == "resolved" and payload.resolved_at is None: submission.resolved_at = datetime.utcnow() - elif submission.resolved_at is not None: - submission.resolved_at = None - if "priority" in payload.model_fields_set: - if payload.priority is None: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="priority cannot be null") + if "priority" in payload.__fields_set__: track_change("priority", submission.priority, payload.priority) submission.priority = payload.priority - if "assigned_to" in payload.model_fields_set: - if payload.assigned_to is not None: - user_result = await db.execute( - select(User).where(User.id == payload.assigned_to) - ) - assigned_user = user_result.scalar_one_or_none() - if not assigned_user: - raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail="assigned_to user not found", - ) + if "assigned_to" in payload.__fields_set__: track_change( "assigned_to", str(submission.assigned_to) if submission.assigned_to is not None else None, @@ -169,7 +152,7 @@ def track_change(field: str, old: str | None, new: str | None) -> None: ) submission.assigned_to = payload.assigned_to - if "resolved_at" in payload.model_fields_set: + if "resolved_at" in payload.__fields_set__: track_change( "resolved_at", submission.resolved_at.isoformat() if submission.resolved_at else None, diff --git a/backend-api/app/api/v1/router.py b/backend-api/app/api/v1/router.py index 8bb1c4ba..78cbf0f3 100644 --- a/backend-api/app/api/v1/router.py +++ b/backend-api/app/api/v1/router.py @@ -29,3 +29,6 @@ # User settings routes api_router.include_router(settings.router) + +# Contact routes +api_router.include_router(contact.router) diff --git a/backend-api/app/contactus api flow AutoAudit.jpg b/backend-api/app/contactus api flow AutoAudit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ca9e293639e2c4dba6b145d896903e1fff8e434 GIT binary patch literal 41983 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 Zv>cs8s8Ayme)H2$|5*b6|Fu3(`~x@8(7*ry literal 0 HcmV?d00001 diff --git a/backend-api/app/main.py b/backend-api/app/main.py index ec9e1add..c0eec311 100644 --- a/backend-api/app/main.py +++ b/backend-api/app/main.py @@ -5,6 +5,12 @@ from app.core.config import get_settings from app.core.middleware import RequestLoggingMiddleware from app.core.errors import not_found_handler, NotFound +<<<<<<< HEAD +======= +from app.db.base import Base, engine +import app.models # noqa: F401 + +>>>>>>> b2f5eed (contact us schemas and apis added) settings = get_settings() @@ -30,6 +36,11 @@ def create_app() -> FastAPI: # error handler app.add_exception_handler(NotFound, not_found_handler) + @app.on_event("startup") + async def init_contact_schema() -> None: + async with engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) + @app.get("/") def root(): return {"status": "ok", "message": "AutoAudit API running"} diff --git a/backend-api/app/models/__init__.py b/backend-api/app/models/__init__.py index 27c476e4..b8894b5c 100644 --- a/backend-api/app/models/__init__.py +++ b/backend-api/app/models/__init__.py @@ -12,6 +12,7 @@ from app.models.evidence_validation import EvidenceValidation from app.models.contact import ContactSubmission, SubmissionNote, SubmissionHistory from app.models.user_settings import UserSettings +from app.models.contact import ContactSubmission, SubmissionNote, SubmissionHistory __all__ = [ "User", @@ -29,4 +30,7 @@ "SubmissionNote", "SubmissionHistory", "UserSettings", + "ContactSubmission", + "SubmissionNote", + "SubmissionHistory", ] diff --git a/backend-api/app/models/user.py b/backend-api/app/models/user.py index 7db3b99f..723ecafa 100644 --- a/backend-api/app/models/user.py +++ b/backend-api/app/models/user.py @@ -14,6 +14,7 @@ from app.models.contact import ContactSubmission, SubmissionHistory, SubmissionNote from app.models.oauth_account import OAuthAccount from app.models.user_settings import UserSettings + from app.models.contact import ContactSubmission, SubmissionHistory, SubmissionNote class Role(str, Enum): diff --git a/backend-api/app/schemas/contact.py b/backend-api/app/schemas/contact.py index 02d3e482..8bc0da49 100644 --- a/backend-api/app/schemas/contact.py +++ b/backend-api/app/schemas/contact.py @@ -22,8 +22,8 @@ class ContactSubmissionCreate(ContactSubmissionBase): class ContactSubmissionUpdate(BaseModel): - status: str | None = Field(None, min_length=1, max_length=20) - priority: str | None = Field(None, min_length=1, max_length=20) + status: str | None = Field(None, max_length=20) + priority: str | None = Field(None, max_length=20) assigned_to: int | None = None resolved_at: datetime | None = None diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d482bbd6..13a9e518 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -278,1824 +278,9368 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", - "cpu": [ - "mips64el" - ], - "dev": true, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", - "cpu": [ - "riscv64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", - "cpu": [ - "s390x" - ], - "dev": true, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", + "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@fontsource/league-spartan": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@fontsource/league-spartan/-/league-spartan-5.2.7.tgz", - "integrity": "sha512-OwYjMcJOGAGB680+4+Z47c/G5Ky8f8mT9Md6e8DB8/6fi1RGd/Ct5pUe3KT/lhUeNGUT8m5R4PKww47qtU8NHw==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", - "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.2.tgz", - "integrity": "sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.2.tgz", - "integrity": "sha512-eXBg7ibkNUZ+sTwbFiDKou0BAckeV6kIigK7y5Ko4mB/5A1KLhuzEKovsmfvsL8mQorkoincMFGnQuIT92SKqA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.2.tgz", - "integrity": "sha512-UCbaTklREjrc5U47ypLulAgg4njaqfOVLU18VrCrI+6E5MQjuG0lSWaqLlAJwsD7NpFV249XgB0Bi37Zh5Sz4g==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.2.tgz", - "integrity": "sha512-dP67MA0cCMHFT2g5XyjtpVOtp7y4UyUxN3dhLdt11at5cPKnSm4lY+EhwNvDXIMzAMIo2KU+mc9wxaAQJTn7sQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", + "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fontsource/league-spartan": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@fontsource/league-spartan/-/league-spartan-5.2.7.tgz", + "integrity": "sha512-OwYjMcJOGAGB680+4+Z47c/G5Ky8f8mT9Md6e8DB8/6fi1RGd/Ct5pUe3KT/lhUeNGUT8m5R4PKww47qtU8NHw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.2.tgz", + "integrity": "sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.2.tgz", + "integrity": "sha512-eXBg7ibkNUZ+sTwbFiDKou0BAckeV6kIigK7y5Ko4mB/5A1KLhuzEKovsmfvsL8mQorkoincMFGnQuIT92SKqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.2.tgz", + "integrity": "sha512-UCbaTklREjrc5U47ypLulAgg4njaqfOVLU18VrCrI+6E5MQjuG0lSWaqLlAJwsD7NpFV249XgB0Bi37Zh5Sz4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.2.tgz", + "integrity": "sha512-dP67MA0cCMHFT2g5XyjtpVOtp7y4UyUxN3dhLdt11at5cPKnSm4lY+EhwNvDXIMzAMIo2KU+mc9wxaAQJTn7sQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.2.tgz", + "integrity": "sha512-WDUPLUwfYV9G1yxNRJdXcvISW15mpvod1Wv3ok+Ws93w1HjIVmCIFxsG2DquO+3usMNCpJQ0wqO+3GhFdl6Fow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.2.tgz", + "integrity": "sha512-Ng95wtHVEulRwn7R0tMrlUuiLVL/HXA8Lt/MYVpy88+s5ikpntzZba1qEulTuPnPIZuOPcW9wNEiqvZxZmgmqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.2.tgz", + "integrity": "sha512-AEXMESUDWWGqD6LwO/HkqCZgUE1VCJ1OhbvYGsfqX2Y6w5quSXuyoy/Fg3nRqiwro+cJYFxiw5v4kB2ZDLhxrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.2.tgz", + "integrity": "sha512-ZV7EljjBDwBBBSv570VWj0hiNTdHt9uGznDtznBB4Caj3ch5rgD4I2K1GQrtbvJ/QiB+663lLgOdcADMNVC29Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.2.tgz", + "integrity": "sha512-uvjwc8NtQVPAJtq4Tt7Q49FOodjfbf6NpqXyW/rjXoV+iZ3EJAHLNAnKT5UJBc6ffQVgmXTUL2ifYiLABlGFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.2.tgz", + "integrity": "sha512-s3KoWVNnye9mm/2WpOZ3JeUiediUVw6AvY/H7jNA6qgKA2V2aM25lMkVarTDfiicn/DLq3O0a81jncXszoyCFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.2.tgz", + "integrity": "sha512-gi21faacK+J8aVSyAUptML9VQN26JRxe484IbF+h3hpG+sNVoMXPduhREz2CcYr5my0NE3MjVvQ5bMKX71pfVA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.2.tgz", + "integrity": "sha512-qSlWiXnVaS/ceqXNfnoFZh4IiCA0EwvCivivTGbEu1qv2o+WTHpn1zNmCTAoOG5QaVr2/yhCoLScQtc/7RxshA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.2.tgz", + "integrity": "sha512-rPyuLFNoF1B0+wolH277E780NUKf+KoEDb3OyoLbAO18BbeKi++YN6gC/zuJoPPDlQRL3fIxHxCxVEWiem2yXw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.2.tgz", + "integrity": "sha512-g+0ZLMook31iWV4PvqKU0i9E78gaZgYpSrYPed/4Bu+nGTgfOPtfs1h11tSSRPXSjC5EzLTjV/1A7L2Vr8pJoQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.2.tgz", + "integrity": "sha512-i+sGeRGsjKZcQRh3BRfpLsM3LX3bi4AoEVqmGDyc50L6KfYsN45wVCSz70iQMwPWr3E5opSiLOwsC9WB4/1pqg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.2.tgz", + "integrity": "sha512-C1vLcKc4MfFV6I0aWsC7B2Y9QcsiEcvKkfxprwkPfLaN8hQf0/fKHwSF2lcYzA9g4imqnhic729VB9Fo70HO3Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.2.tgz", + "integrity": "sha512-68gHUK/howpQjh7g7hlD9DvTTt4sNLp1Bb+Yzw2Ki0xvscm2cOdCLZNJNhd2jW8lsTPrHAHuF751BygifW4bkQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.2.tgz", + "integrity": "sha512-1e30XAuaBP1MAizaOBApsgeGZge2/Byd6wV4a8oa6jPdHELbRHBiw7wvo4dp7Ie2PE8TZT4pj9RLGZv9N4qwlw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.2.tgz", + "integrity": "sha512-4BJucJBGbuGnH6q7kpPqGJGzZnYrpAzRd60HQSt3OpX/6/YVgSsJnNzR8Ot74io50SeVT4CtCWe/RYIAymFPwA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.2.tgz", + "integrity": "sha512-cT2MmXySMo58ENv8p6/O6wI/h/gLnD3D6JoajwXFZH6X9jz4hARqUhWpGuQhOgLNXscfZYRQMJvZDtWNzMAIDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.2.tgz", + "integrity": "sha512-sZnyUgGkuzIXaK3jNMPmUIyJrxu/PjmATQrocpGA1WbCPX8H5tfGgRSuYtqBYAvLuIGp8SPRb1O4d1Fkb5fXaQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.2.tgz", + "integrity": "sha512-sDpFbenhmWjNcEbBcoTV0PWvW5rPJFvu+P7XoTY0YLGRupgLbFY0XPfwIbJOObzO7QgkRDANh65RjhPmgSaAjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.2.tgz", + "integrity": "sha512-GvJ03TqqaweWCigtKQVBErw2bEhu1tyfNQbarwr94wCGnczA9HF8wqEe3U/Lfu6EdeNP0p6R+APeHVwEqVxpUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.2.tgz", + "integrity": "sha512-KvXsBvp13oZz9JGe5NYS7FNizLe99Ny+W8ETsuCyjXiKdiGrcz2/J/N8qxZ/RSwivqjQguug07NLHqrIHrqfYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.2.tgz", + "integrity": "sha512-xNO+fksQhsAckRtDSPWaMeT1uIM+JrDRXlerpnWNXhn1TdB3YZ6uKBMBTKP0eX9XtYEP978hHk1f8332i2AW8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", + "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.9", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/browserslist": { + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001739", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", + "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==", + "dev": true, + "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/chart.js": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", + "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.213", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz", + "integrity": "sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.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-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "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-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "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==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "license": "MIT", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.542.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.542.0.tgz", + "integrity": "sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "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==", + "dev": true, + "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/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-router": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.1.tgz", + "integrity": "sha512-pfAByjcTpX55mqSDGwGnY9vDCpxqBLASg0BMNAuMmpSGESo/TaOUG6BllhAtAkCGx8Rnohik/XtaqiYUJtgW2g==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.1.tgz", + "integrity": "sha512-U9WBQssBE9B1vmRjo9qTM7YRzfZ3lUxESIZnsf4VjR/lXYz9MHjvOxHzr/aUm4efpktbVOrF09rL/y4VHa8RMw==", + "license": "MIT", + "dependencies": { + "react-router": "7.9.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.2.tgz", - "integrity": "sha512-WDUPLUwfYV9G1yxNRJdXcvISW15mpvod1Wv3ok+Ws93w1HjIVmCIFxsG2DquO+3usMNCpJQ0wqO+3GhFdl6Fow==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.2.tgz", - "integrity": "sha512-Ng95wtHVEulRwn7R0tMrlUuiLVL/HXA8Lt/MYVpy88+s5ikpntzZba1qEulTuPnPIZuOPcW9wNEiqvZxZmgmqQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.2.tgz", - "integrity": "sha512-AEXMESUDWWGqD6LwO/HkqCZgUE1VCJ1OhbvYGsfqX2Y6w5quSXuyoy/Fg3nRqiwro+cJYFxiw5v4kB2ZDLhxrw==", - "cpu": [ - "arm" - ], + "node_modules/semver": { + "version": "6.3.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.2.tgz", - "integrity": "sha512-ZV7EljjBDwBBBSv570VWj0hiNTdHt9uGznDtznBB4Caj3ch5rgD4I2K1GQrtbvJ/QiB+663lLgOdcADMNVC29Q==", - "cpu": [ - "arm" - ], + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/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==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.2.tgz", - "integrity": "sha512-uvjwc8NtQVPAJtq4Tt7Q49FOodjfbf6NpqXyW/rjXoV+iZ3EJAHLNAnKT5UJBc6ffQVgmXTUL2ifYiLABlGFqA==", - "cpu": [ - "arm64" - ], + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ] + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.2.tgz", - "integrity": "sha512-s3KoWVNnye9mm/2WpOZ3JeUiediUVw6AvY/H7jNA6qgKA2V2aM25lMkVarTDfiicn/DLq3O0a81jncXszoyCFA==", - "cpu": [ - "arm64" - ], + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "optional": true, - "os": [ - "linux" - ] + "peer": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.2.tgz", - "integrity": "sha512-gi21faacK+J8aVSyAUptML9VQN26JRxe484IbF+h3hpG+sNVoMXPduhREz2CcYr5my0NE3MjVvQ5bMKX71pfVA==", - "cpu": [ - "loong64" - ], + "node_modules/tailwindcss": { + "version": "4.1.18", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.2.tgz", - "integrity": "sha512-qSlWiXnVaS/ceqXNfnoFZh4IiCA0EwvCivivTGbEu1qv2o+WTHpn1zNmCTAoOG5QaVr2/yhCoLScQtc/7RxshA==", - "cpu": [ - "loong64" - ], + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "optional": true, - "os": [ - "linux" - ] + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.2.tgz", - "integrity": "sha512-rPyuLFNoF1B0+wolH277E780NUKf+KoEDb3OyoLbAO18BbeKi++YN6gC/zuJoPPDlQRL3fIxHxCxVEWiem2yXw==", - "cpu": [ - "ppc64" - ], + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ] + "peer": true }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.2.tgz", - "integrity": "sha512-g+0ZLMook31iWV4PvqKU0i9E78gaZgYpSrYPed/4Bu+nGTgfOPtfs1h11tSSRPXSjC5EzLTjV/1A7L2Vr8pJoQ==", - "cpu": [ - "ppc64" - ], + "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", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=0.8" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.2.tgz", - "integrity": "sha512-i+sGeRGsjKZcQRh3BRfpLsM3LX3bi4AoEVqmGDyc50L6KfYsN45wVCSz70iQMwPWr3E5opSiLOwsC9WB4/1pqg==", - "cpu": [ - "riscv64" - ], - "dev": true, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=4" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.2.tgz", - "integrity": "sha512-C1vLcKc4MfFV6I0aWsC7B2Y9QcsiEcvKkfxprwkPfLaN8hQf0/fKHwSF2lcYzA9g4imqnhic729VB9Fo70HO3Q==", - "cpu": [ - "riscv64" - ], - "dev": true, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.2.tgz", - "integrity": "sha512-68gHUK/howpQjh7g7hlD9DvTTt4sNLp1Bb+Yzw2Ki0xvscm2cOdCLZNJNhd2jW8lsTPrHAHuF751BygifW4bkQ==", - "cpu": [ - "s390x" - ], - "dev": true, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.2.tgz", - "integrity": "sha512-1e30XAuaBP1MAizaOBApsgeGZge2/Byd6wV4a8oa6jPdHELbRHBiw7wvo4dp7Ie2PE8TZT4pj9RLGZv9N4qwlw==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=4" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.2.tgz", - "integrity": "sha512-4BJucJBGbuGnH6q7kpPqGJGzZnYrpAzRd60HQSt3OpX/6/YVgSsJnNzR8Ot74io50SeVT4CtCWe/RYIAymFPwA==", - "cpu": [ - "x64" - ], + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/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", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.2.tgz", - "integrity": "sha512-cT2MmXySMo58ENv8p6/O6wI/h/gLnD3D6JoajwXFZH6X9jz4hARqUhWpGuQhOgLNXscfZYRQMJvZDtWNzMAIDw==", - "cpu": [ - "x64" - ], + "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", - "optional": true, - "os": [ - "openbsd" - ] + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.2.tgz", - "integrity": "sha512-sZnyUgGkuzIXaK3jNMPmUIyJrxu/PjmATQrocpGA1WbCPX8H5tfGgRSuYtqBYAvLuIGp8SPRb1O4d1Fkb5fXaQ==", - "cpu": [ - "arm64" - ], + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "openharmony" - ] + "peer": true }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.2.tgz", - "integrity": "sha512-sDpFbenhmWjNcEbBcoTV0PWvW5rPJFvu+P7XoTY0YLGRupgLbFY0XPfwIbJOObzO7QgkRDANh65RjhPmgSaAjQ==", - "cpu": [ - "arm64" - ], + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.2.tgz", - "integrity": "sha512-GvJ03TqqaweWCigtKQVBErw2bEhu1tyfNQbarwr94wCGnczA9HF8wqEe3U/Lfu6EdeNP0p6R+APeHVwEqVxpUQ==", - "cpu": [ - "ia32" - ], + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=10.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.2.tgz", - "integrity": "sha512-KvXsBvp13oZz9JGe5NYS7FNizLe99Ny+W8ETsuCyjXiKdiGrcz2/J/N8qxZ/RSwivqjQguug07NLHqrIHrqfYw==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">= 0.8" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.2.tgz", - "integrity": "sha512-xNO+fksQhsAckRtDSPWaMeT1uIM+JrDRXlerpnWNXhn1TdB3YZ6uKBMBTKP0eX9XtYEP978hHk1f8332i2AW8Q==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, "engines": { - "node": ">=18" + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" } }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "license": "Apache-2.0", + "node_modules/webpack": { + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", + "license": "MIT", "dependencies": { - "dequal": "^2.0.3" + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/@testing-library/react": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", - "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5" + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">=18" + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { - "@types/react": { + "@types/node": { "optional": true }, - "@types/react-dom": { + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { "optional": true } } }, - "node_modules/@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5" + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" }, "engines": { - "node": ">=10", - "npm": ">=6" + "node": ">=12.22.0" }, "peerDependencies": { - "@testing-library/dom": ">=7.21.4" + "webpack": "^4.44.2 || ^5.47.0" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", "dependencies": { - "@babel/types": "^7.28.2" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~7.10.0" + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "node_modules/@vitejs/plugin-react": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", - "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", - "dev": true, - "license": "MIT", + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.28.5", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.53", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "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", - "optional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", "engines": { - "node": ">=0.4.0" + "node": ">=0.8.0" } }, - "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==", + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "iconv-lite": "0.4.24" } }, - "node_modules/browserslist": { - "version": "4.25.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", - "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001737", - "electron-to-chromium": "^1.5.211", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=0.10.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" }, - "node_modules/caniuse-lite": { - "version": "1.0.30001739", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", - "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==", - "dev": true, - "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/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" }, - "node_modules/chart.js": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", - "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "license": "MIT", "dependencies": { - "@kurkle/color": "^0.3.0" + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" }, "engines": { - "pnpm": ">=8" + "node": ">=10" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "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": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.213", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.213.tgz", - "integrity": "sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "dev": true, - "hasInstallScript": true, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, + "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==", "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": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=0.10.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", "license": "MIT", - "engines": { - "node": ">=6.9.0" + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" } }, - "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "jiti": "bin/jiti.js" + "dependencies": { + "workbox-core": "6.6.0" } }, - "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/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" }, "engines": { - "node": ">=6" + "node": ">=10.0.0" } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.542.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.542.0.tgz", - "integrity": "sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/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, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 8" } }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } }, - "node_modules/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/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" }, - "node_modules/picomatch": { - "version": "4.0.3", - "dev": true, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "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" - } - ], + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "workbox-core": "6.6.0" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "idb": "^7.0.1", + "workbox-core": "6.6.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "license": "MIT", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, - "node_modules/react": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", - "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "workbox-core": "6.6.0" } }, - "node_modules/react-dom": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", - "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", "license": "MIT", "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.1" + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } }, - "node_modules/react-router": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.1.tgz", - "integrity": "sha512-pfAByjcTpX55mqSDGwGnY9vDCpxqBLASg0BMNAuMmpSGESo/TaOUG6BllhAtAkCGx8Rnohik/XtaqiYUJtgW2g==", + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", "license": "MIT", "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" } }, - "node_modules/react-router-dom": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.1.tgz", - "integrity": "sha512-U9WBQssBE9B1vmRjo9qTM7YRzfZ3lUxESIZnsf4VjR/lXYz9MHjvOxHzr/aUm4efpktbVOrF09rL/y4VHa8RMw==", + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", "license": "MIT", "dependencies": { - "react-router": "7.9.1" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "workbox-core": "6.6.0" } }, - "node_modules/react-router/node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "workbox-core": "6.6.0" } }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", "license": "MIT" }, - "node_modules/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==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" } }, - "node_modules/source-map-support/node_modules/source-map": { + "node_modules/workbox-webpack-plugin/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/tailwindcss": { - "version": "4.1.18", - "dev": true, - "license": "MIT" - }, - "node_modules/terser": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", - "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "license": "MIT", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", "license": "MIT", - "optional": true, - "peer": true + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "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" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "dev": true, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">=8.3.0" }, "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { + "bufferutil": { "optional": true }, "yaml": { diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 391d5cb6..a7d43e57 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -20,6 +20,7 @@ import LoginPage from './pages/Auth/LoginPage'; import SignUpPage from './pages/Auth/SignUpPage'; import ContactAdminPage from './pages/Admin/ContactAdminPage.jsx'; import GoogleCallbackPage from './pages/Auth/GoogleCallbackPage'; +import ContactAdminPage from './pages/Admin/ContactAdminPage'; // Auth Context import { useAuth } from './context/AuthContext'; diff --git a/frontend/src/api/client.js b/frontend/src/api/client.js index 8db31aa1..1823b183 100644 --- a/frontend/src/api/client.js +++ b/frontend/src/api/client.js @@ -168,6 +168,58 @@ export async function updateSettings(token, data) { }); } +// Contact submissions +export async function createContactSubmission(payload) { + return fetchWithAuth('/v1/contact', null, { + method: 'POST', + body: JSON.stringify(payload), + }); +} + +export async function getContactSubmissions(token) { + return fetchWithAuth('/v1/contact/submissions', token); +} + +export async function getContactSubmission(token, id) { + return fetchWithAuth(`/v1/contact/submissions/${id}`, token); +} + +export async function updateContactSubmission(token, id, payload) { + return fetchWithAuth(`/v1/contact/submissions/${id}`, token, { + method: 'PATCH', + body: JSON.stringify(payload), + }); +} + +export async function deleteContactSubmission(token, id) { + const response = await fetch(`${API_BASE_URL}/v1/contact/submissions/${id}`, { + method: 'DELETE', + headers: { + Authorization: `Bearer ${token}`, + }, + }); + + if (!response.ok) { + const error = await response.json().catch(() => ({ detail: response.statusText })); + throw new APIError(error.detail || 'Failed to delete submission', response.status, error); + } +} + +export async function getContactNotes(token, id) { + return fetchWithAuth(`/v1/contact/submissions/${id}/notes`, token); +} + +export async function addContactNote(token, id, payload) { + return fetchWithAuth(`/v1/contact/submissions/${id}/notes`, token, { + method: 'POST', + body: JSON.stringify(payload), + }); +} + +export async function getContactHistory(token, id) { + return fetchWithAuth(`/v1/contact/submissions/${id}/history`, token); +} + // Platform endpoints export async function getPlatforms(token) { return fetchWithAuth('/v1/platforms', token); diff --git a/frontend/src/pages/Admin/ContactAdminPage.css b/frontend/src/pages/Admin/ContactAdminPage.css index 359dc9d3..a671f80d 100644 --- a/frontend/src/pages/Admin/ContactAdminPage.css +++ b/frontend/src/pages/Admin/ContactAdminPage.css @@ -1,34 +1,34 @@ .contact-admin { min-height: 100vh; + padding: 2rem 5%; background: #0a1628; color: #ffffff; - font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; - overflow-x: hidden; } -.contact-admin__container { - max-width: 1600px; - margin: 0 auto; - padding: 2rem 3%; -} - -.contact-admin__page-header { +.contact-admin__header { display: flex; justify-content: space-between; - align-items: flex-start; - margin-bottom: 2rem; + align-items: center; + margin-bottom: 1.5rem; } -.contact-admin__page-header-content h1 { - font-size: 2rem; - margin-bottom: 0.5rem; +.contact-admin__header h1 { + margin: 0 0 0.25rem; } -.contact-admin__page-header-content p { +.contact-admin__header p { + margin: 0; color: #b0c4de; - font-size: 1rem; } +.contact-admin__refresh { + background: rgba(64, 224, 208, 0.15); + border: 1px solid rgba(64, 224, 208, 0.4); + color: #40e0d0; + padding: 0.6rem 1rem; + border-radius: 10px; + cursor: pointer; +} .contact-admin__error, .contact-admin__message { @@ -51,16 +51,16 @@ .contact-admin__layout { display: grid; - grid-template-columns: 350px 1fr; - gap: 2rem; + grid-template-columns: 320px 1fr; + gap: 1.5rem; } .contact-admin__list { - background: rgba(255, 255, 255, 0.03); - border: 1px solid rgba(64, 224, 208, 0.1); - border-radius: 20px; - padding: 1.5rem; - max-height: calc(100vh - 160px); + background: #0f1f38; + border-radius: 16px; + padding: 1rem; + border: 1px solid rgba(64, 224, 208, 0.15); + max-height: 70vh; overflow-y: auto; } @@ -70,380 +70,158 @@ margin: 0; display: flex; flex-direction: column; - gap: 1rem; + gap: 0.75rem; } .contact-admin__list li { - background: rgba(255, 255, 255, 0.05); - border: 2px solid rgba(64, 224, 208, 0.1); + padding: 0.75rem; border-radius: 12px; - padding: 1.25rem; + background: rgba(255, 255, 255, 0.04); cursor: pointer; - transition: all 0.3s ease; - position: relative; display: flex; justify-content: space-between; align-items: center; gap: 0.75rem; -} - -.contact-admin__list li:hover { - background: rgba(255, 255, 255, 0.08); - border-color: #40e0d0; - transform: translateX(5px); + border: 1px solid transparent; } .contact-admin__list li.active { - background: rgba(64, 224, 208, 0.1); border-color: #40e0d0; + background: rgba(64, 224, 208, 0.12); } -.contact-admin__list h3 { - font-size: 1.1rem; - margin-bottom: 0.35rem; +.contact-admin__list h4 { + margin: 0; + font-size: 0.95rem; } .contact-admin__list p { + margin: 0.2rem 0 0; + font-size: 0.8rem; color: #b0c4de; - font-size: 0.9rem; -} - -.badge { - background: linear-gradient(135deg, #40e0d0, #1e90ff); - color: #ffffff; - padding: 0.25rem 0.75rem; - border-radius: 20px; - font-size: 0.75rem; - font-weight: 600; - text-transform: capitalize; -} - -.badge--in_progress { - background: linear-gradient(135deg, #f59e0b, #f97316); -} - -.badge--resolved, -.badge--closed { - background: linear-gradient(135deg, #22c55e, #16a34a); } .contact-admin__detail { - background: rgba(255, 255, 255, 0.03); - border: 1px solid rgba(64, 224, 208, 0.1); - border-radius: 20px; - padding: 2rem; - max-height: calc(100vh - 160px); - overflow-y: auto; -} - -.contact-admin__subject-header { - margin-bottom: 2rem; - padding-bottom: 1.5rem; - border-bottom: 1px solid rgba(64, 224, 208, 0.1); + background: #0f1f38; + border-radius: 16px; + padding: 1.5rem; + border: 1px solid rgba(64, 224, 208, 0.15); } -.contact-admin__subject-header h2 { - font-size: 1.8rem; - margin-bottom: 0.5rem; +.contact-admin__card-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: 1rem; } -.contact-admin__subject-tag { - background: rgba(64, 224, 208, 0.1); - color: #40e0d0; - padding: 0.5rem 1rem; - border-radius: 8px; - font-size: 0.9rem; - display: inline-block; - text-transform: capitalize; +.contact-admin__meta { + margin: 0.5rem 0 1rem; + color: #b0c4de; } -.contact-admin__contact-info, -.contact-admin__message-section { - background: rgba(255, 255, 255, 0.03); - border: 1px solid rgba(64, 224, 208, 0.1); +.contact-admin__message-body { + background: rgba(255, 255, 255, 0.04); + padding: 1rem; border-radius: 12px; - padding: 1.5rem; - margin-bottom: 2rem; + margin-bottom: 1.5rem; } -.contact-admin__contact-info h3, -.contact-admin__message-section h3, -.contact-admin__notes h3, -.contact-admin__history h3 { - font-size: 1.1rem; - margin-bottom: 1rem; -} - -.contact-admin__info-grid { +.contact-admin__controls { display: grid; - grid-template-columns: repeat(2, 1fr); + grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; + margin-bottom: 1.5rem; } -.contact-admin__info-item { - background: rgba(255, 255, 255, 0.03); - padding: 1rem; - border-radius: 8px; - border: 1px solid rgba(64, 224, 208, 0.1); -} - -.contact-admin__info-label { - color: #b0c4de; - font-size: 0.85rem; - margin-bottom: 0.5rem; +.contact-admin__controls label { display: flex; - align-items: center; + flex-direction: column; gap: 0.5rem; -} - -.contact-admin__info-value { - color: #ffffff; - font-size: 1rem; - font-weight: 500; -} - -.contact-admin__message-box { - background: rgba(255, 255, 255, 0.05); - border: 1px solid rgba(64, 224, 208, 0.1); - border-radius: 10px; - padding: 1.5rem; + font-size: 0.85rem; color: #b0c4de; - line-height: 1.8; - font-size: 0.95rem; - white-space: pre-wrap; - overflow-wrap: anywhere; - word-break: break-word; -} - -.contact-admin__message-box--scroll { - height: 300px; - overflow-y: auto; -} - -.contact-admin__actions { - display: grid; - grid-template-columns: 1fr; - gap: 1.25rem; - margin-bottom: 2rem; } -.form-label { - display: block; - margin: 0 0 8px 0; - font-weight: 600; - color: var(--text-primary); - font-size: 14px; -} - -.form-select, -.form-input, -.form-file { - width: 100%; - padding: 12px 14px; - border: 1px solid var(--border-color, #334155); +.contact-admin__controls select { + background: rgba(255, 255, 255, 0.06); + border: 1px solid rgba(64, 224, 208, 0.3); border-radius: 10px; - font-size: 15px; - background: var(--bg-primary, #0f172a); - color: var(--text-primary); - transition: all 0.3s ease; - border-radius: 10px; -} - -.form-select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - /* Match other app dropdowns in dark mode */ - background: var(--bg-tertiary, #334155); - background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1.5L6 6.5L11 1.5' stroke='%2394a3b8' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: right 12px center; - background-size: 12px 8px; - padding-right: 40px; - min-height: 46px; - line-height: 1.4; -} - -.form-select option { - background: var(--bg-secondary, #1e293b); - color: var(--text-primary); -} - -.form-select:focus, -.form-input:focus, -.form-file:focus { - outline: none; - border-color: var(--teal); - box-shadow: 0 0 0 2px rgba(100, 223, 223, 0.2); -} - -.form-select:disabled, -.form-input:disabled, -.form-file:disabled { - opacity: 0.6; - cursor: not-allowed; - background: var(--bg-tertiary, #334155); -} - -.contact-admin__action-buttons { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1rem; - margin-bottom: 2rem; + padding: 0.5rem 0.75rem; + color: #fff; } -.contact-admin__assign { - padding: 1rem; - background: linear-gradient(135deg, #40e0d0, #1e90ff); - color: #ffffff; +.contact-admin__assign, +.contact-admin__delete { border: none; border-radius: 10px; - font-weight: 600; + padding: 0.6rem 1rem; cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(64, 224, 208, 0.3); } -.contact-admin__assign:hover { - transform: translateY(-2px); - box-shadow: 0 6px 25px rgba(64, 224, 208, 0.5); +.contact-admin__assign { + background: rgba(64, 224, 208, 0.2); + color: #40e0d0; } .contact-admin__delete { - padding: 1rem; - background: linear-gradient(135deg, #dc3545, #c82333); - color: #ffffff; - border: none; - border-radius: 10px; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(220, 53, 69, 0.3); -} - -.contact-admin__delete:hover { - transform: translateY(-2px); - box-shadow: 0 6px 25px rgba(220, 53, 69, 0.5); + background: rgba(239, 68, 68, 0.2); + color: #fecaca; } -.contact-admin__notes { - margin-bottom: 2rem; +.contact-admin__notes, +.contact-admin__history { + margin-top: 1.5rem; } -.contact-admin__notes textarea { +.contact-admin__note-form textarea { width: 100%; - min-height: 120px; - padding: 1rem; - background: rgba(255, 255, 255, 0.05); - border: 2px solid rgba(64, 224, 208, 0.2); + min-height: 80px; + padding: 0.75rem; border-radius: 12px; - color: #ffffff; - font-size: 0.95rem; - font-family: inherit; - resize: vertical; - transition: all 0.3s ease; -} - -.contact-admin__notes textarea::placeholder { - color: #6c7a8d; -} - -.contact-admin__notes textarea:focus { - outline: none; - border-color: #40e0d0; - background: rgba(255, 255, 255, 0.08); + border: 1px solid rgba(64, 224, 208, 0.3); + background: rgba(255, 255, 255, 0.05); + color: #fff; } .contact-admin__note-actions { + margin-top: 0.5rem; display: flex; justify-content: space-between; align-items: center; - margin-top: 1rem; -} - -.contact-admin__internal-toggle { - display: flex; - align-items: center; - gap: 0.5rem; color: #b0c4de; - font-size: 0.9rem; -} - -.contact-admin__internal-toggle input { - width: 18px; - height: 18px; - accent-color: #40e0d0; - cursor: pointer; } .contact-admin__note-actions button { - padding: 0.75rem 1.5rem; - background: linear-gradient(135deg, #40e0d0, #1e90ff); - color: #ffffff; + background: #40e0d0; border: none; - border-radius: 10px; - font-weight: 600; + border-radius: 8px; + padding: 0.4rem 0.9rem; cursor: pointer; - transition: all 0.3s ease; -} - -.contact-admin__note-actions button:hover { - transform: translateY(-2px); - box-shadow: 0 4px 15px rgba(64, 224, 208, 0.3); -} - -.contact-admin__notes-list { - margin-bottom: 2rem; -} - -.contact-admin__note-item { - background: rgba(255, 255, 255, 0.05); - border: 1px solid rgba(64, 224, 208, 0.1); - border-radius: 12px; - padding: 1rem; - margin-bottom: 1rem; } -.contact-admin__note-item h4 { - font-size: 1rem; - margin-bottom: 0.5rem; +.contact-admin__notes ul, +.contact-admin__history ul { + list-style: none; + padding: 0; + margin: 1rem 0 0; + display: grid; + gap: 0.75rem; } -.contact-admin__note-item p { +.contact-admin__notes li, +.contact-admin__history li { + background: rgba(255, 255, 255, 0.04); + padding: 0.75rem; + border-radius: 10px; color: #b0c4de; - font-size: 0.9rem; - margin-bottom: 0.5rem; -} - -.contact-admin__timestamp { - color: #6c7a8d; - font-size: 0.85rem; -} - -.contact-admin__history-item { - background: rgba(255, 255, 255, 0.03); - border-left: 3px solid #40e0d0; - border-radius: 8px; - padding: 1rem; - margin-bottom: 1rem; } -.contact-admin__history-badge { - display: inline-block; - background: rgba(64, 224, 208, 0.2); - color: #40e0d0; - padding: 0.25rem 0.75rem; - border-radius: 6px; +.contact-admin__notes li span, +.contact-admin__history li span { + display: block; + margin-top: 0.4rem; font-size: 0.75rem; - font-weight: 600; - margin-bottom: 0.5rem; - text-transform: uppercase; -} - -.contact-admin__history-item p { - color: #b0c4de; - font-size: 0.9rem; - margin-bottom: 0.5rem; + color: #7aa3c2; } .contact-admin__empty { @@ -452,35 +230,32 @@ color: #b0c4de; } -@media (max-width: 1200px) { - .contact-admin__layout { - grid-template-columns: 300px 1fr; - } +.badge { + padding: 0.25rem 0.6rem; + border-radius: 999px; + font-size: 0.75rem; + text-transform: capitalize; + background: rgba(255, 255, 255, 0.1); } -@media (max-width: 968px) { - .contact-admin__layout { - grid-template-columns: 1fr; - } - - .contact-admin__list { - max-height: 400px; - } +.badge--new { + background: rgba(59, 130, 246, 0.2); + color: #bfdbfe; +} - .contact-admin__info-grid { - grid-template-columns: 1fr; - } +.badge--in_progress { + background: rgba(234, 179, 8, 0.2); + color: #fde68a; +} - .contact-admin__actions, - .contact-admin__action-buttons { - grid-template-columns: 1fr; - } +.badge--resolved, +.badge--closed { + background: rgba(34, 197, 94, 0.2); + color: #bbf7d0; } -@media (max-width: 640px) { - .contact-admin__page-header { - flex-direction: column; - gap: 1rem; +@media (max-width: 1024px) { + .contact-admin__layout { + grid-template-columns: 1fr; } - } diff --git a/frontend/src/pages/Admin/ContactAdminPage.js b/frontend/src/pages/Admin/ContactAdminPage.js new file mode 100644 index 00000000..4704f178 --- /dev/null +++ b/frontend/src/pages/Admin/ContactAdminPage.js @@ -0,0 +1,277 @@ +import React, { useEffect, useMemo, useState } from "react"; +import "./ContactAdminPage.css"; +import { useAuth } from "../../context/AuthContext"; +import { + addContactNote, + deleteContactSubmission, + getContactHistory, + getContactNotes, + getContactSubmissions, + updateContactSubmission, +} from "../../api/client"; + +const statusOptions = ["new", "in_progress", "resolved", "closed"]; +const priorityOptions = ["low", "medium", "high", "urgent"]; + +const ContactAdminPage = () => { + const { token, user } = useAuth(); + const [submissions, setSubmissions] = useState([]); + const [selectedId, setSelectedId] = useState(null); + const [notes, setNotes] = useState([]); + const [history, setHistory] = useState([]); + const [noteText, setNoteText] = useState(""); + const [isInternal, setIsInternal] = useState(true); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(""); + const [actionMessage, setActionMessage] = useState(""); + + const selectedSubmission = useMemo( + () => submissions.find((item) => item.id === selectedId) || null, + [submissions, selectedId] + ); + + const loadSubmissions = async () => { + setError(""); + setIsLoading(true); + try { + const data = await getContactSubmissions(token); + setSubmissions(data); + if (data.length && !selectedId) { + setSelectedId(data[0].id); + } + } catch (err) { + setError(err?.message || "Unable to load submissions."); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + loadSubmissions(); + }, []); + + useEffect(() => { + if (!selectedId) return; + + const loadDetail = async () => { + try { + const [noteData, historyData] = await Promise.all([ + getContactNotes(token, selectedId), + getContactHistory(token, selectedId), + ]); + setNotes(noteData); + setHistory(historyData); + } catch (err) { + setError(err?.message || "Unable to load submission details."); + } + }; + + loadDetail(); + }, [selectedId, token]); + + const handleUpdate = async (updates) => { + if (!selectedSubmission) return; + setActionMessage(""); + try { + const updated = await updateContactSubmission(token, selectedSubmission.id, updates); + setSubmissions((prev) => + prev.map((item) => (item.id === updated.id ? updated : item)) + ); + setActionMessage("Submission updated."); + } catch (err) { + setError(err?.message || "Unable to update submission."); + } + }; + + const handleAddNote = async () => { + if (!noteText.trim() || !selectedSubmission) return; + setActionMessage(""); + try { + const newNote = await addContactNote(token, selectedSubmission.id, { + note: noteText.trim(), + is_internal: isInternal, + }); + setNotes((prev) => [newNote, ...prev]); + setNoteText(""); + setActionMessage("Note added."); + } catch (err) { + setError(err?.message || "Unable to add note."); + } + }; + + const handleDelete = async () => { + if (!selectedSubmission) return; + setActionMessage(""); + try { + await deleteContactSubmission(token, selectedSubmission.id); + setSubmissions((prev) => prev.filter((item) => item.id !== selectedSubmission.id)); + setSelectedId(null); + setNotes([]); + setHistory([]); + setActionMessage("Submission deleted."); + } catch (err) { + setError(err?.message || "Unable to delete submission."); + } + }; + + if (user?.role !== "admin") { + return ( +
+
+

Admin access required

+

You do not have permission to view this page.

+
+
+ ); + } + + return ( +
+
+
+

Contact Submissions

+

Review and manage incoming Contact Us requests.

+
+ +
+ + {error &&
{error}
} + {actionMessage &&
{actionMessage}
} + +
+
+ {isLoading ? ( +

Loading submissions...

+ ) : submissions.length ? ( +
    + {submissions.map((submission) => ( +
  • setSelectedId(submission.id)} + > +
    +

    + {submission.first_name} {submission.last_name} +

    +

    {submission.subject}

    +
    + {submission.status} +
  • + ))} +
+ ) : ( +

No submissions yet.

+ )} +
+ +
+ {selectedSubmission ? ( +
+
+

{selectedSubmission.subject}

+ + {selectedSubmission.status} + +
+

+ {selectedSubmission.email} · {selectedSubmission.phone || "No phone"} +

+

{selectedSubmission.message}

+ +
+ + + + +
+ +
+

Notes

+
+